From 11d36073b70f94621d46abe248702fc6f232362b Mon Sep 17 00:00:00 2001 From: Simon Walker Date: Fri, 8 Apr 2022 20:45:26 +0100 Subject: [PATCH] Fetch latest specification --- ...loudFormationResourceSpecification.json.gz | Bin 374073 -> 458969 bytes generator/src/codegen/mod.rs | 263 +- src/aws/acmpca.rs | 428 + src/aws/amplifyuibuilder.rs | 2013 ++ src/aws/apigateway.rs | 93 +- src/aws/apigatewayv2.rs | 13 + src/aws/appconfig.rs | 13 + src/aws/appflow.rs | 769 + src/aws/appintegrations.rs | 212 + src/aws/applicationinsights.rs | 176 + src/aws/appmesh.rs | 45 + src/aws/apprunner.rs | 243 + src/aws/appstream.rs | 1068 +- src/aws/appsync.rs | 401 +- src/aws/aps.rs | 216 + src/aws/athena.rs | 115 +- src/aws/autoscaling.rs | 3082 ++- src/aws/backup.rs | 500 + src/aws/batch.rs | 473 +- src/aws/billingconductor.rs | 854 + src/aws/budgets.rs | 8 +- src/aws/cassandra.rs | 90 + src/aws/ce.rs | 13 + src/aws/chatbot.rs | 26 + src/aws/cloudformation.rs | 415 + src/aws/cloudfront.rs | 1202 +- src/aws/cloudtrail.rs | 92 + src/aws/cloudwatch.rs | 530 +- src/aws/codebuild.rs | 39 + src/aws/codedeploy.rs | 171 + src/aws/codestarnotifications.rs | 55 +- src/aws/cognito.rs | 13 + src/aws/config.rs | 192 + src/aws/connect.rs | 1129 +- src/aws/customerprofiles.rs | 83 +- src/aws/databrew.rs | 1530 +- src/aws/datasync.rs | 856 +- src/aws/devopsguru.rs | 79 + src/aws/dlm.rs | 167 + src/aws/dms.rs | 2315 +- src/aws/docdb.rs | 42 +- src/aws/dynamodb.rs | 26 + src/aws/ec2.rs | 18692 ++++++++++------ src/aws/ecr.rs | 166 + src/aws/ecs.rs | 151 +- src/aws/efs.rs | 21 +- src/aws/eks.rs | 611 +- src/aws/elasticache.rs | 109 +- src/aws/elasticloadbalancingv2.rs | 13 + src/aws/elasticsearch.rs | 66 + src/aws/emr.rs | 86 +- src/aws/events.rs | 1870 +- src/aws/eventschemas.rs | 13 + src/aws/evidently.rs | 1558 ++ src/aws/finspace.rs | 105 + src/aws/fis.rs | 103 + src/aws/fms.rs | 13 + src/aws/forecast.rs | 262 + src/aws/fsx.rs | 2752 ++- src/aws/gamelift.rs | 52 + src/aws/glue.rs | 372 +- src/aws/guardduty.rs | 119 + src/aws/healthlake.rs | 299 + src/aws/imagebuilder.rs | 316 +- src/aws/inspectorv2.rs | 1014 + src/aws/iot.rs | 780 + src/aws/iotanalytics.rs | 384 +- src/aws/iotevents.rs | 1724 ++ src/aws/iotsitewise.rs | 98 +- src/aws/iotwireless.rs | 490 + src/aws/ivs.rs | 77 + src/aws/kafkaconnect.rs | 1322 ++ src/aws/kendra.rs | 1313 +- src/aws/kinesis.rs | 72 +- src/aws/kinesisanalyticsv2.rs | 36 +- src/aws/kinesisfirehose.rs | 414 + src/aws/kinesisvideo.rs | 261 + src/aws/lambda.rs | 474 +- src/aws/lex.rs | 5405 +++++ src/aws/lightsail.rs | 3967 ++++ src/aws/location.rs | 53 +- src/aws/logs.rs | 100 + src/aws/lookoutequipment.rs | 173 + src/aws/lookoutmetrics.rs | 253 +- src/aws/mediaconnect.rs | 55 +- src/aws/medialive.rs | 461 +- src/aws/mediapackage.rs | 75 + src/aws/mediatailor.rs | 695 + src/aws/memorydb.rs | 881 + src/aws/mod.rs | 24 + src/aws/msk.rs | 552 +- src/aws/mwaa.rs | 36 +- src/aws/networkfirewall.rs | 158 + src/aws/nimblestudio.rs | 158 + src/aws/opensearchservice.rs | 1239 + src/aws/panorama.rs | 528 + src/aws/personalize.rs | 708 + src/aws/pinpoint.rs | 2231 +- src/aws/quicksight.rs | 101 +- src/aws/redshift.rs | 1372 +- src/aws/refactorspaces.rs | 859 + src/aws/rekognition.rs | 166 + src/aws/resiliencehub.rs | 521 + src/aws/robomaker.rs | 106 +- src/aws/route53.rs | 21 +- src/aws/route53recoverycontrol.rs | 715 + src/aws/route53recoveryreadiness.rs | 804 + src/aws/route53resolver.rs | 87 + src/aws/rum.rs | 288 + src/aws/s3.rs | 620 +- src/aws/s3objectlambda.rs | 30 +- src/aws/s3outposts.rs | 26 + src/aws/sagemaker.rs | 1035 +- src/aws/secretsmanager.rs | 65 + src/aws/ses.rs | 8 +- src/aws/sqs.rs | 43 +- src/aws/ssm.rs | 107 +- src/aws/stepfunctions.rs | 4 +- src/aws/synthetics.rs | 273 + src/aws/timestream.rs | 961 + src/aws/transfer.rs | 406 +- src/aws/wafv2.rs | 967 +- src/aws/wisdom.rs | 727 + tests/batch.rs | 148 +- 124 files changed, 74689 insertions(+), 9781 deletions(-) create mode 100644 src/aws/amplifyuibuilder.rs create mode 100644 src/aws/aps.rs create mode 100644 src/aws/billingconductor.rs create mode 100644 src/aws/evidently.rs create mode 100644 src/aws/forecast.rs create mode 100644 src/aws/healthlake.rs create mode 100644 src/aws/inspectorv2.rs create mode 100644 src/aws/kafkaconnect.rs create mode 100644 src/aws/kinesisvideo.rs create mode 100644 src/aws/lex.rs create mode 100644 src/aws/lightsail.rs create mode 100644 src/aws/lookoutequipment.rs create mode 100644 src/aws/mediatailor.rs create mode 100644 src/aws/memorydb.rs create mode 100644 src/aws/opensearchservice.rs create mode 100644 src/aws/panorama.rs create mode 100644 src/aws/personalize.rs create mode 100644 src/aws/refactorspaces.rs create mode 100644 src/aws/rekognition.rs create mode 100644 src/aws/resiliencehub.rs create mode 100644 src/aws/route53recoverycontrol.rs create mode 100644 src/aws/route53recoveryreadiness.rs create mode 100644 src/aws/rum.rs create mode 100644 src/aws/wisdom.rs diff --git a/generator/CloudFormationResourceSpecification.json.gz b/generator/CloudFormationResourceSpecification.json.gz index 0282efa10ec7c4111b19b8cc13e395f80cf2faa7..8405a2296d16ec6f3f4ec96c9e6164e6666ac4f8 100644 GIT binary patch literal 458969 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≷z@)qiI6W| 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෎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

;S11x^@o7h%Bt_;iL9RR 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�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�V<_p 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�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 VUsD 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

E}0l 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�uFrX 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 BCguPD diff --git a/generator/src/codegen/mod.rs b/generator/src/codegen/mod.rs index 69e101b..54cbf96 100644 --- a/generator/src/codegen/mod.rs +++ b/generator/src/codegen/mod.rs @@ -3,7 +3,7 @@ use std::io::{self, Write}; use std::path::Path; use heck::SnakeCase; -use itertools::{Itertools, EitherOrBoth, merge_join_by}; +use itertools::{merge_join_by, EitherOrBoth, Itertools}; use model::*; @@ -11,67 +11,108 @@ mod printer; use self::printer::Printer; mod serde; -use self::serde::{ - generate_serialize, - generate_deserialize, - generate_deserialize_value -}; +use self::serde::{generate_deserialize, generate_deserialize_value, generate_serialize}; pub fn generate>(spec: Specification, base_path: P) -> io::Result<()> { - let resource_groups = spec.resource_types.into_iter().filter_map(|(res_name, res_spec)| { - if res_name.starts_with("AWS::") { - let split = res_name[5..].split("::").collect::>(); - assert!(split.len() == 2); - Some((split[0].to_owned(), split[1].to_owned(), res_spec)) - } else { - None - } - }).group_by(|&(ref service_name, _, _)| service_name.to_owned()); - - let property_groups = spec.property_types.into_iter().flatten().filter_map(|(prop_name, prop_spec)| { - if prop_name.starts_with("AWS::") { - let split = prop_name[5..].split("::").collect::>(); - assert!(split.len() == 2); - let split2 = split[1].split(".").collect::>(); - assert!(split2.len() == 2); - Some((split[0].to_owned(), split2[0].to_owned(), split2[1].to_owned(), prop_spec)) - } else { - None - } - }).group_by(|&(ref service_name, _, _, _)| service_name.to_owned()); + let resource_groups = spec + .resource_types + .into_iter() + .filter_map(|(res_name, res_spec)| { + if res_name.starts_with("AWS::") { + let split = res_name[5..].split("::").collect::>(); + assert!(split.len() == 2); + Some((split[0].to_owned(), split[1].to_owned(), res_spec)) + } else { + None + } + }) + .group_by(|&(ref service_name, _, _)| service_name.to_owned()); + + let property_groups = spec + .property_types + .into_iter() + .flatten() + .filter_map(|(prop_name, prop_spec)| { + if prop_name.starts_with("AWS::") { + let split = prop_name[5..].split("::").collect::>(); + assert!(split.len() == 2); + let split2 = split[1].split(".").collect::>(); + assert!(split2.len() == 2); + Some(( + split[0].to_owned(), + split2[0].to_owned(), + split2[1].to_owned(), + prop_spec, + )) + } else { + None + } + }) + .group_by(|&(ref service_name, _, _, _)| service_name.to_owned()); - let groups = merge_join_by(resource_groups.into_iter(), property_groups.into_iter(), - |&(ref service_name_left, _), &(ref service_name_right, _)| service_name_left.cmp(service_name_right)); + let groups = merge_join_by( + resource_groups.into_iter(), + property_groups.into_iter(), + |&(ref service_name_left, _), &(ref service_name_right, _)| { + service_name_left.cmp(service_name_right) + }, + ); let mut services = Vec::new(); let mut resources = Vec::new(); for joined_specs in groups { - let (service_name, resource_specs_opt, property_specs_opt) = factor_joined_specs(joined_specs); + let (service_name, resource_specs_opt, property_specs_opt) = + factor_joined_specs(joined_specs); services.push(service_name.to_owned()); - let file_path = base_path.as_ref().join(format!("{}.rs", service_name.to_lowercase())); + let file_path = base_path + .as_ref() + .join(format!("{}.rs", service_name.to_lowercase())); let file = File::create(file_path)?; let mut printer = Printer::new(file); - printer.line(format_args!("//! Types for the `{}` service.", service_name))?; + printer.line(format_args!( + "//! Types for the `{}` service.", + service_name + ))?; if let Some(resource_specs) = resource_specs_opt { for (_, resource_name, resource_spec) in resource_specs { resources.push((service_name.to_owned(), resource_name.to_owned())); - generate_resource_declaration(&service_name, &resource_name, &resource_spec, &mut printer)?; + generate_resource_declaration( + &service_name, + &resource_name, + &resource_spec, + &mut printer, + )?; } } if let Some(property_specs) = property_specs_opt { - let properties_by_resource = property_specs.group_by(|&(_, ref resource_name, _, _)| resource_name.to_owned()); + let properties_by_resource = + property_specs.group_by(|&(_, ref resource_name, _, _)| resource_name.to_owned()); for (resource_name, resource_property_specs) in properties_by_resource.into_iter() { printer.newline()?; - printer.block(format_args!("pub mod {}", resource_name.to_snake_case()), |p| { - p.line(format_args!("//! Property types for the `{}` resource.", resource_name))?; - for (_, resource_name, property_name, property_spec) in resource_property_specs { - generate_property_declaration(&service_name, &resource_name, &property_name, &property_spec, p)?; - } - Ok(()) - })? + printer.block( + format_args!("pub mod {}", resource_name.to_snake_case()), + |p| { + p.line(format_args!( + "//! Property types for the `{}` resource.", + resource_name + ))?; + for (_, resource_name, property_name, property_spec) in + resource_property_specs + { + generate_property_declaration( + &service_name, + &resource_name, + &property_name, + &property_spec, + p, + )?; + } + Ok(()) + }, + )? } } } @@ -79,7 +120,10 @@ pub fn generate>(spec: Specification, base_path: P) -> io::Result { let mod_file_path = base_path.as_ref().join("mod.rs"); let mut mod_file = File::create(mod_file_path)?; - write!(mod_file, "//! Types for CloudFormation resources and their properties.\n")?; + write!( + mod_file, + "//! Types for CloudFormation resources and their properties.\n" + )?; for service_name in services { writeln!(mod_file, "pub mod {};", service_name.to_lowercase())?; } @@ -92,13 +136,22 @@ fn factor_joined_specs(either: EitherOrBoth<(X, A), (X, B)>) -> (X, Opt match either { EitherOrBoth::Left((key, left)) => (key, Some(left), None), EitherOrBoth::Right((key, right)) => (key, None, Some(right)), - EitherOrBoth::Both((key, left), (_, right)) => (key, Some(left), Some(right)) + EitherOrBoth::Both((key, left), (_, right)) => (key, Some(left), Some(right)), } } -fn generate_property_declaration(service: &str, resource_name: &str, name: &str, spec: &PropertyType, p: &mut Printer) -> io::Result<()> { +fn generate_property_declaration( + service: &str, + resource_name: &str, + name: &str, + spec: &PropertyType, + p: &mut Printer, +) -> io::Result<()> { p.newline()?; - p.line(format_args!("/// The [`AWS::{}::{}.{}`]({}) property type.", service, resource_name, name, spec.documentation))?; + p.line(format_args!( + "/// The [`AWS::{}::{}.{}`]({}) property type.", + service, resource_name, name, spec.documentation + ))?; p.line(format_args!("#[derive(Debug, Default)]"))?; p.block(format_args!("pub struct {}", name), |p| { for (ref property_name, ref property_spec) in spec.properties.iter() { @@ -116,11 +169,19 @@ fn generate_property_declaration(service: &str, resource_name: &str, name: &str, Ok(()) } -fn generate_resource_declaration(service: &str, name: &str, spec: &ResourceType, p: &mut Printer) -> io::Result<()> { +fn generate_resource_declaration( + service: &str, + name: &str, + spec: &ResourceType, + p: &mut Printer, +) -> io::Result<()> { let namespace = name.to_snake_case(); p.newline()?; - p.line(format_args!("/// The [`AWS::{}::{}`]({}) resource type.", service, name, spec.documentation))?; + p.line(format_args!( + "/// The [`AWS::{}::{}`]({}) resource type.", + service, name, spec.documentation + ))?; p.line(format_args!("#[derive(Debug, Default)]"))?; p.block(format_args!("pub struct {}", name), |p| { p.line(format_args!("properties: {}Properties", name)) @@ -137,19 +198,38 @@ fn generate_resource_declaration(service: &str, name: &str, spec: &ResourceType, })?; p.newline()?; - generate_serialize("::serde::Serialize", &format!("{}Properties", name), &spec.properties, p)?; + generate_serialize( + "::serde::Serialize", + &format!("{}Properties", name), + &spec.properties, + p, + )?; p.newline()?; - generate_deserialize(&format!("{}Properties", name), Some(&namespace), &spec.properties, p)?; + generate_deserialize( + &format!("{}Properties", name), + Some(&namespace), + &spec.properties, + p, + )?; p.newline()?; p.block(format_args!("impl ::Resource for {}", name), |p| { p.line(format_args!("type Properties = {}Properties;", name))?; - p.line(format_args!("const TYPE: &'static str = \"AWS::{}::{}\";", service, name))?; - p.line(format_args!("fn properties(&self) -> &{}Properties {{", name))?; + p.line(format_args!( + "const TYPE: &'static str = \"AWS::{}::{}\";", + service, name + ))?; + p.line(format_args!( + "fn properties(&self) -> &{}Properties {{", + name + ))?; p.line(format_args!(" &self.properties"))?; p.line(format_args!("}}"))?; - p.line(format_args!("fn properties_mut(&mut self) -> &mut {}Properties {{", name))?; + p.line(format_args!( + "fn properties_mut(&mut self) -> &mut {}Properties {{", + name + ))?; p.line(format_args!(" &mut self.properties"))?; p.line(format_args!("}}")) })?; @@ -158,19 +238,33 @@ fn generate_resource_declaration(service: &str, name: &str, spec: &ResourceType, p.line(format_args!("impl ::private::Sealed for {} {{}}", name))?; p.newline()?; - p.block(format_args!("impl From<{}Properties> for {}", name, name), |p| { - p.line(format_args!("fn from(properties: {}Properties) -> {} {{", name, name))?; - p.line(format_args!(" {} {{ properties }}", name))?; - p.line(format_args!("}}")) - })?; + p.block( + format_args!("impl From<{}Properties> for {}", name, name), + |p| { + p.line(format_args!( + "fn from(properties: {}Properties) -> {} {{", + name, name + ))?; + p.line(format_args!(" {} {{ properties }}", name))?; + p.line(format_args!("}}")) + }, + )?; Ok(()) } -fn generate_field(namespace_opt: Option<&str>, name: &str, spec: &PropertySpecification, p: &mut Printer) -> io::Result<()> { +fn generate_field( + namespace_opt: Option<&str>, + name: &str, + spec: &PropertySpecification, + p: &mut Printer, +) -> io::Result<()> { let field_name = mutate_field_name(name); - p.line(format_args!("/// Property [`{}`]({}).", name, spec.documentation))?; + p.line(format_args!( + "/// Property [`{}`]({}).", + name, spec.documentation + ))?; if let Some(update_type) = spec.update_type { p.line(format_args!("///"))?; @@ -178,23 +272,35 @@ fn generate_field(namespace_opt: Option<&str>, name: &str, spec: &PropertySpecif UpdateType::Mutable => { p.line(format_args!("/// Update type: _Mutable_."))?; p.line(format_args!("/// AWS CloudFormation doesn't replace the resource when you change this property."))?; - }, + } UpdateType::Immutable => { p.line(format_args!("/// Update type: _Immutable_."))?; - p.line(format_args!("/// AWS CloudFormation replaces the resource when you change this property."))?; - }, + p.line(format_args!( + "/// AWS CloudFormation replaces the resource when you change this property." + ))?; + } UpdateType::Conditional => { p.line(format_args!("/// Update type: _Conditional_."))?; p.line(format_args!("/// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated."))?; - p.line(format_args!("/// For more information, see the relevant resource type documentation."))?; + p.line(format_args!( + "/// For more information, see the relevant resource type documentation." + ))?; } } } if spec.required.unwrap_or(true) { - p.line(format_args!("pub {}: {},", field_name, generate_field_type(namespace_opt, spec)))?; + p.line(format_args!( + "pub {}: {},", + field_name, + generate_field_type(namespace_opt, spec) + ))?; } else { - p.line(format_args!("pub {}: Option<{}>,", field_name, generate_field_type(namespace_opt, spec)))?; + p.line(format_args!( + "pub {}: Option<{}>,", + field_name, + generate_field_type(namespace_opt, spec) + ))?; } Ok(()) @@ -206,21 +312,28 @@ fn generate_field_type(namespace_opt: Option<&str>, spec: &PropertySpecification if let Some(ref item_type) = spec.item_type { format!("::ValueList<{}>", generate_type(namespace_opt, item_type)) } else { - format!("::ValueList<{}>", - generate_primitive_type(spec.primitive_item_type.as_ref().unwrap())) + format!( + "::ValueList<{}>", + generate_primitive_type(spec.primitive_item_type.as_ref().unwrap()) + ) } } else if type_name == "Map" { if let Some(ref item_type) = spec.item_type { format!("::ValueMap<{}>", generate_type(namespace_opt, item_type)) } else { - format!("::ValueMap<{}>", - generate_primitive_type(spec.primitive_item_type.as_ref().unwrap())) + format!( + "::ValueMap<{}>", + generate_primitive_type(spec.primitive_item_type.as_ref().unwrap()) + ) } } else { format!("::Value<{}>", generate_type(namespace_opt, type_name)) } } else { - format!("::Value<{}>", generate_primitive_type(spec.primitive_type.as_ref().unwrap())) + format!( + "::Value<{}>", + generate_primitive_type(spec.primitive_type.as_ref().unwrap()) + ) } } @@ -229,10 +342,12 @@ fn mutate_field_name(name: &str) -> String { if field_name == "type" { field_name = "r#type".into(); - } - - if field_name == "match" { + } else if field_name == "match" { field_name = "r#match".into(); + } else if field_name == "override" { + field_name = "r#override".into(); + } else if field_name == "else" { + field_name = "r#else".into(); } field_name @@ -256,6 +371,6 @@ fn generate_primitive_type(primitive_type: &PrimitiveType) -> &str { &PrimitiveType::Double => "f64", &PrimitiveType::Boolean => "bool", &PrimitiveType::Timestamp => "String", - &PrimitiveType::Json => "::json::Value" + &PrimitiveType::Json => "::json::Value", } } diff --git a/src/aws/acmpca.rs b/src/aws/acmpca.rs index 0d388fe..8b49d9a 100644 --- a/src/aws/acmpca.rs +++ b/src/aws/acmpca.rs @@ -422,6 +422,117 @@ impl From for CertificateAuthorityActi } } +/// The [`AWS::ACMPCA::Permission`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-permission.html) resource type. +#[derive(Debug, Default)] +pub struct Permission { + properties: PermissionProperties +} + +/// Properties for the `Permission` resource. +#[derive(Debug, Default)] +pub struct PermissionProperties { + /// Property [`Actions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-permission.html#cfn-acmpca-permission-actions). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub actions: ::ValueList, + /// Property [`CertificateAuthorityArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-permission.html#cfn-acmpca-permission-certificateauthorityarn). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub certificate_authority_arn: ::Value, + /// Property [`Principal`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-permission.html#cfn-acmpca-permission-principal). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub principal: ::Value, + /// Property [`SourceAccount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-acmpca-permission.html#cfn-acmpca-permission-sourceaccount). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub source_account: Option<::Value>, +} + +impl ::serde::Serialize for PermissionProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Actions", &self.actions)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CertificateAuthorityArn", &self.certificate_authority_arn)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Principal", &self.principal)?; + if let Some(ref source_account) = self.source_account { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourceAccount", source_account)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for PermissionProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = PermissionProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type PermissionProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut actions: Option<::ValueList> = None; + let mut certificate_authority_arn: Option<::Value> = None; + let mut principal: Option<::Value> = None; + let mut source_account: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Actions" => { + actions = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CertificateAuthorityArn" => { + certificate_authority_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Principal" => { + principal = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SourceAccount" => { + source_account = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(PermissionProperties { + actions: actions.ok_or(::serde::de::Error::missing_field("Actions"))?, + certificate_authority_arn: certificate_authority_arn.ok_or(::serde::de::Error::missing_field("CertificateAuthorityArn"))?, + principal: principal.ok_or(::serde::de::Error::missing_field("Principal"))?, + source_account: source_account, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for Permission { + type Properties = PermissionProperties; + const TYPE: &'static str = "AWS::ACMPCA::Permission"; + fn properties(&self) -> &PermissionProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut PermissionProperties { + &mut self.properties + } +} + +impl ::private::Sealed for Permission {} + +impl From for Permission { + fn from(properties: PermissionProperties) -> Permission { + Permission { properties } + } +} + pub mod certificate { //! Property types for the `Certificate` resource. @@ -491,6 +602,143 @@ pub mod certificate { } } + /// The [`AWS::ACMPCA::Certificate.CustomAttribute`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-customattribute.html) property type. + #[derive(Debug, Default)] + pub struct CustomAttribute { + /// Property [`ObjectIdentifier`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-customattribute.html#cfn-acmpca-certificate-customattribute-objectidentifier). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub object_identifier: ::Value, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-customattribute.html#cfn-acmpca-certificate-customattribute-value). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub value: ::Value, + } + + impl ::codec::SerializeValue for CustomAttribute { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ObjectIdentifier", &self.object_identifier)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", &self.value)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CustomAttribute { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CustomAttribute; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CustomAttribute") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut object_identifier: Option<::Value> = None; + let mut value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ObjectIdentifier" => { + object_identifier = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CustomAttribute { + object_identifier: object_identifier.ok_or(::serde::de::Error::missing_field("ObjectIdentifier"))?, + value: value.ok_or(::serde::de::Error::missing_field("Value"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::ACMPCA::Certificate.CustomExtension`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-customextension.html) property type. + #[derive(Debug, Default)] + pub struct CustomExtension { + /// Property [`Critical`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-customextension.html#cfn-acmpca-certificate-customextension-critical). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub critical: Option<::Value>, + /// Property [`ObjectIdentifier`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-customextension.html#cfn-acmpca-certificate-customextension-objectidentifier). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub object_identifier: ::Value, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-customextension.html#cfn-acmpca-certificate-customextension-value). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub value: ::Value, + } + + impl ::codec::SerializeValue for CustomExtension { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref critical) = self.critical { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Critical", critical)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ObjectIdentifier", &self.object_identifier)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", &self.value)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CustomExtension { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CustomExtension; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CustomExtension") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut critical: Option<::Value> = None; + let mut object_identifier: Option<::Value> = None; + let mut value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Critical" => { + critical = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ObjectIdentifier" => { + object_identifier = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CustomExtension { + critical: critical, + object_identifier: object_identifier.ok_or(::serde::de::Error::missing_field("ObjectIdentifier"))?, + value: value.ok_or(::serde::de::Error::missing_field("Value"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::ACMPCA::Certificate.EdiPartyName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-edipartyname.html) property type. #[derive(Debug, Default)] pub struct EdiPartyName { @@ -627,6 +875,11 @@ pub mod certificate { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub certificate_policies: Option<::ValueList>, + /// Property [`CustomExtensions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-extensions.html#cfn-acmpca-certificate-extensions-customextensions). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub custom_extensions: Option<::ValueList>, /// Property [`ExtendedKeyUsage`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-extensions.html#cfn-acmpca-certificate-extensions-extendedkeyusage). /// /// Update type: _Immutable_. @@ -650,6 +903,9 @@ pub mod certificate { if let Some(ref certificate_policies) = self.certificate_policies { ::serde::ser::SerializeMap::serialize_entry(&mut map, "CertificatePolicies", certificate_policies)?; } + if let Some(ref custom_extensions) = self.custom_extensions { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CustomExtensions", custom_extensions)?; + } if let Some(ref extended_key_usage) = self.extended_key_usage { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExtendedKeyUsage", extended_key_usage)?; } @@ -676,6 +932,7 @@ pub mod certificate { fn visit_map>(self, mut map: A) -> Result { let mut certificate_policies: Option<::ValueList> = None; + let mut custom_extensions: Option<::ValueList> = None; let mut extended_key_usage: Option<::ValueList> = None; let mut key_usage: Option<::Value> = None; let mut subject_alternative_names: Option<::ValueList> = None; @@ -685,6 +942,9 @@ pub mod certificate { "CertificatePolicies" => { certificate_policies = ::serde::de::MapAccess::next_value(&mut map)?; } + "CustomExtensions" => { + custom_extensions = ::serde::de::MapAccess::next_value(&mut map)?; + } "ExtendedKeyUsage" => { extended_key_usage = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -700,6 +960,7 @@ pub mod certificate { Ok(Extensions { certificate_policies: certificate_policies, + custom_extensions: custom_extensions, extended_key_usage: extended_key_usage, key_usage: key_usage, subject_alternative_names: subject_alternative_names, @@ -1264,6 +1525,11 @@ pub mod certificate { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub country: Option<::Value>, + /// Property [`CustomAttributes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-subject.html#cfn-acmpca-certificate-subject-customattributes). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub custom_attributes: Option<::ValueList>, /// Property [`DistinguishedNameQualifier`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificate-subject.html#cfn-acmpca-certificate-subject-distinguishednamequalifier). /// /// Update type: _Immutable_. @@ -1335,6 +1601,9 @@ pub mod certificate { if let Some(ref country) = self.country { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Country", country)?; } + if let Some(ref custom_attributes) = self.custom_attributes { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CustomAttributes", custom_attributes)?; + } if let Some(ref distinguished_name_qualifier) = self.distinguished_name_qualifier { ::serde::ser::SerializeMap::serialize_entry(&mut map, "DistinguishedNameQualifier", distinguished_name_qualifier)?; } @@ -1389,6 +1658,7 @@ pub mod certificate { fn visit_map>(self, mut map: A) -> Result { let mut common_name: Option<::Value> = None; let mut country: Option<::Value> = None; + let mut custom_attributes: Option<::ValueList> = None; let mut distinguished_name_qualifier: Option<::Value> = None; let mut generation_qualifier: Option<::Value> = None; let mut given_name: Option<::Value> = None; @@ -1410,6 +1680,9 @@ pub mod certificate { "Country" => { country = ::serde::de::MapAccess::next_value(&mut map)?; } + "CustomAttributes" => { + custom_attributes = ::serde::de::MapAccess::next_value(&mut map)?; + } "DistinguishedNameQualifier" => { distinguished_name_qualifier = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1453,6 +1726,7 @@ pub mod certificate { Ok(Subject { common_name: common_name, country: country, + custom_attributes: custom_attributes, distinguished_name_qualifier: distinguished_name_qualifier, generation_qualifier: generation_qualifier, given_name: given_name, @@ -1838,6 +2112,68 @@ pub mod certificate_authority { } } + /// The [`AWS::ACMPCA::CertificateAuthority.CustomAttribute`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-customattribute.html) property type. + #[derive(Debug, Default)] + pub struct CustomAttribute { + /// Property [`ObjectIdentifier`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-customattribute.html#cfn-acmpca-certificateauthority-customattribute-objectidentifier). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub object_identifier: ::Value, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-customattribute.html#cfn-acmpca-certificateauthority-customattribute-value). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub value: ::Value, + } + + impl ::codec::SerializeValue for CustomAttribute { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ObjectIdentifier", &self.object_identifier)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", &self.value)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CustomAttribute { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CustomAttribute; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CustomAttribute") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut object_identifier: Option<::Value> = None; + let mut value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ObjectIdentifier" => { + object_identifier = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CustomAttribute { + object_identifier: object_identifier.ok_or(::serde::de::Error::missing_field("ObjectIdentifier"))?, + value: value.ok_or(::serde::de::Error::missing_field("Value"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::ACMPCA::CertificateAuthority.EdiPartyName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-edipartyname.html) property type. #[derive(Debug, Default)] pub struct EdiPartyName { @@ -2201,6 +2537,72 @@ pub mod certificate_authority { } } + /// The [`AWS::ACMPCA::CertificateAuthority.OcspConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-ocspconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct OcspConfiguration { + /// Property [`Enabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-ocspconfiguration.html#cfn-acmpca-certificateauthority-ocspconfiguration-enabled). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enabled: Option<::Value>, + /// Property [`OcspCustomCname`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-ocspconfiguration.html#cfn-acmpca-certificateauthority-ocspconfiguration-ocspcustomcname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ocsp_custom_cname: Option<::Value>, + } + + impl ::codec::SerializeValue for OcspConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref enabled) = self.enabled { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Enabled", enabled)?; + } + if let Some(ref ocsp_custom_cname) = self.ocsp_custom_cname { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OcspCustomCname", ocsp_custom_cname)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for OcspConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = OcspConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type OcspConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut enabled: Option<::Value> = None; + let mut ocsp_custom_cname: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Enabled" => { + enabled = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OcspCustomCname" => { + ocsp_custom_cname = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(OcspConfiguration { + enabled: enabled, + ocsp_custom_cname: ocsp_custom_cname, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::ACMPCA::CertificateAuthority.OtherName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-othername.html) property type. #[derive(Debug, Default)] pub struct OtherName { @@ -2271,6 +2673,11 @@ pub mod certificate_authority { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub crl_configuration: Option<::Value>, + /// Property [`OcspConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-revocationconfiguration.html#cfn-acmpca-certificateauthority-revocationconfiguration-ocspconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ocsp_configuration: Option<::Value>, } impl ::codec::SerializeValue for RevocationConfiguration { @@ -2279,6 +2686,9 @@ pub mod certificate_authority { if let Some(ref crl_configuration) = self.crl_configuration { ::serde::ser::SerializeMap::serialize_entry(&mut map, "CrlConfiguration", crl_configuration)?; } + if let Some(ref ocsp_configuration) = self.ocsp_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OcspConfiguration", ocsp_configuration)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -2296,18 +2706,23 @@ pub mod certificate_authority { fn visit_map>(self, mut map: A) -> Result { let mut crl_configuration: Option<::Value> = None; + let mut ocsp_configuration: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { "CrlConfiguration" => { crl_configuration = ::serde::de::MapAccess::next_value(&mut map)?; } + "OcspConfiguration" => { + ocsp_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } Ok(RevocationConfiguration { crl_configuration: crl_configuration, + ocsp_configuration: ocsp_configuration, }) } } @@ -2329,6 +2744,11 @@ pub mod certificate_authority { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub country: Option<::Value>, + /// Property [`CustomAttributes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-subject.html#cfn-acmpca-certificateauthority-subject-customattributes). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub custom_attributes: Option<::ValueList>, /// Property [`DistinguishedNameQualifier`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-acmpca-certificateauthority-subject.html#cfn-acmpca-certificateauthority-subject-distinguishednamequalifier). /// /// Update type: _Immutable_. @@ -2400,6 +2820,9 @@ pub mod certificate_authority { if let Some(ref country) = self.country { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Country", country)?; } + if let Some(ref custom_attributes) = self.custom_attributes { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CustomAttributes", custom_attributes)?; + } if let Some(ref distinguished_name_qualifier) = self.distinguished_name_qualifier { ::serde::ser::SerializeMap::serialize_entry(&mut map, "DistinguishedNameQualifier", distinguished_name_qualifier)?; } @@ -2454,6 +2877,7 @@ pub mod certificate_authority { fn visit_map>(self, mut map: A) -> Result { let mut common_name: Option<::Value> = None; let mut country: Option<::Value> = None; + let mut custom_attributes: Option<::ValueList> = None; let mut distinguished_name_qualifier: Option<::Value> = None; let mut generation_qualifier: Option<::Value> = None; let mut given_name: Option<::Value> = None; @@ -2475,6 +2899,9 @@ pub mod certificate_authority { "Country" => { country = ::serde::de::MapAccess::next_value(&mut map)?; } + "CustomAttributes" => { + custom_attributes = ::serde::de::MapAccess::next_value(&mut map)?; + } "DistinguishedNameQualifier" => { distinguished_name_qualifier = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -2518,6 +2945,7 @@ pub mod certificate_authority { Ok(Subject { common_name: common_name, country: country, + custom_attributes: custom_attributes, distinguished_name_qualifier: distinguished_name_qualifier, generation_qualifier: generation_qualifier, given_name: given_name, diff --git a/src/aws/amplifyuibuilder.rs b/src/aws/amplifyuibuilder.rs new file mode 100644 index 0000000..84e12ac --- /dev/null +++ b/src/aws/amplifyuibuilder.rs @@ -0,0 +1,2013 @@ +//! Types for the `AmplifyUIBuilder` service. + +/// The [`AWS::AmplifyUIBuilder::Component`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html) resource type. +#[derive(Debug, Default)] +pub struct Component { + properties: ComponentProperties +} + +/// Properties for the `Component` resource. +#[derive(Debug, Default)] +pub struct ComponentProperties { + /// Property [`BindingProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-bindingproperties). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub binding_properties: ::ValueMap, + /// Property [`Children`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-children). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub children: Option<::ValueList>, + /// Property [`CollectionProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-collectionproperties). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub collection_properties: Option<::ValueMap>, + /// Property [`ComponentType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-componenttype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub component_type: ::Value, + /// Property [`Events`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-events). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub events: Option<::ValueMap>, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: ::Value, + /// Property [`Overrides`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-overrides). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub overrides: ::ValueMap, + /// Property [`Properties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-properties). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub properties: ::ValueMap, + /// Property [`SchemaVersion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-schemaversion). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub schema_version: Option<::Value>, + /// Property [`SourceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-sourceid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub source_id: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-tags). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub tags: Option<::ValueMap>, + /// Property [`Variants`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-component.html#cfn-amplifyuibuilder-component-variants). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub variants: ::ValueList, +} + +impl ::serde::Serialize for ComponentProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BindingProperties", &self.binding_properties)?; + if let Some(ref children) = self.children { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Children", children)?; + } + if let Some(ref collection_properties) = self.collection_properties { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CollectionProperties", collection_properties)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ComponentType", &self.component_type)?; + if let Some(ref events) = self.events { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Events", events)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Overrides", &self.overrides)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Properties", &self.properties)?; + if let Some(ref schema_version) = self.schema_version { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SchemaVersion", schema_version)?; + } + if let Some(ref source_id) = self.source_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourceId", source_id)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Variants", &self.variants)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for ComponentProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ComponentProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ComponentProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut binding_properties: Option<::ValueMap> = None; + let mut children: Option<::ValueList> = None; + let mut collection_properties: Option<::ValueMap> = None; + let mut component_type: Option<::Value> = None; + let mut events: Option<::ValueMap> = None; + let mut name: Option<::Value> = None; + let mut overrides: Option<::ValueMap> = None; + let mut properties: Option<::ValueMap> = None; + let mut schema_version: Option<::Value> = None; + let mut source_id: Option<::Value> = None; + let mut tags: Option<::ValueMap> = None; + let mut variants: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "BindingProperties" => { + binding_properties = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Children" => { + children = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CollectionProperties" => { + collection_properties = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ComponentType" => { + component_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Events" => { + events = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Overrides" => { + overrides = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Properties" => { + properties = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SchemaVersion" => { + schema_version = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SourceId" => { + source_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Variants" => { + variants = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ComponentProperties { + binding_properties: binding_properties.ok_or(::serde::de::Error::missing_field("BindingProperties"))?, + children: children, + collection_properties: collection_properties, + component_type: component_type.ok_or(::serde::de::Error::missing_field("ComponentType"))?, + events: events, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + overrides: overrides.ok_or(::serde::de::Error::missing_field("Overrides"))?, + properties: properties.ok_or(::serde::de::Error::missing_field("Properties"))?, + schema_version: schema_version, + source_id: source_id, + tags: tags, + variants: variants.ok_or(::serde::de::Error::missing_field("Variants"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for Component { + type Properties = ComponentProperties; + const TYPE: &'static str = "AWS::AmplifyUIBuilder::Component"; + fn properties(&self) -> &ComponentProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut ComponentProperties { + &mut self.properties + } +} + +impl ::private::Sealed for Component {} + +impl From for Component { + fn from(properties: ComponentProperties) -> Component { + Component { properties } + } +} + +/// The [`AWS::AmplifyUIBuilder::Theme`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-theme.html) resource type. +#[derive(Debug, Default)] +pub struct Theme { + properties: ThemeProperties +} + +/// Properties for the `Theme` resource. +#[derive(Debug, Default)] +pub struct ThemeProperties { + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-theme.html#cfn-amplifyuibuilder-theme-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: ::Value, + /// Property [`Overrides`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-theme.html#cfn-amplifyuibuilder-theme-overrides). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub overrides: Option<::ValueList>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-theme.html#cfn-amplifyuibuilder-theme-tags). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub tags: Option<::ValueMap>, + /// Property [`Values`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-amplifyuibuilder-theme.html#cfn-amplifyuibuilder-theme-values). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub values: ::ValueList, +} + +impl ::serde::Serialize for ThemeProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + if let Some(ref overrides) = self.overrides { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Overrides", overrides)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Values", &self.values)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for ThemeProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ThemeProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ThemeProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut name: Option<::Value> = None; + let mut overrides: Option<::ValueList> = None; + let mut tags: Option<::ValueMap> = None; + let mut values: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Overrides" => { + overrides = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Values" => { + values = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ThemeProperties { + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + overrides: overrides, + tags: tags, + values: values.ok_or(::serde::de::Error::missing_field("Values"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for Theme { + type Properties = ThemeProperties; + const TYPE: &'static str = "AWS::AmplifyUIBuilder::Theme"; + fn properties(&self) -> &ThemeProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut ThemeProperties { + &mut self.properties + } +} + +impl ::private::Sealed for Theme {} + +impl From for Theme { + fn from(properties: ThemeProperties) -> Theme { + Theme { properties } + } +} + +pub mod component { + //! Property types for the `Component` resource. + + /// The [`AWS::AmplifyUIBuilder::Component.ActionParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-actionparameters.html) property type. + #[derive(Debug, Default)] + pub struct ActionParameters { + /// Property [`Anchor`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-actionparameters.html#cfn-amplifyuibuilder-component-actionparameters-anchor). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub anchor: Option<::Value>, + /// Property [`Fields`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-actionparameters.html#cfn-amplifyuibuilder-component-actionparameters-fields). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub fields: Option<::Value>, + /// Property [`Global`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-actionparameters.html#cfn-amplifyuibuilder-component-actionparameters-global). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub global: Option<::Value>, + /// Property [`Id`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-actionparameters.html#cfn-amplifyuibuilder-component-actionparameters-id). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub id: Option<::Value>, + /// Property [`Model`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-actionparameters.html#cfn-amplifyuibuilder-component-actionparameters-model). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub model: Option<::Value>, + /// Property [`State`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-actionparameters.html#cfn-amplifyuibuilder-component-actionparameters-state). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub state: Option<::Value>, + /// Property [`Target`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-actionparameters.html#cfn-amplifyuibuilder-component-actionparameters-target). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub target: Option<::Value>, + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-actionparameters.html#cfn-amplifyuibuilder-component-actionparameters-type). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#type: Option<::Value>, + /// Property [`Url`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-actionparameters.html#cfn-amplifyuibuilder-component-actionparameters-url). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub url: Option<::Value>, + } + + impl ::codec::SerializeValue for ActionParameters { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref anchor) = self.anchor { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Anchor", anchor)?; + } + if let Some(ref fields) = self.fields { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Fields", fields)?; + } + if let Some(ref global) = self.global { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Global", global)?; + } + if let Some(ref id) = self.id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Id", id)?; + } + if let Some(ref model) = self.model { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Model", model)?; + } + if let Some(ref state) = self.state { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "State", state)?; + } + if let Some(ref target) = self.target { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Target", target)?; + } + if let Some(ref r#type) = self.r#type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", r#type)?; + } + if let Some(ref url) = self.url { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Url", url)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ActionParameters { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ActionParameters; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ActionParameters") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut anchor: Option<::Value> = None; + let mut fields: Option<::Value> = None; + let mut global: Option<::Value> = None; + let mut id: Option<::Value> = None; + let mut model: Option<::Value> = None; + let mut state: Option<::Value> = None; + let mut target: Option<::Value> = None; + let mut r#type: Option<::Value> = None; + let mut url: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Anchor" => { + anchor = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Fields" => { + fields = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Global" => { + global = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Id" => { + id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Model" => { + model = ::serde::de::MapAccess::next_value(&mut map)?; + } + "State" => { + state = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Target" => { + target = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Url" => { + url = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ActionParameters { + anchor: anchor, + fields: fields, + global: global, + id: id, + model: model, + state: state, + target: target, + r#type: r#type, + url: url, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AmplifyUIBuilder::Component.ComponentBindingPropertiesValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalue.html) property type. + #[derive(Debug, Default)] + pub struct ComponentBindingPropertiesValue { + /// Property [`BindingProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalue.html#cfn-amplifyuibuilder-component-componentbindingpropertiesvalue-bindingproperties). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub binding_properties: Option<::Value>, + /// Property [`DefaultValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalue.html#cfn-amplifyuibuilder-component-componentbindingpropertiesvalue-defaultvalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub default_value: Option<::Value>, + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalue.html#cfn-amplifyuibuilder-component-componentbindingpropertiesvalue-type). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#type: Option<::Value>, + } + + impl ::codec::SerializeValue for ComponentBindingPropertiesValue { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref binding_properties) = self.binding_properties { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BindingProperties", binding_properties)?; + } + if let Some(ref default_value) = self.default_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DefaultValue", default_value)?; + } + if let Some(ref r#type) = self.r#type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", r#type)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ComponentBindingPropertiesValue { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ComponentBindingPropertiesValue; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ComponentBindingPropertiesValue") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut binding_properties: Option<::Value> = None; + let mut default_value: Option<::Value> = None; + let mut r#type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "BindingProperties" => { + binding_properties = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DefaultValue" => { + default_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ComponentBindingPropertiesValue { + binding_properties: binding_properties, + default_value: default_value, + r#type: r#type, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AmplifyUIBuilder::Component.ComponentBindingPropertiesValueProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalueproperties.html) property type. + #[derive(Debug, Default)] + pub struct ComponentBindingPropertiesValueProperties { + /// Property [`Bucket`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalueproperties.html#cfn-amplifyuibuilder-component-componentbindingpropertiesvalueproperties-bucket). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub bucket: Option<::Value>, + /// Property [`DefaultValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalueproperties.html#cfn-amplifyuibuilder-component-componentbindingpropertiesvalueproperties-defaultvalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub default_value: Option<::Value>, + /// Property [`Field`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalueproperties.html#cfn-amplifyuibuilder-component-componentbindingpropertiesvalueproperties-field). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub field: Option<::Value>, + /// Property [`Key`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalueproperties.html#cfn-amplifyuibuilder-component-componentbindingpropertiesvalueproperties-key). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub key: Option<::Value>, + /// Property [`Model`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalueproperties.html#cfn-amplifyuibuilder-component-componentbindingpropertiesvalueproperties-model). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub model: Option<::Value>, + /// Property [`Predicates`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalueproperties.html#cfn-amplifyuibuilder-component-componentbindingpropertiesvalueproperties-predicates). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub predicates: Option<::ValueList>, + /// Property [`UserAttribute`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentbindingpropertiesvalueproperties.html#cfn-amplifyuibuilder-component-componentbindingpropertiesvalueproperties-userattribute). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub user_attribute: Option<::Value>, + } + + impl ::codec::SerializeValue for ComponentBindingPropertiesValueProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref bucket) = self.bucket { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Bucket", bucket)?; + } + if let Some(ref default_value) = self.default_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DefaultValue", default_value)?; + } + if let Some(ref field) = self.field { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Field", field)?; + } + if let Some(ref key) = self.key { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Key", key)?; + } + if let Some(ref model) = self.model { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Model", model)?; + } + if let Some(ref predicates) = self.predicates { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Predicates", predicates)?; + } + if let Some(ref user_attribute) = self.user_attribute { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UserAttribute", user_attribute)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ComponentBindingPropertiesValueProperties { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ComponentBindingPropertiesValueProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ComponentBindingPropertiesValueProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut bucket: Option<::Value> = None; + let mut default_value: Option<::Value> = None; + let mut field: Option<::Value> = None; + let mut key: Option<::Value> = None; + let mut model: Option<::Value> = None; + let mut predicates: Option<::ValueList> = None; + let mut user_attribute: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Bucket" => { + bucket = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DefaultValue" => { + default_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Field" => { + field = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Key" => { + key = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Model" => { + model = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Predicates" => { + predicates = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UserAttribute" => { + user_attribute = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ComponentBindingPropertiesValueProperties { + bucket: bucket, + default_value: default_value, + field: field, + key: key, + model: model, + predicates: predicates, + user_attribute: user_attribute, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AmplifyUIBuilder::Component.ComponentChild`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentchild.html) property type. + #[derive(Debug, Default)] + pub struct ComponentChild { + /// Property [`Children`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentchild.html#cfn-amplifyuibuilder-component-componentchild-children). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub children: Option<::ValueList>, + /// Property [`ComponentType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentchild.html#cfn-amplifyuibuilder-component-componentchild-componenttype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub component_type: ::Value, + /// Property [`Events`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentchild.html#cfn-amplifyuibuilder-component-componentchild-events). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub events: Option<::Value>, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentchild.html#cfn-amplifyuibuilder-component-componentchild-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: ::Value, + /// Property [`Properties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentchild.html#cfn-amplifyuibuilder-component-componentchild-properties). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub properties: ::Value, + } + + impl ::codec::SerializeValue for ComponentChild { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref children) = self.children { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Children", children)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ComponentType", &self.component_type)?; + if let Some(ref events) = self.events { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Events", events)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Properties", &self.properties)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ComponentChild { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ComponentChild; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ComponentChild") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut children: Option<::ValueList> = None; + let mut component_type: Option<::Value> = None; + let mut events: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut properties: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Children" => { + children = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ComponentType" => { + component_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Events" => { + events = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Properties" => { + properties = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ComponentChild { + children: children, + component_type: component_type.ok_or(::serde::de::Error::missing_field("ComponentType"))?, + events: events, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + properties: properties.ok_or(::serde::de::Error::missing_field("Properties"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AmplifyUIBuilder::Component.ComponentConditionProperty`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentconditionproperty.html) property type. + #[derive(Debug, Default)] + pub struct ComponentConditionProperty { + /// Property [`Else`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentconditionproperty.html#cfn-amplifyuibuilder-component-componentconditionproperty-else). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#else: Option<::Value>, + /// Property [`Field`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentconditionproperty.html#cfn-amplifyuibuilder-component-componentconditionproperty-field). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub field: Option<::Value>, + /// Property [`Operand`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentconditionproperty.html#cfn-amplifyuibuilder-component-componentconditionproperty-operand). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub operand: Option<::Value>, + /// Property [`OperandType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentconditionproperty.html#cfn-amplifyuibuilder-component-componentconditionproperty-operandtype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub operand_type: Option<::Value>, + /// Property [`Operator`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentconditionproperty.html#cfn-amplifyuibuilder-component-componentconditionproperty-operator). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub operator: Option<::Value>, + /// Property [`Property`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentconditionproperty.html#cfn-amplifyuibuilder-component-componentconditionproperty-property). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub property: Option<::Value>, + /// Property [`Then`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentconditionproperty.html#cfn-amplifyuibuilder-component-componentconditionproperty-then). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub then: Option<::Value>, + } + + impl ::codec::SerializeValue for ComponentConditionProperty { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref r#else) = self.r#else { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Else", r#else)?; + } + if let Some(ref field) = self.field { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Field", field)?; + } + if let Some(ref operand) = self.operand { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Operand", operand)?; + } + if let Some(ref operand_type) = self.operand_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OperandType", operand_type)?; + } + if let Some(ref operator) = self.operator { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Operator", operator)?; + } + if let Some(ref property) = self.property { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Property", property)?; + } + if let Some(ref then) = self.then { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Then", then)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ComponentConditionProperty { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ComponentConditionProperty; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ComponentConditionProperty") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut r#else: Option<::Value> = None; + let mut field: Option<::Value> = None; + let mut operand: Option<::Value> = None; + let mut operand_type: Option<::Value> = None; + let mut operator: Option<::Value> = None; + let mut property: Option<::Value> = None; + let mut then: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Else" => { + r#else = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Field" => { + field = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Operand" => { + operand = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OperandType" => { + operand_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Operator" => { + operator = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Property" => { + property = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Then" => { + then = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ComponentConditionProperty { + r#else: r#else, + field: field, + operand: operand, + operand_type: operand_type, + operator: operator, + property: property, + then: then, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AmplifyUIBuilder::Component.ComponentDataConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentdataconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct ComponentDataConfiguration { + /// Property [`Identifiers`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentdataconfiguration.html#cfn-amplifyuibuilder-component-componentdataconfiguration-identifiers). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub identifiers: Option<::ValueList>, + /// Property [`Model`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentdataconfiguration.html#cfn-amplifyuibuilder-component-componentdataconfiguration-model). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub model: ::Value, + /// Property [`Predicate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentdataconfiguration.html#cfn-amplifyuibuilder-component-componentdataconfiguration-predicate). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub predicate: Option<::Value>, + /// Property [`Sort`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentdataconfiguration.html#cfn-amplifyuibuilder-component-componentdataconfiguration-sort). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub sort: Option<::ValueList>, + } + + impl ::codec::SerializeValue for ComponentDataConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref identifiers) = self.identifiers { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Identifiers", identifiers)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Model", &self.model)?; + if let Some(ref predicate) = self.predicate { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Predicate", predicate)?; + } + if let Some(ref sort) = self.sort { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Sort", sort)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ComponentDataConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ComponentDataConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ComponentDataConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut identifiers: Option<::ValueList> = None; + let mut model: Option<::Value> = None; + let mut predicate: Option<::Value> = None; + let mut sort: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Identifiers" => { + identifiers = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Model" => { + model = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Predicate" => { + predicate = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Sort" => { + sort = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ComponentDataConfiguration { + identifiers: identifiers, + model: model.ok_or(::serde::de::Error::missing_field("Model"))?, + predicate: predicate, + sort: sort, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AmplifyUIBuilder::Component.ComponentEvent`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentevent.html) property type. + #[derive(Debug, Default)] + pub struct ComponentEvent { + /// Property [`Action`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentevent.html#cfn-amplifyuibuilder-component-componentevent-action). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub action: Option<::Value>, + /// Property [`Parameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentevent.html#cfn-amplifyuibuilder-component-componentevent-parameters). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub parameters: Option<::Value>, + } + + impl ::codec::SerializeValue for ComponentEvent { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref action) = self.action { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Action", action)?; + } + if let Some(ref parameters) = self.parameters { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Parameters", parameters)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ComponentEvent { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ComponentEvent; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ComponentEvent") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut action: Option<::Value> = None; + let mut parameters: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Action" => { + action = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Parameters" => { + parameters = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ComponentEvent { + action: action, + parameters: parameters, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AmplifyUIBuilder::Component.ComponentEvents`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentevents.html) property type. + #[derive(Debug, Default)] + pub struct ComponentEvents { + } + + impl ::codec::SerializeValue for ComponentEvents { + fn serialize(&self, s: S) -> Result { + let map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ComponentEvents { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ComponentEvents; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ComponentEvents") + } + + fn visit_map>(self, _map: A) -> Result { + Ok(ComponentEvents {}) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AmplifyUIBuilder::Component.ComponentOverrides`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentoverrides.html) property type. + #[derive(Debug, Default)] + pub struct ComponentOverrides { + } + + impl ::codec::SerializeValue for ComponentOverrides { + fn serialize(&self, s: S) -> Result { + let map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ComponentOverrides { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ComponentOverrides; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ComponentOverrides") + } + + fn visit_map>(self, _map: A) -> Result { + Ok(ComponentOverrides {}) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AmplifyUIBuilder::Component.ComponentOverridesValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentoverridesvalue.html) property type. + #[derive(Debug, Default)] + pub struct ComponentOverridesValue { + } + + impl ::codec::SerializeValue for ComponentOverridesValue { + fn serialize(&self, s: S) -> Result { + let map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ComponentOverridesValue { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ComponentOverridesValue; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ComponentOverridesValue") + } + + fn visit_map>(self, _map: A) -> Result { + Ok(ComponentOverridesValue {}) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AmplifyUIBuilder::Component.ComponentProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperties.html) property type. + #[derive(Debug, Default)] + pub struct ComponentProperties { + } + + impl ::codec::SerializeValue for ComponentProperties { + fn serialize(&self, s: S) -> Result { + let map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ComponentProperties { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ComponentProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ComponentProperties") + } + + fn visit_map>(self, _map: A) -> Result { + Ok(ComponentProperties {}) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AmplifyUIBuilder::Component.ComponentProperty`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html) property type. + #[derive(Debug, Default)] + pub struct ComponentProperty { + /// Property [`BindingProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-bindingproperties). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub binding_properties: Option<::Value>, + /// Property [`Bindings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-bindings). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub bindings: Option<::Value>, + /// Property [`CollectionBindingProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-collectionbindingproperties). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub collection_binding_properties: Option<::Value>, + /// Property [`ComponentName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-componentname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub component_name: Option<::Value>, + /// Property [`Concat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-concat). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub concat: Option<::ValueList>, + /// Property [`Condition`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-condition). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub condition: Option<::Value>, + /// Property [`Configured`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-configured). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub configured: Option<::Value>, + /// Property [`DefaultValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-defaultvalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub default_value: Option<::Value>, + /// Property [`Event`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-event). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub event: Option<::Value>, + /// Property [`ImportedValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-importedvalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub imported_value: Option<::Value>, + /// Property [`Model`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-model). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub model: Option<::Value>, + /// Property [`Property`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-property). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub property: Option<::Value>, + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-type). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#type: Option<::Value>, + /// Property [`UserAttribute`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-userattribute). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub user_attribute: Option<::Value>, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentproperty.html#cfn-amplifyuibuilder-component-componentproperty-value). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub value: Option<::Value>, + } + + impl ::codec::SerializeValue for ComponentProperty { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref binding_properties) = self.binding_properties { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BindingProperties", binding_properties)?; + } + if let Some(ref bindings) = self.bindings { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Bindings", bindings)?; + } + if let Some(ref collection_binding_properties) = self.collection_binding_properties { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CollectionBindingProperties", collection_binding_properties)?; + } + if let Some(ref component_name) = self.component_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ComponentName", component_name)?; + } + if let Some(ref concat) = self.concat { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Concat", concat)?; + } + if let Some(ref condition) = self.condition { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Condition", condition)?; + } + if let Some(ref configured) = self.configured { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Configured", configured)?; + } + if let Some(ref default_value) = self.default_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DefaultValue", default_value)?; + } + if let Some(ref event) = self.event { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Event", event)?; + } + if let Some(ref imported_value) = self.imported_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ImportedValue", imported_value)?; + } + if let Some(ref model) = self.model { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Model", model)?; + } + if let Some(ref property) = self.property { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Property", property)?; + } + if let Some(ref r#type) = self.r#type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", r#type)?; + } + if let Some(ref user_attribute) = self.user_attribute { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UserAttribute", user_attribute)?; + } + if let Some(ref value) = self.value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", value)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ComponentProperty { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ComponentProperty; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ComponentProperty") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut binding_properties: Option<::Value> = None; + let mut bindings: Option<::Value> = None; + let mut collection_binding_properties: Option<::Value> = None; + let mut component_name: Option<::Value> = None; + let mut concat: Option<::ValueList> = None; + let mut condition: Option<::Value> = None; + let mut configured: Option<::Value> = None; + let mut default_value: Option<::Value> = None; + let mut event: Option<::Value> = None; + let mut imported_value: Option<::Value> = None; + let mut model: Option<::Value> = None; + let mut property: Option<::Value> = None; + let mut r#type: Option<::Value> = None; + let mut user_attribute: Option<::Value> = None; + let mut value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "BindingProperties" => { + binding_properties = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Bindings" => { + bindings = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CollectionBindingProperties" => { + collection_binding_properties = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ComponentName" => { + component_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Concat" => { + concat = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Condition" => { + condition = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Configured" => { + configured = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DefaultValue" => { + default_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Event" => { + event = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ImportedValue" => { + imported_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Model" => { + model = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Property" => { + property = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UserAttribute" => { + user_attribute = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ComponentProperty { + binding_properties: binding_properties, + bindings: bindings, + collection_binding_properties: collection_binding_properties, + component_name: component_name, + concat: concat, + condition: condition, + configured: configured, + default_value: default_value, + event: event, + imported_value: imported_value, + model: model, + property: property, + r#type: r#type, + user_attribute: user_attribute, + value: value, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AmplifyUIBuilder::Component.ComponentPropertyBindingProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentpropertybindingproperties.html) property type. + #[derive(Debug, Default)] + pub struct ComponentPropertyBindingProperties { + /// Property [`Field`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentpropertybindingproperties.html#cfn-amplifyuibuilder-component-componentpropertybindingproperties-field). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub field: Option<::Value>, + /// Property [`Property`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentpropertybindingproperties.html#cfn-amplifyuibuilder-component-componentpropertybindingproperties-property). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub property: ::Value, + } + + impl ::codec::SerializeValue for ComponentPropertyBindingProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref field) = self.field { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Field", field)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Property", &self.property)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ComponentPropertyBindingProperties { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ComponentPropertyBindingProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ComponentPropertyBindingProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut field: Option<::Value> = None; + let mut property: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Field" => { + field = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Property" => { + property = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ComponentPropertyBindingProperties { + field: field, + property: property.ok_or(::serde::de::Error::missing_field("Property"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AmplifyUIBuilder::Component.ComponentVariant`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentvariant.html) property type. + #[derive(Debug, Default)] + pub struct ComponentVariant { + /// Property [`Overrides`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentvariant.html#cfn-amplifyuibuilder-component-componentvariant-overrides). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub overrides: Option<::Value>, + /// Property [`VariantValues`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentvariant.html#cfn-amplifyuibuilder-component-componentvariant-variantvalues). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub variant_values: Option<::Value>, + } + + impl ::codec::SerializeValue for ComponentVariant { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref overrides) = self.overrides { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Overrides", overrides)?; + } + if let Some(ref variant_values) = self.variant_values { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VariantValues", variant_values)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ComponentVariant { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ComponentVariant; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ComponentVariant") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut overrides: Option<::Value> = None; + let mut variant_values: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Overrides" => { + overrides = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VariantValues" => { + variant_values = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ComponentVariant { + overrides: overrides, + variant_values: variant_values, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AmplifyUIBuilder::Component.ComponentVariantValues`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-componentvariantvalues.html) property type. + #[derive(Debug, Default)] + pub struct ComponentVariantValues { + } + + impl ::codec::SerializeValue for ComponentVariantValues { + fn serialize(&self, s: S) -> Result { + let map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ComponentVariantValues { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ComponentVariantValues; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ComponentVariantValues") + } + + fn visit_map>(self, _map: A) -> Result { + Ok(ComponentVariantValues {}) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AmplifyUIBuilder::Component.FormBindings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-formbindings.html) property type. + #[derive(Debug, Default)] + pub struct FormBindings { + } + + impl ::codec::SerializeValue for FormBindings { + fn serialize(&self, s: S) -> Result { + let map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for FormBindings { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = FormBindings; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type FormBindings") + } + + fn visit_map>(self, _map: A) -> Result { + Ok(FormBindings {}) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AmplifyUIBuilder::Component.MutationActionSetStateParameter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-mutationactionsetstateparameter.html) property type. + #[derive(Debug, Default)] + pub struct MutationActionSetStateParameter { + /// Property [`ComponentName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-mutationactionsetstateparameter.html#cfn-amplifyuibuilder-component-mutationactionsetstateparameter-componentname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub component_name: ::Value, + /// Property [`Property`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-mutationactionsetstateparameter.html#cfn-amplifyuibuilder-component-mutationactionsetstateparameter-property). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub property: ::Value, + /// Property [`Set`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-mutationactionsetstateparameter.html#cfn-amplifyuibuilder-component-mutationactionsetstateparameter-set). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub set: ::Value, + } + + impl ::codec::SerializeValue for MutationActionSetStateParameter { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ComponentName", &self.component_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Property", &self.property)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Set", &self.set)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for MutationActionSetStateParameter { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MutationActionSetStateParameter; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MutationActionSetStateParameter") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut component_name: Option<::Value> = None; + let mut property: Option<::Value> = None; + let mut set: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ComponentName" => { + component_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Property" => { + property = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Set" => { + set = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(MutationActionSetStateParameter { + component_name: component_name.ok_or(::serde::de::Error::missing_field("ComponentName"))?, + property: property.ok_or(::serde::de::Error::missing_field("Property"))?, + set: set.ok_or(::serde::de::Error::missing_field("Set"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AmplifyUIBuilder::Component.Predicate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-predicate.html) property type. + #[derive(Debug, Default)] + pub struct Predicate { + /// Property [`And`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-predicate.html#cfn-amplifyuibuilder-component-predicate-and). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub and: Option<::ValueList>, + /// Property [`Field`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-predicate.html#cfn-amplifyuibuilder-component-predicate-field). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub field: Option<::Value>, + /// Property [`Operand`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-predicate.html#cfn-amplifyuibuilder-component-predicate-operand). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub operand: Option<::Value>, + /// Property [`Operator`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-predicate.html#cfn-amplifyuibuilder-component-predicate-operator). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub operator: Option<::Value>, + /// Property [`Or`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-predicate.html#cfn-amplifyuibuilder-component-predicate-or). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub or: Option<::ValueList>, + } + + impl ::codec::SerializeValue for Predicate { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref and) = self.and { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "And", and)?; + } + if let Some(ref field) = self.field { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Field", field)?; + } + if let Some(ref operand) = self.operand { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Operand", operand)?; + } + if let Some(ref operator) = self.operator { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Operator", operator)?; + } + if let Some(ref or) = self.or { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Or", or)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Predicate { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Predicate; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Predicate") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut and: Option<::ValueList> = None; + let mut field: Option<::Value> = None; + let mut operand: Option<::Value> = None; + let mut operator: Option<::Value> = None; + let mut or: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "And" => { + and = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Field" => { + field = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Operand" => { + operand = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Operator" => { + operator = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Or" => { + or = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Predicate { + and: and, + field: field, + operand: operand, + operator: operator, + or: or, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AmplifyUIBuilder::Component.SortProperty`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-sortproperty.html) property type. + #[derive(Debug, Default)] + pub struct SortProperty { + /// Property [`Direction`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-sortproperty.html#cfn-amplifyuibuilder-component-sortproperty-direction). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub direction: ::Value, + /// Property [`Field`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-component-sortproperty.html#cfn-amplifyuibuilder-component-sortproperty-field). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub field: ::Value, + } + + impl ::codec::SerializeValue for SortProperty { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Direction", &self.direction)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Field", &self.field)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for SortProperty { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = SortProperty; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type SortProperty") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut direction: Option<::Value> = None; + let mut field: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Direction" => { + direction = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Field" => { + field = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(SortProperty { + direction: direction.ok_or(::serde::de::Error::missing_field("Direction"))?, + field: field.ok_or(::serde::de::Error::missing_field("Field"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + +pub mod theme { + //! Property types for the `Theme` resource. + + /// The [`AWS::AmplifyUIBuilder::Theme.ThemeValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-theme-themevalue.html) property type. + #[derive(Debug, Default)] + pub struct ThemeValue { + /// Property [`Children`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-theme-themevalue.html#cfn-amplifyuibuilder-theme-themevalue-children). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub children: Option<::ValueList>, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-theme-themevalue.html#cfn-amplifyuibuilder-theme-themevalue-value). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub value: Option<::Value>, + } + + impl ::codec::SerializeValue for ThemeValue { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref children) = self.children { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Children", children)?; + } + if let Some(ref value) = self.value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", value)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ThemeValue { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ThemeValue; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ThemeValue") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut children: Option<::ValueList> = None; + let mut value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Children" => { + children = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ThemeValue { + children: children, + value: value, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AmplifyUIBuilder::Theme.ThemeValues`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-theme-themevalues.html) property type. + #[derive(Debug, Default)] + pub struct ThemeValues { + /// Property [`Key`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-theme-themevalues.html#cfn-amplifyuibuilder-theme-themevalues-key). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub key: Option<::Value>, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-amplifyuibuilder-theme-themevalues.html#cfn-amplifyuibuilder-theme-themevalues-value). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub value: Option<::Value>, + } + + impl ::codec::SerializeValue for ThemeValues { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref key) = self.key { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Key", key)?; + } + if let Some(ref value) = self.value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", value)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ThemeValues { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ThemeValues; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ThemeValues") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut key: Option<::Value> = None; + let mut value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Key" => { + key = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ThemeValues { + key: key, + value: value, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} diff --git a/src/aws/apigateway.rs b/src/aws/apigateway.rs index 44b6b11..053219c 100644 --- a/src/aws/apigateway.rs +++ b/src/aws/apigateway.rs @@ -290,7 +290,7 @@ pub struct AuthorizerProperties { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub name: Option<::Value>, + pub name: ::Value, /// Property [`ProviderARNs`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-authorizer.html#cfn-apigateway-authorizer-providerarns). /// /// Update type: _Mutable_. @@ -329,9 +329,7 @@ impl ::serde::Serialize for AuthorizerProperties { if let Some(ref identity_validation_expression) = self.identity_validation_expression { ::serde::ser::SerializeMap::serialize_entry(&mut map, "IdentityValidationExpression", identity_validation_expression)?; } - if let Some(ref name) = self.name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; if let Some(ref provider_ar_ns) = self.provider_ar_ns { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ProviderARNs", provider_ar_ns)?; } @@ -407,7 +405,7 @@ impl<'de> ::serde::Deserialize<'de> for AuthorizerProperties { authorizer_uri: authorizer_uri, identity_source: identity_source, identity_validation_expression: identity_validation_expression, - name: name, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, provider_ar_ns: provider_ar_ns, rest_api_id: rest_api_id.ok_or(::serde::de::Error::missing_field("RestApiId"))?, r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?, @@ -457,6 +455,11 @@ pub struct BasePathMappingProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub domain_name: ::Value, + /// Property [`Id`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-basepathmapping.html#cfn-apigateway-basepathmapping-id). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub id: Option<::Value>, /// Property [`RestApiId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-basepathmapping.html#cfn-apigateway-basepathmapping-restapiid). /// /// Update type: _Mutable_. @@ -476,6 +479,9 @@ impl ::serde::Serialize for BasePathMappingProperties { ::serde::ser::SerializeMap::serialize_entry(&mut map, "BasePath", base_path)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "DomainName", &self.domain_name)?; + if let Some(ref id) = self.id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Id", id)?; + } if let Some(ref rest_api_id) = self.rest_api_id { ::serde::ser::SerializeMap::serialize_entry(&mut map, "RestApiId", rest_api_id)?; } @@ -500,6 +506,7 @@ impl<'de> ::serde::Deserialize<'de> for BasePathMappingProperties { fn visit_map>(self, mut map: A) -> Result { let mut base_path: Option<::Value> = None; let mut domain_name: Option<::Value> = None; + let mut id: Option<::Value> = None; let mut rest_api_id: Option<::Value> = None; let mut stage: Option<::Value> = None; @@ -511,6 +518,9 @@ impl<'de> ::serde::Deserialize<'de> for BasePathMappingProperties { "DomainName" => { domain_name = ::serde::de::MapAccess::next_value(&mut map)?; } + "Id" => { + id = ::serde::de::MapAccess::next_value(&mut map)?; + } "RestApiId" => { rest_api_id = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -524,6 +534,7 @@ impl<'de> ::serde::Deserialize<'de> for BasePathMappingProperties { Ok(BasePathMappingProperties { base_path: base_path, domain_name: domain_name.ok_or(::serde::de::Error::missing_field("DomainName"))?, + id: id, rest_api_id: rest_api_id, stage: stage, }) @@ -999,6 +1010,11 @@ pub struct DomainNameProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub mutual_tls_authentication: Option<::Value>, + /// Property [`OwnershipVerificationCertificateArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-domainname.html#cfn-apigateway-domainname-ownershipverificationcertificatearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ownership_verification_certificate_arn: Option<::Value>, /// Property [`RegionalCertificateArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-domainname.html#cfn-apigateway-domainname-regionalcertificatearn). /// /// Update type: _Mutable_. @@ -1031,6 +1047,9 @@ impl ::serde::Serialize for DomainNameProperties { if let Some(ref mutual_tls_authentication) = self.mutual_tls_authentication { ::serde::ser::SerializeMap::serialize_entry(&mut map, "MutualTlsAuthentication", mutual_tls_authentication)?; } + if let Some(ref ownership_verification_certificate_arn) = self.ownership_verification_certificate_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OwnershipVerificationCertificateArn", ownership_verification_certificate_arn)?; + } if let Some(ref regional_certificate_arn) = self.regional_certificate_arn { ::serde::ser::SerializeMap::serialize_entry(&mut map, "RegionalCertificateArn", regional_certificate_arn)?; } @@ -1060,6 +1079,7 @@ impl<'de> ::serde::Deserialize<'de> for DomainNameProperties { let mut domain_name: Option<::Value> = None; let mut endpoint_configuration: Option<::Value> = None; let mut mutual_tls_authentication: Option<::Value> = None; + let mut ownership_verification_certificate_arn: Option<::Value> = None; let mut regional_certificate_arn: Option<::Value> = None; let mut security_policy: Option<::Value> = None; let mut tags: Option<::ValueList<::Tag>> = None; @@ -1078,6 +1098,9 @@ impl<'de> ::serde::Deserialize<'de> for DomainNameProperties { "MutualTlsAuthentication" => { mutual_tls_authentication = ::serde::de::MapAccess::next_value(&mut map)?; } + "OwnershipVerificationCertificateArn" => { + ownership_verification_certificate_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } "RegionalCertificateArn" => { regional_certificate_arn = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1096,6 +1119,7 @@ impl<'de> ::serde::Deserialize<'de> for DomainNameProperties { domain_name: domain_name, endpoint_configuration: endpoint_configuration, mutual_tls_authentication: mutual_tls_authentication, + ownership_verification_certificate_arn: ownership_verification_certificate_arn, regional_certificate_arn: regional_certificate_arn, security_policy: security_policy, tags: tags, @@ -2586,6 +2610,11 @@ pub struct VpcLinkProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub name: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-vpclink.html#cfn-apigateway-vpclink-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, /// Property [`TargetArns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-vpclink.html#cfn-apigateway-vpclink-targetarns). /// /// Update type: _Immutable_. @@ -2600,6 +2629,9 @@ impl ::serde::Serialize for VpcLinkProperties { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetArns", &self.target_arns)?; ::serde::ser::SerializeMap::end(map) } @@ -2619,6 +2651,7 @@ impl<'de> ::serde::Deserialize<'de> for VpcLinkProperties { fn visit_map>(self, mut map: A) -> Result { let mut description: Option<::Value> = None; let mut name: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; let mut target_arns: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { @@ -2629,6 +2662,9 @@ impl<'de> ::serde::Deserialize<'de> for VpcLinkProperties { "Name" => { name = ::serde::de::MapAccess::next_value(&mut map)?; } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } "TargetArns" => { target_arns = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -2639,6 +2675,7 @@ impl<'de> ::serde::Deserialize<'de> for VpcLinkProperties { Ok(VpcLinkProperties { description: description, name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + tags: tags, target_arns: target_arns.ok_or(::serde::de::Error::missing_field("TargetArns"))?, }) } @@ -2964,55 +3001,55 @@ pub mod deployment { } } - /// The [`AWS::ApiGateway::Deployment.MethodSetting`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription-methodsetting.html) property type. + /// The [`AWS::ApiGateway::Deployment.MethodSetting`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-methodsetting.html) property type. #[derive(Debug, Default)] pub struct MethodSetting { - /// Property [`CacheDataEncrypted`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription-methodsetting.html#cfn-apigateway-deployment-stagedescription-methodsetting-cachedataencrypted). + /// Property [`CacheDataEncrypted`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-methodsetting.html#cfn-apigateway-deployment-methodsetting-cachedataencrypted). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub cache_data_encrypted: Option<::Value>, - /// Property [`CacheTtlInSeconds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription-methodsetting.html#cfn-apigateway-deployment-stagedescription-methodsetting-cachettlinseconds). + /// Property [`CacheTtlInSeconds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-methodsetting.html#cfn-apigateway-deployment-methodsetting-cachettlinseconds). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub cache_ttl_in_seconds: Option<::Value>, - /// Property [`CachingEnabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription-methodsetting.html#cfn-apigateway-deployment-stagedescription-methodsetting-cachingenabled). + /// Property [`CachingEnabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-methodsetting.html#cfn-apigateway-deployment-methodsetting-cachingenabled). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub caching_enabled: Option<::Value>, - /// Property [`DataTraceEnabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription-methodsetting.html#cfn-apigateway-deployment-stagedescription-methodsetting-datatraceenabled). + /// Property [`DataTraceEnabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-methodsetting.html#cfn-apigateway-deployment-methodsetting-datatraceenabled). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub data_trace_enabled: Option<::Value>, - /// Property [`HttpMethod`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription-methodsetting.html#cfn-apigateway-deployment-stagedescription-methodsetting-httpmethod). + /// Property [`HttpMethod`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-methodsetting.html#cfn-apigateway-deployment-methodsetting-httpmethod). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub http_method: Option<::Value>, - /// Property [`LoggingLevel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription-methodsetting.html#cfn-apigateway-deployment-stagedescription-methodsetting-logginglevel). + /// Property [`LoggingLevel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-methodsetting.html#cfn-apigateway-deployment-methodsetting-logginglevel). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub logging_level: Option<::Value>, - /// Property [`MetricsEnabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription-methodsetting.html#cfn-apigateway-deployment-stagedescription-methodsetting-metricsenabled). + /// Property [`MetricsEnabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-methodsetting.html#cfn-apigateway-deployment-methodsetting-metricsenabled). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub metrics_enabled: Option<::Value>, - /// Property [`ResourcePath`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription-methodsetting.html#cfn-apigateway-deployment-stagedescription-methodsetting-resourcepath). + /// Property [`ResourcePath`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-methodsetting.html#cfn-apigateway-deployment-methodsetting-resourcepath). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub resource_path: Option<::Value>, - /// Property [`ThrottlingBurstLimit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription-methodsetting.html#cfn-apigateway-deployment-stagedescription-methodsetting-throttlingburstlimit). + /// Property [`ThrottlingBurstLimit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-methodsetting.html#cfn-apigateway-deployment-methodsetting-throttlingburstlimit). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub throttling_burst_limit: Option<::Value>, - /// Property [`ThrottlingRateLimit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription-methodsetting.html#cfn-apigateway-deployment-stagedescription-methodsetting-throttlingratelimit). + /// Property [`ThrottlingRateLimit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-methodsetting.html#cfn-apigateway-deployment-methodsetting-throttlingratelimit). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. @@ -3207,7 +3244,7 @@ pub mod deployment { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub metrics_enabled: Option<::Value>, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html#cfn-apigateway-deployment-tags). + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-deployment-stagedescription.html#cfn-apigateway-deployment-stagedescription-tags). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. @@ -4383,55 +4420,55 @@ pub mod stage { } } - /// The [`AWS::ApiGateway::Stage.MethodSetting`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-stage-methodsetting.html) property type. + /// The [`AWS::ApiGateway::Stage.MethodSetting`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html) property type. #[derive(Debug, Default)] pub struct MethodSetting { - /// Property [`CacheDataEncrypted`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-cachedataencrypted). + /// Property [`CacheDataEncrypted`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-cachedataencrypted). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub cache_data_encrypted: Option<::Value>, - /// Property [`CacheTtlInSeconds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-cachettlinseconds). + /// Property [`CacheTtlInSeconds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-cachettlinseconds). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub cache_ttl_in_seconds: Option<::Value>, - /// Property [`CachingEnabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-cachingenabled). + /// Property [`CachingEnabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-cachingenabled). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub caching_enabled: Option<::Value>, - /// Property [`DataTraceEnabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-datatraceenabled). + /// Property [`DataTraceEnabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-datatraceenabled). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub data_trace_enabled: Option<::Value>, - /// Property [`HttpMethod`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-httpmethod). + /// Property [`HttpMethod`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-httpmethod). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub http_method: Option<::Value>, - /// Property [`LoggingLevel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-logginglevel). + /// Property [`LoggingLevel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-logginglevel). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub logging_level: Option<::Value>, - /// Property [`MetricsEnabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-metricsenabled). + /// Property [`MetricsEnabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-metricsenabled). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub metrics_enabled: Option<::Value>, - /// Property [`ResourcePath`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-resourcepath). + /// Property [`ResourcePath`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-resourcepath). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub resource_path: Option<::Value>, - /// Property [`ThrottlingBurstLimit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-throttlingburstlimit). + /// Property [`ThrottlingBurstLimit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-throttlingburstlimit). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub throttling_burst_limit: Option<::Value>, - /// Property [`ThrottlingRateLimit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apitgateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-throttlingratelimit). + /// Property [`ThrottlingRateLimit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-stage-methodsetting.html#cfn-apigateway-stage-methodsetting-throttlingratelimit). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. diff --git a/src/aws/apigatewayv2.rs b/src/aws/apigatewayv2.rs index e624eab..9835289 100644 --- a/src/aws/apigatewayv2.rs +++ b/src/aws/apigatewayv2.rs @@ -2979,6 +2979,11 @@ pub mod domain_name { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub endpoint_type: Option<::Value>, + /// Property [`OwnershipVerificationCertificateArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-domainname-domainnameconfiguration.html#cfn-apigatewayv2-domainname-domainnameconfiguration-ownershipverificationcertificatearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ownership_verification_certificate_arn: Option<::Value>, /// Property [`SecurityPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigatewayv2-domainname-domainnameconfiguration.html#cfn-apigatewayv2-domainname-domainnameconfiguration-securitypolicy). /// /// Update type: _Mutable_. @@ -2998,6 +3003,9 @@ pub mod domain_name { if let Some(ref endpoint_type) = self.endpoint_type { ::serde::ser::SerializeMap::serialize_entry(&mut map, "EndpointType", endpoint_type)?; } + if let Some(ref ownership_verification_certificate_arn) = self.ownership_verification_certificate_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OwnershipVerificationCertificateArn", ownership_verification_certificate_arn)?; + } if let Some(ref security_policy) = self.security_policy { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityPolicy", security_policy)?; } @@ -3020,6 +3028,7 @@ pub mod domain_name { let mut certificate_arn: Option<::Value> = None; let mut certificate_name: Option<::Value> = None; let mut endpoint_type: Option<::Value> = None; + let mut ownership_verification_certificate_arn: Option<::Value> = None; let mut security_policy: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { @@ -3033,6 +3042,9 @@ pub mod domain_name { "EndpointType" => { endpoint_type = ::serde::de::MapAccess::next_value(&mut map)?; } + "OwnershipVerificationCertificateArn" => { + ownership_verification_certificate_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } "SecurityPolicy" => { security_policy = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -3044,6 +3056,7 @@ pub mod domain_name { certificate_arn: certificate_arn, certificate_name: certificate_name, endpoint_type: endpoint_type, + ownership_verification_certificate_arn: ownership_verification_certificate_arn, security_policy: security_policy, }) } diff --git a/src/aws/appconfig.rs b/src/aws/appconfig.rs index cbcd692..3e9b0b4 100644 --- a/src/aws/appconfig.rs +++ b/src/aws/appconfig.rs @@ -141,6 +141,11 @@ pub struct ConfigurationProfileProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub tags: Option<::ValueList>, + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-configurationprofile.html#cfn-appconfig-configurationprofile-type). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub r#type: Option<::Value>, /// Property [`Validators`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appconfig-configurationprofile.html#cfn-appconfig-configurationprofile-validators). /// /// Update type: _Mutable_. @@ -163,6 +168,9 @@ impl ::serde::Serialize for ConfigurationProfileProperties { if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } + if let Some(ref r#type) = self.r#type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", r#type)?; + } if let Some(ref validators) = self.validators { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Validators", validators)?; } @@ -188,6 +196,7 @@ impl<'de> ::serde::Deserialize<'de> for ConfigurationProfileProperties { let mut name: Option<::Value> = None; let mut retrieval_role_arn: Option<::Value> = None; let mut tags: Option<::ValueList> = None; + let mut r#type: Option<::Value> = None; let mut validators: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { @@ -210,6 +219,9 @@ impl<'de> ::serde::Deserialize<'de> for ConfigurationProfileProperties { "Tags" => { tags = ::serde::de::MapAccess::next_value(&mut map)?; } + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; + } "Validators" => { validators = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -224,6 +236,7 @@ impl<'de> ::serde::Deserialize<'de> for ConfigurationProfileProperties { name: name.ok_or(::serde::de::Error::missing_field("Name"))?, retrieval_role_arn: retrieval_role_arn, tags: tags, + r#type: r#type, validators: validators, }) } diff --git a/src/aws/appflow.rs b/src/aws/appflow.rs index 76d419b..6f2ca8e 100644 --- a/src/aws/appflow.rs +++ b/src/aws/appflow.rs @@ -516,6 +516,11 @@ pub mod connector_profile { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub redshift: Option<::Value>, + /// Property [`SAPOData`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofilecredentials.html#cfn-appflow-connectorprofile-connectorprofilecredentials-sapodata). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub sapo_data: Option<::Value>, /// Property [`Salesforce`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofilecredentials.html#cfn-appflow-connectorprofile-connectorprofilecredentials-salesforce). /// /// Update type: _Mutable_. @@ -582,6 +587,9 @@ pub mod connector_profile { if let Some(ref redshift) = self.redshift { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Redshift", redshift)?; } + if let Some(ref sapo_data) = self.sapo_data { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SAPOData", sapo_data)?; + } if let Some(ref salesforce) = self.salesforce { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Salesforce", salesforce)?; } @@ -629,6 +637,7 @@ pub mod connector_profile { let mut infor_nexus: Option<::Value> = None; let mut marketo: Option<::Value> = None; let mut redshift: Option<::Value> = None; + let mut sapo_data: Option<::Value> = None; let mut salesforce: Option<::Value> = None; let mut service_now: Option<::Value> = None; let mut singular: Option<::Value> = None; @@ -661,6 +670,9 @@ pub mod connector_profile { "Redshift" => { redshift = ::serde::de::MapAccess::next_value(&mut map)?; } + "SAPOData" => { + sapo_data = ::serde::de::MapAccess::next_value(&mut map)?; + } "Salesforce" => { salesforce = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -697,6 +709,7 @@ pub mod connector_profile { infor_nexus: infor_nexus, marketo: marketo, redshift: redshift, + sapo_data: sapo_data, salesforce: salesforce, service_now: service_now, singular: singular, @@ -741,6 +754,11 @@ pub mod connector_profile { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub redshift: Option<::Value>, + /// Property [`SAPOData`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofileproperties.html#cfn-appflow-connectorprofile-connectorprofileproperties-sapodata). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub sapo_data: Option<::Value>, /// Property [`Salesforce`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-connectorprofileproperties.html#cfn-appflow-connectorprofile-connectorprofileproperties-salesforce). /// /// Update type: _Mutable_. @@ -791,6 +809,9 @@ pub mod connector_profile { if let Some(ref redshift) = self.redshift { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Redshift", redshift)?; } + if let Some(ref sapo_data) = self.sapo_data { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SAPOData", sapo_data)?; + } if let Some(ref salesforce) = self.salesforce { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Salesforce", salesforce)?; } @@ -830,6 +851,7 @@ pub mod connector_profile { let mut infor_nexus: Option<::Value> = None; let mut marketo: Option<::Value> = None; let mut redshift: Option<::Value> = None; + let mut sapo_data: Option<::Value> = None; let mut salesforce: Option<::Value> = None; let mut service_now: Option<::Value> = None; let mut slack: Option<::Value> = None; @@ -854,6 +876,9 @@ pub mod connector_profile { "Redshift" => { redshift = ::serde::de::MapAccess::next_value(&mut map)?; } + "SAPOData" => { + sapo_data = ::serde::de::MapAccess::next_value(&mut map)?; + } "Salesforce" => { salesforce = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -882,6 +907,7 @@ pub mod connector_profile { infor_nexus: infor_nexus, marketo: marketo, redshift: redshift, + sapo_data: sapo_data, salesforce: salesforce, service_now: service_now, slack: slack, @@ -1486,6 +1512,85 @@ pub mod connector_profile { } } + /// The [`AWS::AppFlow::ConnectorProfile.OAuthProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauthproperties.html) property type. + #[derive(Debug, Default)] + pub struct OAuthProperties { + /// Property [`AuthCodeUrl`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauthproperties.html#cfn-appflow-connectorprofile-oauthproperties-authcodeurl). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub auth_code_url: Option<::Value>, + /// Property [`OAuthScopes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauthproperties.html#cfn-appflow-connectorprofile-oauthproperties-oauthscopes). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub o_auth_scopes: Option<::ValueList>, + /// Property [`TokenUrl`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-oauthproperties.html#cfn-appflow-connectorprofile-oauthproperties-tokenurl). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub token_url: Option<::Value>, + } + + impl ::codec::SerializeValue for OAuthProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref auth_code_url) = self.auth_code_url { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AuthCodeUrl", auth_code_url)?; + } + if let Some(ref o_auth_scopes) = self.o_auth_scopes { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OAuthScopes", o_auth_scopes)?; + } + if let Some(ref token_url) = self.token_url { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TokenUrl", token_url)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for OAuthProperties { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = OAuthProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type OAuthProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut auth_code_url: Option<::Value> = None; + let mut o_auth_scopes: Option<::ValueList> = None; + let mut token_url: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AuthCodeUrl" => { + auth_code_url = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OAuthScopes" => { + o_auth_scopes = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TokenUrl" => { + token_url = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(OAuthProperties { + auth_code_url: auth_code_url, + o_auth_scopes: o_auth_scopes, + token_url: token_url, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::AppFlow::ConnectorProfile.RedshiftConnectorProfileCredentials`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-redshiftconnectorprofilecredentials.html) property type. #[derive(Debug, Default)] pub struct RedshiftConnectorProfileCredentials { @@ -1634,6 +1739,203 @@ pub mod connector_profile { } } + /// The [`AWS::AppFlow::ConnectorProfile.SAPODataConnectorProfileCredentials`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-sapodataconnectorprofilecredentials.html) property type. + #[derive(Debug, Default)] + pub struct SAPODataConnectorProfileCredentials { + /// Property [`BasicAuthCredentials`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-sapodataconnectorprofilecredentials.html#cfn-appflow-connectorprofile-sapodataconnectorprofilecredentials-basicauthcredentials). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub basic_auth_credentials: Option<::Value<::json::Value>>, + /// Property [`OAuthCredentials`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-sapodataconnectorprofilecredentials.html#cfn-appflow-connectorprofile-sapodataconnectorprofilecredentials-oauthcredentials). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub o_auth_credentials: Option<::Value<::json::Value>>, + } + + impl ::codec::SerializeValue for SAPODataConnectorProfileCredentials { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref basic_auth_credentials) = self.basic_auth_credentials { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BasicAuthCredentials", basic_auth_credentials)?; + } + if let Some(ref o_auth_credentials) = self.o_auth_credentials { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OAuthCredentials", o_auth_credentials)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for SAPODataConnectorProfileCredentials { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = SAPODataConnectorProfileCredentials; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type SAPODataConnectorProfileCredentials") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut basic_auth_credentials: Option<::Value<::json::Value>> = None; + let mut o_auth_credentials: Option<::Value<::json::Value>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "BasicAuthCredentials" => { + basic_auth_credentials = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OAuthCredentials" => { + o_auth_credentials = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(SAPODataConnectorProfileCredentials { + basic_auth_credentials: basic_auth_credentials, + o_auth_credentials: o_auth_credentials, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AppFlow::ConnectorProfile.SAPODataConnectorProfileProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-sapodataconnectorprofileproperties.html) property type. + #[derive(Debug, Default)] + pub struct SAPODataConnectorProfileProperties { + /// Property [`ApplicationHostUrl`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-sapodataconnectorprofileproperties.html#cfn-appflow-connectorprofile-sapodataconnectorprofileproperties-applicationhosturl). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub application_host_url: Option<::Value>, + /// Property [`ApplicationServicePath`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-sapodataconnectorprofileproperties.html#cfn-appflow-connectorprofile-sapodataconnectorprofileproperties-applicationservicepath). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub application_service_path: Option<::Value>, + /// Property [`ClientNumber`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-sapodataconnectorprofileproperties.html#cfn-appflow-connectorprofile-sapodataconnectorprofileproperties-clientnumber). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub client_number: Option<::Value>, + /// Property [`LogonLanguage`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-sapodataconnectorprofileproperties.html#cfn-appflow-connectorprofile-sapodataconnectorprofileproperties-logonlanguage). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub logon_language: Option<::Value>, + /// Property [`OAuthProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-sapodataconnectorprofileproperties.html#cfn-appflow-connectorprofile-sapodataconnectorprofileproperties-oauthproperties). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub o_auth_properties: Option<::Value>, + /// Property [`PortNumber`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-sapodataconnectorprofileproperties.html#cfn-appflow-connectorprofile-sapodataconnectorprofileproperties-portnumber). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub port_number: Option<::Value>, + /// Property [`PrivateLinkServiceName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-sapodataconnectorprofileproperties.html#cfn-appflow-connectorprofile-sapodataconnectorprofileproperties-privatelinkservicename). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub private_link_service_name: Option<::Value>, + } + + impl ::codec::SerializeValue for SAPODataConnectorProfileProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref application_host_url) = self.application_host_url { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ApplicationHostUrl", application_host_url)?; + } + if let Some(ref application_service_path) = self.application_service_path { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ApplicationServicePath", application_service_path)?; + } + if let Some(ref client_number) = self.client_number { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ClientNumber", client_number)?; + } + if let Some(ref logon_language) = self.logon_language { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogonLanguage", logon_language)?; + } + if let Some(ref o_auth_properties) = self.o_auth_properties { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OAuthProperties", o_auth_properties)?; + } + if let Some(ref port_number) = self.port_number { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PortNumber", port_number)?; + } + if let Some(ref private_link_service_name) = self.private_link_service_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateLinkServiceName", private_link_service_name)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for SAPODataConnectorProfileProperties { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = SAPODataConnectorProfileProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type SAPODataConnectorProfileProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut application_host_url: Option<::Value> = None; + let mut application_service_path: Option<::Value> = None; + let mut client_number: Option<::Value> = None; + let mut logon_language: Option<::Value> = None; + let mut o_auth_properties: Option<::Value> = None; + let mut port_number: Option<::Value> = None; + let mut private_link_service_name: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ApplicationHostUrl" => { + application_host_url = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ApplicationServicePath" => { + application_service_path = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ClientNumber" => { + client_number = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LogonLanguage" => { + logon_language = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OAuthProperties" => { + o_auth_properties = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PortNumber" => { + port_number = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PrivateLinkServiceName" => { + private_link_service_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(SAPODataConnectorProfileProperties { + application_host_url: application_host_url, + application_service_path: application_service_path, + client_number: client_number, + logon_language: logon_language, + o_auth_properties: o_auth_properties, + port_number: port_number, + private_link_service_name: private_link_service_name, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::AppFlow::ConnectorProfile.SalesforceConnectorProfileCredentials`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-connectorprofile-salesforceconnectorprofilecredentials.html) property type. #[derive(Debug, Default)] pub struct SalesforceConnectorProfileCredentials { @@ -2731,6 +3033,11 @@ pub mod flow { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub s3: Option<::Value>, + /// Property [`SAPOData`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-connectoroperator.html#cfn-appflow-flow-connectoroperator-sapodata). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub sapo_data: Option<::Value>, /// Property [`Salesforce`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-connectoroperator.html#cfn-appflow-flow-connectoroperator-salesforce). /// /// Update type: _Mutable_. @@ -2792,6 +3099,9 @@ pub mod flow { if let Some(ref s3) = self.s3 { ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3", s3)?; } + if let Some(ref sapo_data) = self.sapo_data { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SAPOData", sapo_data)?; + } if let Some(ref salesforce) = self.salesforce { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Salesforce", salesforce)?; } @@ -2836,6 +3146,7 @@ pub mod flow { let mut infor_nexus: Option<::Value> = None; let mut marketo: Option<::Value> = None; let mut s3: Option<::Value> = None; + let mut sapo_data: Option<::Value> = None; let mut salesforce: Option<::Value> = None; let mut service_now: Option<::Value> = None; let mut singular: Option<::Value> = None; @@ -2867,6 +3178,9 @@ pub mod flow { "S3" => { s3 = ::serde::de::MapAccess::next_value(&mut map)?; } + "SAPOData" => { + sapo_data = ::serde::de::MapAccess::next_value(&mut map)?; + } "Salesforce" => { salesforce = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -2900,6 +3214,7 @@ pub mod flow { infor_nexus: infor_nexus, marketo: marketo, s3: s3, + sapo_data: sapo_data, salesforce: salesforce, service_now: service_now, singular: singular, @@ -2979,6 +3294,11 @@ pub mod flow { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub lookout_metrics: Option<::Value>, + /// Property [`Marketo`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-destinationconnectorproperties.html#cfn-appflow-flow-destinationconnectorproperties-marketo). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub marketo: Option<::Value>, /// Property [`Redshift`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-destinationconnectorproperties.html#cfn-appflow-flow-destinationconnectorproperties-redshift). /// /// Update type: _Mutable_. @@ -2989,6 +3309,11 @@ pub mod flow { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub s3: Option<::Value>, + /// Property [`SAPOData`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-destinationconnectorproperties.html#cfn-appflow-flow-destinationconnectorproperties-sapodata). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub sapo_data: Option<::Value>, /// Property [`Salesforce`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-destinationconnectorproperties.html#cfn-appflow-flow-destinationconnectorproperties-salesforce). /// /// Update type: _Mutable_. @@ -3020,12 +3345,18 @@ pub mod flow { if let Some(ref lookout_metrics) = self.lookout_metrics { ::serde::ser::SerializeMap::serialize_entry(&mut map, "LookoutMetrics", lookout_metrics)?; } + if let Some(ref marketo) = self.marketo { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Marketo", marketo)?; + } if let Some(ref redshift) = self.redshift { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Redshift", redshift)?; } if let Some(ref s3) = self.s3 { ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3", s3)?; } + if let Some(ref sapo_data) = self.sapo_data { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SAPOData", sapo_data)?; + } if let Some(ref salesforce) = self.salesforce { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Salesforce", salesforce)?; } @@ -3056,8 +3387,10 @@ pub mod flow { fn visit_map>(self, mut map: A) -> Result { let mut event_bridge: Option<::Value> = None; let mut lookout_metrics: Option<::Value> = None; + let mut marketo: Option<::Value> = None; let mut redshift: Option<::Value> = None; let mut s3: Option<::Value> = None; + let mut sapo_data: Option<::Value> = None; let mut salesforce: Option<::Value> = None; let mut snowflake: Option<::Value> = None; let mut upsolver: Option<::Value> = None; @@ -3071,12 +3404,18 @@ pub mod flow { "LookoutMetrics" => { lookout_metrics = ::serde::de::MapAccess::next_value(&mut map)?; } + "Marketo" => { + marketo = ::serde::de::MapAccess::next_value(&mut map)?; + } "Redshift" => { redshift = ::serde::de::MapAccess::next_value(&mut map)?; } "S3" => { s3 = ::serde::de::MapAccess::next_value(&mut map)?; } + "SAPOData" => { + sapo_data = ::serde::de::MapAccess::next_value(&mut map)?; + } "Salesforce" => { salesforce = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -3096,8 +3435,10 @@ pub mod flow { Ok(DestinationConnectorProperties { event_bridge: event_bridge, lookout_metrics: lookout_metrics, + marketo: marketo, redshift: redshift, s3: s3, + sapo_data: sapo_data, salesforce: salesforce, snowflake: snowflake, upsolver: upsolver, @@ -3587,6 +3928,70 @@ pub mod flow { } } + /// The [`AWS::AppFlow::Flow.MarketoDestinationProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-marketodestinationproperties.html) property type. + #[derive(Debug, Default)] + pub struct MarketoDestinationProperties { + /// Property [`ErrorHandlingConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-marketodestinationproperties.html#cfn-appflow-flow-marketodestinationproperties-errorhandlingconfig). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub error_handling_config: Option<::Value>, + /// Property [`Object`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-marketodestinationproperties.html#cfn-appflow-flow-marketodestinationproperties-object). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub object: ::Value, + } + + impl ::codec::SerializeValue for MarketoDestinationProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref error_handling_config) = self.error_handling_config { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ErrorHandlingConfig", error_handling_config)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Object", &self.object)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for MarketoDestinationProperties { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MarketoDestinationProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MarketoDestinationProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut error_handling_config: Option<::Value> = None; + let mut object: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ErrorHandlingConfig" => { + error_handling_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Object" => { + object = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(MarketoDestinationProperties { + error_handling_config: error_handling_config, + object: object.ok_or(::serde::de::Error::missing_field("Object"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::AppFlow::Flow.MarketoSourceProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-marketosourceproperties.html) property type. #[derive(Debug, Default)] pub struct MarketoSourceProperties { @@ -3869,6 +4274,59 @@ pub mod flow { } } + /// The [`AWS::AppFlow::Flow.S3InputFormatConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-s3inputformatconfig.html) property type. + #[derive(Debug, Default)] + pub struct S3InputFormatConfig { + /// Property [`S3InputFileType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-s3inputformatconfig.html#cfn-appflow-flow-s3inputformatconfig-s3inputfiletype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub s3_input_file_type: Option<::Value>, + } + + impl ::codec::SerializeValue for S3InputFormatConfig { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref s3_input_file_type) = self.s3_input_file_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3InputFileType", s3_input_file_type)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for S3InputFormatConfig { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = S3InputFormatConfig; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type S3InputFormatConfig") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut s3_input_file_type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "S3InputFileType" => { + s3_input_file_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(S3InputFormatConfig { + s3_input_file_type: s3_input_file_type, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::AppFlow::Flow.S3OutputFormatConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-s3outputformatconfig.html) property type. #[derive(Debug, Default)] pub struct S3OutputFormatConfig { @@ -3961,6 +4419,11 @@ pub mod flow { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub bucket_prefix: ::Value, + /// Property [`S3InputFormatConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-s3sourceproperties.html#cfn-appflow-flow-s3sourceproperties-s3inputformatconfig). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub s3_input_format_config: Option<::Value>, } impl ::codec::SerializeValue for S3SourceProperties { @@ -3968,6 +4431,9 @@ pub mod flow { let mut map = ::serde::Serializer::serialize_map(s, None)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "BucketName", &self.bucket_name)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "BucketPrefix", &self.bucket_prefix)?; + if let Some(ref s3_input_format_config) = self.s3_input_format_config { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3InputFormatConfig", s3_input_format_config)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -3986,6 +4452,7 @@ pub mod flow { fn visit_map>(self, mut map: A) -> Result { let mut bucket_name: Option<::Value> = None; let mut bucket_prefix: Option<::Value> = None; + let mut s3_input_format_config: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { @@ -3995,6 +4462,9 @@ pub mod flow { "BucketPrefix" => { bucket_prefix = ::serde::de::MapAccess::next_value(&mut map)?; } + "S3InputFormatConfig" => { + s3_input_format_config = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } @@ -4002,6 +4472,161 @@ pub mod flow { Ok(S3SourceProperties { bucket_name: bucket_name.ok_or(::serde::de::Error::missing_field("BucketName"))?, bucket_prefix: bucket_prefix.ok_or(::serde::de::Error::missing_field("BucketPrefix"))?, + s3_input_format_config: s3_input_format_config, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AppFlow::Flow.SAPODataDestinationProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sapodatadestinationproperties.html) property type. + #[derive(Debug, Default)] + pub struct SAPODataDestinationProperties { + /// Property [`ErrorHandlingConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sapodatadestinationproperties.html#cfn-appflow-flow-sapodatadestinationproperties-errorhandlingconfig). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub error_handling_config: Option<::Value>, + /// Property [`IdFieldNames`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sapodatadestinationproperties.html#cfn-appflow-flow-sapodatadestinationproperties-idfieldnames). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub id_field_names: Option<::ValueList>, + /// Property [`ObjectPath`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sapodatadestinationproperties.html#cfn-appflow-flow-sapodatadestinationproperties-objectpath). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub object_path: ::Value, + /// Property [`SuccessResponseHandlingConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sapodatadestinationproperties.html#cfn-appflow-flow-sapodatadestinationproperties-successresponsehandlingconfig). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub success_response_handling_config: Option<::Value>, + /// Property [`WriteOperationType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sapodatadestinationproperties.html#cfn-appflow-flow-sapodatadestinationproperties-writeoperationtype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub write_operation_type: Option<::Value>, + } + + impl ::codec::SerializeValue for SAPODataDestinationProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref error_handling_config) = self.error_handling_config { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ErrorHandlingConfig", error_handling_config)?; + } + if let Some(ref id_field_names) = self.id_field_names { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IdFieldNames", id_field_names)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ObjectPath", &self.object_path)?; + if let Some(ref success_response_handling_config) = self.success_response_handling_config { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SuccessResponseHandlingConfig", success_response_handling_config)?; + } + if let Some(ref write_operation_type) = self.write_operation_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "WriteOperationType", write_operation_type)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for SAPODataDestinationProperties { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = SAPODataDestinationProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type SAPODataDestinationProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut error_handling_config: Option<::Value> = None; + let mut id_field_names: Option<::ValueList> = None; + let mut object_path: Option<::Value> = None; + let mut success_response_handling_config: Option<::Value> = None; + let mut write_operation_type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ErrorHandlingConfig" => { + error_handling_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IdFieldNames" => { + id_field_names = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ObjectPath" => { + object_path = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SuccessResponseHandlingConfig" => { + success_response_handling_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + "WriteOperationType" => { + write_operation_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(SAPODataDestinationProperties { + error_handling_config: error_handling_config, + id_field_names: id_field_names, + object_path: object_path.ok_or(::serde::de::Error::missing_field("ObjectPath"))?, + success_response_handling_config: success_response_handling_config, + write_operation_type: write_operation_type, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AppFlow::Flow.SAPODataSourceProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sapodatasourceproperties.html) property type. + #[derive(Debug, Default)] + pub struct SAPODataSourceProperties { + /// Property [`ObjectPath`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sapodatasourceproperties.html#cfn-appflow-flow-sapodatasourceproperties-objectpath). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub object_path: ::Value, + } + + impl ::codec::SerializeValue for SAPODataSourceProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ObjectPath", &self.object_path)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for SAPODataSourceProperties { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = SAPODataSourceProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type SAPODataSourceProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut object_path: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ObjectPath" => { + object_path = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(SAPODataSourceProperties { + object_path: object_path.ok_or(::serde::de::Error::missing_field("ObjectPath"))?, }) } } @@ -4195,6 +4820,11 @@ pub mod flow { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub schedule_expression: ::Value, + /// Property [`ScheduleOffset`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-scheduledtriggerproperties.html#cfn-appflow-flow-scheduledtriggerproperties-scheduleoffset). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub schedule_offset: Option<::Value>, /// Property [`ScheduleStartTime`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-scheduledtriggerproperties.html#cfn-appflow-flow-scheduledtriggerproperties-schedulestarttime). /// /// Update type: _Mutable_. @@ -4217,6 +4847,9 @@ pub mod flow { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ScheduleEndTime", schedule_end_time)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "ScheduleExpression", &self.schedule_expression)?; + if let Some(ref schedule_offset) = self.schedule_offset { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ScheduleOffset", schedule_offset)?; + } if let Some(ref schedule_start_time) = self.schedule_start_time { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ScheduleStartTime", schedule_start_time)?; } @@ -4242,6 +4875,7 @@ pub mod flow { let mut data_pull_mode: Option<::Value> = None; let mut schedule_end_time: Option<::Value> = None; let mut schedule_expression: Option<::Value> = None; + let mut schedule_offset: Option<::Value> = None; let mut schedule_start_time: Option<::Value> = None; let mut time_zone: Option<::Value> = None; @@ -4256,6 +4890,9 @@ pub mod flow { "ScheduleExpression" => { schedule_expression = ::serde::de::MapAccess::next_value(&mut map)?; } + "ScheduleOffset" => { + schedule_offset = ::serde::de::MapAccess::next_value(&mut map)?; + } "ScheduleStartTime" => { schedule_start_time = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -4270,6 +4907,7 @@ pub mod flow { data_pull_mode: data_pull_mode, schedule_end_time: schedule_end_time, schedule_expression: schedule_expression.ok_or(::serde::de::Error::missing_field("ScheduleExpression"))?, + schedule_offset: schedule_offset, schedule_start_time: schedule_start_time, time_zone: time_zone, }) @@ -4559,6 +5197,11 @@ pub mod flow { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub s3: Option<::Value>, + /// Property [`SAPOData`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceconnectorproperties.html#cfn-appflow-flow-sourceconnectorproperties-sapodata). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub sapo_data: Option<::Value>, /// Property [`Salesforce`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-sourceconnectorproperties.html#cfn-appflow-flow-sourceconnectorproperties-salesforce). /// /// Update type: _Mutable_. @@ -4620,6 +5263,9 @@ pub mod flow { if let Some(ref s3) = self.s3 { ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3", s3)?; } + if let Some(ref sapo_data) = self.sapo_data { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SAPOData", sapo_data)?; + } if let Some(ref salesforce) = self.salesforce { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Salesforce", salesforce)?; } @@ -4664,6 +5310,7 @@ pub mod flow { let mut infor_nexus: Option<::Value> = None; let mut marketo: Option<::Value> = None; let mut s3: Option<::Value> = None; + let mut sapo_data: Option<::Value> = None; let mut salesforce: Option<::Value> = None; let mut service_now: Option<::Value> = None; let mut singular: Option<::Value> = None; @@ -4695,6 +5342,9 @@ pub mod flow { "S3" => { s3 = ::serde::de::MapAccess::next_value(&mut map)?; } + "SAPOData" => { + sapo_data = ::serde::de::MapAccess::next_value(&mut map)?; + } "Salesforce" => { salesforce = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -4728,6 +5378,7 @@ pub mod flow { infor_nexus: infor_nexus, marketo: marketo, s3: s3, + sapo_data: sapo_data, salesforce: salesforce, service_now: service_now, singular: singular, @@ -4831,6 +5482,72 @@ pub mod flow { } } + /// The [`AWS::AppFlow::Flow.SuccessResponseHandlingConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-successresponsehandlingconfig.html) property type. + #[derive(Debug, Default)] + pub struct SuccessResponseHandlingConfig { + /// Property [`BucketName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-successresponsehandlingconfig.html#cfn-appflow-flow-successresponsehandlingconfig-bucketname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub bucket_name: Option<::Value>, + /// Property [`BucketPrefix`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-successresponsehandlingconfig.html#cfn-appflow-flow-successresponsehandlingconfig-bucketprefix). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub bucket_prefix: Option<::Value>, + } + + impl ::codec::SerializeValue for SuccessResponseHandlingConfig { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref bucket_name) = self.bucket_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BucketName", bucket_name)?; + } + if let Some(ref bucket_prefix) = self.bucket_prefix { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BucketPrefix", bucket_prefix)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for SuccessResponseHandlingConfig { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = SuccessResponseHandlingConfig; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type SuccessResponseHandlingConfig") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut bucket_name: Option<::Value> = None; + let mut bucket_prefix: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "BucketName" => { + bucket_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BucketPrefix" => { + bucket_prefix = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(SuccessResponseHandlingConfig { + bucket_name: bucket_name, + bucket_prefix: bucket_prefix, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::AppFlow::Flow.Task`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-task.html) property type. #[derive(Debug, Default)] pub struct Task { @@ -5264,6 +5981,26 @@ pub mod flow { /// The [`AWS::AppFlow::Flow.VeevaSourceProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-veevasourceproperties.html) property type. #[derive(Debug, Default)] pub struct VeevaSourceProperties { + /// Property [`DocumentType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-veevasourceproperties.html#cfn-appflow-flow-veevasourceproperties-documenttype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub document_type: Option<::Value>, + /// Property [`IncludeAllVersions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-veevasourceproperties.html#cfn-appflow-flow-veevasourceproperties-includeallversions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub include_all_versions: Option<::Value>, + /// Property [`IncludeRenditions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-veevasourceproperties.html#cfn-appflow-flow-veevasourceproperties-includerenditions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub include_renditions: Option<::Value>, + /// Property [`IncludeSourceFiles`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-veevasourceproperties.html#cfn-appflow-flow-veevasourceproperties-includesourcefiles). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub include_source_files: Option<::Value>, /// Property [`Object`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appflow-flow-veevasourceproperties.html#cfn-appflow-flow-veevasourceproperties-object). /// /// Update type: _Mutable_. @@ -5274,6 +6011,18 @@ pub mod flow { impl ::codec::SerializeValue for VeevaSourceProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref document_type) = self.document_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentType", document_type)?; + } + if let Some(ref include_all_versions) = self.include_all_versions { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludeAllVersions", include_all_versions)?; + } + if let Some(ref include_renditions) = self.include_renditions { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludeRenditions", include_renditions)?; + } + if let Some(ref include_source_files) = self.include_source_files { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludeSourceFiles", include_source_files)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "Object", &self.object)?; ::serde::ser::SerializeMap::end(map) } @@ -5291,10 +6040,26 @@ pub mod flow { } fn visit_map>(self, mut map: A) -> Result { + let mut document_type: Option<::Value> = None; + let mut include_all_versions: Option<::Value> = None; + let mut include_renditions: Option<::Value> = None; + let mut include_source_files: Option<::Value> = None; let mut object: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "DocumentType" => { + document_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IncludeAllVersions" => { + include_all_versions = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IncludeRenditions" => { + include_renditions = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IncludeSourceFiles" => { + include_source_files = ::serde::de::MapAccess::next_value(&mut map)?; + } "Object" => { object = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -5303,6 +6068,10 @@ pub mod flow { } Ok(VeevaSourceProperties { + document_type: document_type, + include_all_versions: include_all_versions, + include_renditions: include_renditions, + include_source_files: include_source_files, object: object.ok_or(::serde::de::Error::missing_field("Object"))?, }) } diff --git a/src/aws/appintegrations.rs b/src/aws/appintegrations.rs index 6037f9c..d29c62c 100644 --- a/src/aws/appintegrations.rs +++ b/src/aws/appintegrations.rs @@ -1,5 +1,140 @@ //! Types for the `AppIntegrations` service. +/// The [`AWS::AppIntegrations::DataIntegration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appintegrations-dataintegration.html) resource type. +#[derive(Debug, Default)] +pub struct DataIntegration { + properties: DataIntegrationProperties +} + +/// Properties for the `DataIntegration` resource. +#[derive(Debug, Default)] +pub struct DataIntegrationProperties { + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appintegrations-dataintegration.html#cfn-appintegrations-dataintegration-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`KmsKey`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appintegrations-dataintegration.html#cfn-appintegrations-dataintegration-kmskey). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub kms_key: ::Value, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appintegrations-dataintegration.html#cfn-appintegrations-dataintegration-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: ::Value, + /// Property [`ScheduleConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appintegrations-dataintegration.html#cfn-appintegrations-dataintegration-scheduleconfig). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub schedule_config: ::Value, + /// Property [`SourceURI`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appintegrations-dataintegration.html#cfn-appintegrations-dataintegration-sourceuri). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub source_uri: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appintegrations-dataintegration.html#cfn-appintegrations-dataintegration-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, +} + +impl ::serde::Serialize for DataIntegrationProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "KmsKey", &self.kms_key)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ScheduleConfig", &self.schedule_config)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourceURI", &self.source_uri)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for DataIntegrationProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = DataIntegrationProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type DataIntegrationProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut description: Option<::Value> = None; + let mut kms_key: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut schedule_config: Option<::Value> = None; + let mut source_uri: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "KmsKey" => { + kms_key = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ScheduleConfig" => { + schedule_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SourceURI" => { + source_uri = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(DataIntegrationProperties { + description: description, + kms_key: kms_key.ok_or(::serde::de::Error::missing_field("KmsKey"))?, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + schedule_config: schedule_config.ok_or(::serde::de::Error::missing_field("ScheduleConfig"))?, + source_uri: source_uri.ok_or(::serde::de::Error::missing_field("SourceURI"))?, + tags: tags, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for DataIntegration { + type Properties = DataIntegrationProperties; + const TYPE: &'static str = "AWS::AppIntegrations::DataIntegration"; + fn properties(&self) -> &DataIntegrationProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut DataIntegrationProperties { + &mut self.properties + } +} + +impl ::private::Sealed for DataIntegration {} + +impl From for DataIntegration { + fn from(properties: DataIntegrationProperties) -> DataIntegration { + DataIntegration { properties } + } +} + /// The [`AWS::AppIntegrations::EventIntegration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appintegrations-eventintegration.html) resource type. #[derive(Debug, Default)] pub struct EventIntegration { @@ -124,6 +259,83 @@ impl From for EventIntegration { } } +pub mod data_integration { + //! Property types for the `DataIntegration` resource. + + /// The [`AWS::AppIntegrations::DataIntegration.ScheduleConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appintegrations-dataintegration-scheduleconfig.html) property type. + #[derive(Debug, Default)] + pub struct ScheduleConfig { + /// Property [`FirstExecutionFrom`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appintegrations-dataintegration-scheduleconfig.html#cfn-appintegrations-dataintegration-scheduleconfig-firstexecutionfrom). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub first_execution_from: ::Value, + /// Property [`Object`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appintegrations-dataintegration-scheduleconfig.html#cfn-appintegrations-dataintegration-scheduleconfig-object). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub object: ::Value, + /// Property [`ScheduleExpression`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appintegrations-dataintegration-scheduleconfig.html#cfn-appintegrations-dataintegration-scheduleconfig-scheduleexpression). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub schedule_expression: ::Value, + } + + impl ::codec::SerializeValue for ScheduleConfig { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FirstExecutionFrom", &self.first_execution_from)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Object", &self.object)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ScheduleExpression", &self.schedule_expression)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ScheduleConfig { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ScheduleConfig; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ScheduleConfig") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut first_execution_from: Option<::Value> = None; + let mut object: Option<::Value> = None; + let mut schedule_expression: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "FirstExecutionFrom" => { + first_execution_from = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Object" => { + object = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ScheduleExpression" => { + schedule_expression = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ScheduleConfig { + first_execution_from: first_execution_from.ok_or(::serde::de::Error::missing_field("FirstExecutionFrom"))?, + object: object.ok_or(::serde::de::Error::missing_field("Object"))?, + schedule_expression: schedule_expression.ok_or(::serde::de::Error::missing_field("ScheduleExpression"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + pub mod event_integration { //! Property types for the `EventIntegration` resource. diff --git a/src/aws/applicationinsights.rs b/src/aws/applicationinsights.rs index 2295f9f..1398098 100644 --- a/src/aws/applicationinsights.rs +++ b/src/aws/applicationinsights.rs @@ -491,6 +491,16 @@ pub mod application { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub alarms: Option<::ValueList>, + /// Property [`HAClusterPrometheusExporter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-configurationdetails.html#cfn-applicationinsights-application-configurationdetails-haclusterprometheusexporter). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ha_cluster_prometheus_exporter: Option<::Value>, + /// Property [`HANAPrometheusExporter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-configurationdetails.html#cfn-applicationinsights-application-configurationdetails-hanaprometheusexporter). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub hana_prometheus_exporter: Option<::Value>, /// Property [`JMXPrometheusExporter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-configurationdetails.html#cfn-applicationinsights-application-configurationdetails-jmxprometheusexporter). /// /// Update type: _Mutable_. @@ -517,6 +527,12 @@ pub mod application { if let Some(ref alarms) = self.alarms { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Alarms", alarms)?; } + if let Some(ref ha_cluster_prometheus_exporter) = self.ha_cluster_prometheus_exporter { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HAClusterPrometheusExporter", ha_cluster_prometheus_exporter)?; + } + if let Some(ref hana_prometheus_exporter) = self.hana_prometheus_exporter { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HANAPrometheusExporter", hana_prometheus_exporter)?; + } if let Some(ref jmx_prometheus_exporter) = self.jmx_prometheus_exporter { ::serde::ser::SerializeMap::serialize_entry(&mut map, "JMXPrometheusExporter", jmx_prometheus_exporter)?; } @@ -544,6 +560,8 @@ pub mod application { fn visit_map>(self, mut map: A) -> Result { let mut alarm_metrics: Option<::ValueList> = None; let mut alarms: Option<::ValueList> = None; + let mut ha_cluster_prometheus_exporter: Option<::Value> = None; + let mut hana_prometheus_exporter: Option<::Value> = None; let mut jmx_prometheus_exporter: Option<::Value> = None; let mut logs: Option<::ValueList> = None; let mut windows_events: Option<::ValueList> = None; @@ -556,6 +574,12 @@ pub mod application { "Alarms" => { alarms = ::serde::de::MapAccess::next_value(&mut map)?; } + "HAClusterPrometheusExporter" => { + ha_cluster_prometheus_exporter = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HANAPrometheusExporter" => { + hana_prometheus_exporter = ::serde::de::MapAccess::next_value(&mut map)?; + } "JMXPrometheusExporter" => { jmx_prometheus_exporter = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -572,6 +596,8 @@ pub mod application { Ok(ConfigurationDetails { alarm_metrics: alarm_metrics, alarms: alarms, + ha_cluster_prometheus_exporter: ha_cluster_prometheus_exporter, + hana_prometheus_exporter: hana_prometheus_exporter, jmx_prometheus_exporter: jmx_prometheus_exporter, logs: logs, windows_events: windows_events, @@ -645,6 +671,156 @@ pub mod application { } } + /// The [`AWS::ApplicationInsights::Application.HAClusterPrometheusExporter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-haclusterprometheusexporter.html) property type. + #[derive(Debug, Default)] + pub struct HAClusterPrometheusExporter { + /// Property [`PrometheusPort`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-haclusterprometheusexporter.html#cfn-applicationinsights-application-haclusterprometheusexporter-prometheusport). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub prometheus_port: Option<::Value>, + } + + impl ::codec::SerializeValue for HAClusterPrometheusExporter { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref prometheus_port) = self.prometheus_port { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrometheusPort", prometheus_port)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for HAClusterPrometheusExporter { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = HAClusterPrometheusExporter; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type HAClusterPrometheusExporter") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut prometheus_port: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "PrometheusPort" => { + prometheus_port = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(HAClusterPrometheusExporter { + prometheus_port: prometheus_port, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::ApplicationInsights::Application.HANAPrometheusExporter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-hanaprometheusexporter.html) property type. + #[derive(Debug, Default)] + pub struct HANAPrometheusExporter { + /// Property [`AgreeToInstallHANADBClient`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-hanaprometheusexporter.html#cfn-applicationinsights-application-hanaprometheusexporter-agreetoinstallhanadbclient). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub agree_to_install_hanadb_client: ::Value, + /// Property [`HANAPort`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-hanaprometheusexporter.html#cfn-applicationinsights-application-hanaprometheusexporter-hanaport). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub hana_port: ::Value, + /// Property [`HANASID`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-hanaprometheusexporter.html#cfn-applicationinsights-application-hanaprometheusexporter-hanasid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub hanasid: ::Value, + /// Property [`HANASecretName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-hanaprometheusexporter.html#cfn-applicationinsights-application-hanaprometheusexporter-hanasecretname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub hana_secret_name: ::Value, + /// Property [`PrometheusPort`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-hanaprometheusexporter.html#cfn-applicationinsights-application-hanaprometheusexporter-prometheusport). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub prometheus_port: Option<::Value>, + } + + impl ::codec::SerializeValue for HANAPrometheusExporter { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AgreeToInstallHANADBClient", &self.agree_to_install_hanadb_client)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HANAPort", &self.hana_port)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HANASID", &self.hanasid)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HANASecretName", &self.hana_secret_name)?; + if let Some(ref prometheus_port) = self.prometheus_port { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrometheusPort", prometheus_port)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for HANAPrometheusExporter { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = HANAPrometheusExporter; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type HANAPrometheusExporter") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut agree_to_install_hanadb_client: Option<::Value> = None; + let mut hana_port: Option<::Value> = None; + let mut hanasid: Option<::Value> = None; + let mut hana_secret_name: Option<::Value> = None; + let mut prometheus_port: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AgreeToInstallHANADBClient" => { + agree_to_install_hanadb_client = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HANAPort" => { + hana_port = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HANASID" => { + hanasid = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HANASecretName" => { + hana_secret_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PrometheusPort" => { + prometheus_port = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(HANAPrometheusExporter { + agree_to_install_hanadb_client: agree_to_install_hanadb_client.ok_or(::serde::de::Error::missing_field("AgreeToInstallHANADBClient"))?, + hana_port: hana_port.ok_or(::serde::de::Error::missing_field("HANAPort"))?, + hanasid: hanasid.ok_or(::serde::de::Error::missing_field("HANASID"))?, + hana_secret_name: hana_secret_name.ok_or(::serde::de::Error::missing_field("HANASecretName"))?, + prometheus_port: prometheus_port, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::ApplicationInsights::Application.JMXPrometheusExporter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-applicationinsights-application-jmxprometheusexporter.html) property type. #[derive(Debug, Default)] pub struct JMXPrometheusExporter { diff --git a/src/aws/appmesh.rs b/src/aws/appmesh.rs index 8f4cb9c..fdf80d6 100644 --- a/src/aws/appmesh.rs +++ b/src/aws/appmesh.rs @@ -1187,6 +1187,11 @@ pub mod gateway_route { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub http_route: Option<::Value>, + /// Property [`Priority`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-gatewayroute-gatewayroutespec.html#cfn-appmesh-gatewayroute-gatewayroutespec-priority). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub priority: Option<::Value>, } impl ::codec::SerializeValue for GatewayRouteSpec { @@ -1201,6 +1206,9 @@ pub mod gateway_route { if let Some(ref http_route) = self.http_route { ::serde::ser::SerializeMap::serialize_entry(&mut map, "HttpRoute", http_route)?; } + if let Some(ref priority) = self.priority { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Priority", priority)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -1220,6 +1228,7 @@ pub mod gateway_route { let mut grpc_route: Option<::Value> = None; let mut http2_route: Option<::Value> = None; let mut http_route: Option<::Value> = None; + let mut priority: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { @@ -1232,6 +1241,9 @@ pub mod gateway_route { "HttpRoute" => { http_route = ::serde::de::MapAccess::next_value(&mut map)?; } + "Priority" => { + priority = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } @@ -1240,6 +1252,7 @@ pub mod gateway_route { grpc_route: grpc_route, http2_route: http2_route, http_route: http_route, + priority: priority, }) } } @@ -2547,6 +2560,38 @@ pub mod mesh { } } + /// The [`AWS::AppMesh::Mesh.MeshServiceDiscovery`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-mesh-meshservicediscovery.html) property type. + #[derive(Debug, Default)] + pub struct MeshServiceDiscovery { + } + + impl ::codec::SerializeValue for MeshServiceDiscovery { + fn serialize(&self, s: S) -> Result { + let map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for MeshServiceDiscovery { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MeshServiceDiscovery; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MeshServiceDiscovery") + } + + fn visit_map>(self, _map: A) -> Result { + Ok(MeshServiceDiscovery {}) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::AppMesh::Mesh.MeshSpec`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appmesh-mesh-meshspec.html) property type. #[derive(Debug, Default)] pub struct MeshSpec { diff --git a/src/aws/apprunner.rs b/src/aws/apprunner.rs index e3f8284..ec42df7 100644 --- a/src/aws/apprunner.rs +++ b/src/aws/apprunner.rs @@ -29,6 +29,11 @@ pub struct ServiceProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub instance_configuration: Option<::Value>, + /// Property [`NetworkConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-service.html#cfn-apprunner-service-networkconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub network_configuration: Option<::Value>, /// Property [`ServiceName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-service.html#cfn-apprunner-service-servicename). /// /// Update type: _Immutable_. @@ -61,6 +66,9 @@ impl ::serde::Serialize for ServiceProperties { if let Some(ref instance_configuration) = self.instance_configuration { ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceConfiguration", instance_configuration)?; } + if let Some(ref network_configuration) = self.network_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkConfiguration", network_configuration)?; + } if let Some(ref service_name) = self.service_name { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServiceName", service_name)?; } @@ -88,6 +96,7 @@ impl<'de> ::serde::Deserialize<'de> for ServiceProperties { let mut encryption_configuration: Option<::Value> = None; let mut health_check_configuration: Option<::Value> = None; let mut instance_configuration: Option<::Value> = None; + let mut network_configuration: Option<::Value> = None; let mut service_name: Option<::Value> = None; let mut source_configuration: Option<::Value> = None; let mut tags: Option<::ValueList<::Tag>> = None; @@ -106,6 +115,9 @@ impl<'de> ::serde::Deserialize<'de> for ServiceProperties { "InstanceConfiguration" => { instance_configuration = ::serde::de::MapAccess::next_value(&mut map)?; } + "NetworkConfiguration" => { + network_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } "ServiceName" => { service_name = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -124,6 +136,7 @@ impl<'de> ::serde::Deserialize<'de> for ServiceProperties { encryption_configuration: encryption_configuration, health_check_configuration: health_check_configuration, instance_configuration: instance_configuration, + network_configuration: network_configuration, service_name: service_name, source_configuration: source_configuration.ok_or(::serde::de::Error::missing_field("SourceConfiguration"))?, tags: tags, @@ -154,6 +167,121 @@ impl From for Service { } } +/// The [`AWS::AppRunner::VpcConnector`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-vpcconnector.html) resource type. +#[derive(Debug, Default)] +pub struct VpcConnector { + properties: VpcConnectorProperties +} + +/// Properties for the `VpcConnector` resource. +#[derive(Debug, Default)] +pub struct VpcConnectorProperties { + /// Property [`SecurityGroups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-vpcconnector.html#cfn-apprunner-vpcconnector-securitygroups). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub security_groups: Option<::ValueList>, + /// Property [`Subnets`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-vpcconnector.html#cfn-apprunner-vpcconnector-subnets). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub subnets: ::ValueList, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-vpcconnector.html#cfn-apprunner-vpcconnector-tags). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`VpcConnectorName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apprunner-vpcconnector.html#cfn-apprunner-vpcconnector-vpcconnectorname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub vpc_connector_name: Option<::Value>, +} + +impl ::serde::Serialize for VpcConnectorProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref security_groups) = self.security_groups { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityGroups", security_groups)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Subnets", &self.subnets)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + if let Some(ref vpc_connector_name) = self.vpc_connector_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcConnectorName", vpc_connector_name)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for VpcConnectorProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = VpcConnectorProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type VpcConnectorProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut security_groups: Option<::ValueList> = None; + let mut subnets: Option<::ValueList> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut vpc_connector_name: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "SecurityGroups" => { + security_groups = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Subnets" => { + subnets = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VpcConnectorName" => { + vpc_connector_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(VpcConnectorProperties { + security_groups: security_groups, + subnets: subnets.ok_or(::serde::de::Error::missing_field("Subnets"))?, + tags: tags, + vpc_connector_name: vpc_connector_name, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for VpcConnector { + type Properties = VpcConnectorProperties; + const TYPE: &'static str = "AWS::AppRunner::VpcConnector"; + fn properties(&self) -> &VpcConnectorProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut VpcConnectorProperties { + &mut self.properties + } +} + +impl ::private::Sealed for VpcConnector {} + +impl From for VpcConnector { + fn from(properties: VpcConnectorProperties) -> VpcConnector { + VpcConnector { properties } + } +} + pub mod service { //! Property types for the `Service` resource. @@ -465,6 +593,70 @@ pub mod service { } } + /// The [`AWS::AppRunner::Service.EgressConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-egressconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct EgressConfiguration { + /// Property [`EgressType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-egressconfiguration.html#cfn-apprunner-service-egressconfiguration-egresstype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub egress_type: ::Value, + /// Property [`VpcConnectorArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-egressconfiguration.html#cfn-apprunner-service-egressconfiguration-vpcconnectorarn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub vpc_connector_arn: Option<::Value>, + } + + impl ::codec::SerializeValue for EgressConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EgressType", &self.egress_type)?; + if let Some(ref vpc_connector_arn) = self.vpc_connector_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcConnectorArn", vpc_connector_arn)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for EgressConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = EgressConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type EgressConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut egress_type: Option<::Value> = None; + let mut vpc_connector_arn: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "EgressType" => { + egress_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VpcConnectorArn" => { + vpc_connector_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(EgressConfiguration { + egress_type: egress_type.ok_or(::serde::de::Error::missing_field("EgressType"))?, + vpc_connector_arn: vpc_connector_arn, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::AppRunner::Service.EncryptionConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-encryptionconfiguration.html) property type. #[derive(Debug, Default)] pub struct EncryptionConfiguration { @@ -933,6 +1125,57 @@ pub mod service { } } + /// The [`AWS::AppRunner::Service.NetworkConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-networkconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct NetworkConfiguration { + /// Property [`EgressConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-networkconfiguration.html#cfn-apprunner-service-networkconfiguration-egressconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub egress_configuration: ::Value, + } + + impl ::codec::SerializeValue for NetworkConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EgressConfiguration", &self.egress_configuration)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for NetworkConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = NetworkConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type NetworkConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut egress_configuration: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "EgressConfiguration" => { + egress_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(NetworkConfiguration { + egress_configuration: egress_configuration.ok_or(::serde::de::Error::missing_field("EgressConfiguration"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::AppRunner::Service.SourceCodeVersion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apprunner-service-sourcecodeversion.html) property type. #[derive(Debug, Default)] pub struct SourceCodeVersion { diff --git a/src/aws/appstream.rs b/src/aws/appstream.rs index 54b0619..57a6f06 100644 --- a/src/aws/appstream.rs +++ b/src/aws/appstream.rs @@ -1,76 +1,729 @@ //! Types for the `AppStream` service. +/// The [`AWS::AppStream::AppBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html) resource type. +#[derive(Debug, Default)] +pub struct AppBlock { + properties: AppBlockProperties +} + +/// Properties for the `AppBlock` resource. +#[derive(Debug, Default)] +pub struct AppBlockProperties { + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html#cfn-appstream-appblock-description). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub description: Option<::Value>, + /// Property [`DisplayName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html#cfn-appstream-appblock-displayname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub display_name: Option<::Value>, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html#cfn-appstream-appblock-name). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub name: ::Value, + /// Property [`SetupScriptDetails`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html#cfn-appstream-appblock-setupscriptdetails). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub setup_script_details: ::Value, + /// Property [`SourceS3Location`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html#cfn-appstream-appblock-sources3location). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub source_s3_location: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-appblock.html#cfn-appstream-appblock-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, +} + +impl ::serde::Serialize for AppBlockProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + if let Some(ref display_name) = self.display_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DisplayName", display_name)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SetupScriptDetails", &self.setup_script_details)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourceS3Location", &self.source_s3_location)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for AppBlockProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AppBlockProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AppBlockProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut description: Option<::Value> = None; + let mut display_name: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut setup_script_details: Option<::Value> = None; + let mut source_s3_location: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DisplayName" => { + display_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SetupScriptDetails" => { + setup_script_details = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SourceS3Location" => { + source_s3_location = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AppBlockProperties { + description: description, + display_name: display_name, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + setup_script_details: setup_script_details.ok_or(::serde::de::Error::missing_field("SetupScriptDetails"))?, + source_s3_location: source_s3_location.ok_or(::serde::de::Error::missing_field("SourceS3Location"))?, + tags: tags, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for AppBlock { + type Properties = AppBlockProperties; + const TYPE: &'static str = "AWS::AppStream::AppBlock"; + fn properties(&self) -> &AppBlockProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut AppBlockProperties { + &mut self.properties + } +} + +impl ::private::Sealed for AppBlock {} + +impl From for AppBlock { + fn from(properties: AppBlockProperties) -> AppBlock { + AppBlock { properties } + } +} + +/// The [`AWS::AppStream::Application`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html) resource type. +#[derive(Debug, Default)] +pub struct Application { + properties: ApplicationProperties +} + +/// Properties for the `Application` resource. +#[derive(Debug, Default)] +pub struct ApplicationProperties { + /// Property [`AppBlockArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-appblockarn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub app_block_arn: ::Value, + /// Property [`AttributesToDelete`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-attributestodelete). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub attributes_to_delete: Option<::ValueList>, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`DisplayName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-displayname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub display_name: Option<::Value>, + /// Property [`IconS3Location`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-icons3location). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub icon_s3_location: ::Value, + /// Property [`InstanceFamilies`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-instancefamilies). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub instance_families: ::ValueList, + /// Property [`LaunchParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-launchparameters). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub launch_parameters: Option<::Value>, + /// Property [`LaunchPath`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-launchpath). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub launch_path: ::Value, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-name). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub name: ::Value, + /// Property [`Platforms`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-platforms). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub platforms: ::ValueList, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`WorkingDirectory`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-application.html#cfn-appstream-application-workingdirectory). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub working_directory: Option<::Value>, +} + +impl ::serde::Serialize for ApplicationProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AppBlockArn", &self.app_block_arn)?; + if let Some(ref attributes_to_delete) = self.attributes_to_delete { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AttributesToDelete", attributes_to_delete)?; + } + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + if let Some(ref display_name) = self.display_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DisplayName", display_name)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IconS3Location", &self.icon_s3_location)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceFamilies", &self.instance_families)?; + if let Some(ref launch_parameters) = self.launch_parameters { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchParameters", launch_parameters)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchPath", &self.launch_path)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Platforms", &self.platforms)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + if let Some(ref working_directory) = self.working_directory { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "WorkingDirectory", working_directory)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for ApplicationProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ApplicationProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ApplicationProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut app_block_arn: Option<::Value> = None; + let mut attributes_to_delete: Option<::ValueList> = None; + let mut description: Option<::Value> = None; + let mut display_name: Option<::Value> = None; + let mut icon_s3_location: Option<::Value> = None; + let mut instance_families: Option<::ValueList> = None; + let mut launch_parameters: Option<::Value> = None; + let mut launch_path: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut platforms: Option<::ValueList> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut working_directory: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AppBlockArn" => { + app_block_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AttributesToDelete" => { + attributes_to_delete = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DisplayName" => { + display_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IconS3Location" => { + icon_s3_location = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceFamilies" => { + instance_families = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LaunchParameters" => { + launch_parameters = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LaunchPath" => { + launch_path = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Platforms" => { + platforms = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "WorkingDirectory" => { + working_directory = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ApplicationProperties { + app_block_arn: app_block_arn.ok_or(::serde::de::Error::missing_field("AppBlockArn"))?, + attributes_to_delete: attributes_to_delete, + description: description, + display_name: display_name, + icon_s3_location: icon_s3_location.ok_or(::serde::de::Error::missing_field("IconS3Location"))?, + instance_families: instance_families.ok_or(::serde::de::Error::missing_field("InstanceFamilies"))?, + launch_parameters: launch_parameters, + launch_path: launch_path.ok_or(::serde::de::Error::missing_field("LaunchPath"))?, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + platforms: platforms.ok_or(::serde::de::Error::missing_field("Platforms"))?, + tags: tags, + working_directory: working_directory, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for Application { + type Properties = ApplicationProperties; + const TYPE: &'static str = "AWS::AppStream::Application"; + fn properties(&self) -> &ApplicationProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut ApplicationProperties { + &mut self.properties + } +} + +impl ::private::Sealed for Application {} + +impl From for Application { + fn from(properties: ApplicationProperties) -> Application { + Application { properties } + } +} + +/// The [`AWS::AppStream::ApplicationEntitlementAssociation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-applicationentitlementassociation.html) resource type. +#[derive(Debug, Default)] +pub struct ApplicationEntitlementAssociation { + properties: ApplicationEntitlementAssociationProperties +} + +/// Properties for the `ApplicationEntitlementAssociation` resource. +#[derive(Debug, Default)] +pub struct ApplicationEntitlementAssociationProperties { + /// Property [`ApplicationIdentifier`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-applicationentitlementassociation.html#cfn-appstream-applicationentitlementassociation-applicationidentifier). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub application_identifier: ::Value, + /// Property [`EntitlementName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-applicationentitlementassociation.html#cfn-appstream-applicationentitlementassociation-entitlementname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub entitlement_name: ::Value, + /// Property [`StackName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-applicationentitlementassociation.html#cfn-appstream-applicationentitlementassociation-stackname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub stack_name: ::Value, +} + +impl ::serde::Serialize for ApplicationEntitlementAssociationProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ApplicationIdentifier", &self.application_identifier)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EntitlementName", &self.entitlement_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "StackName", &self.stack_name)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for ApplicationEntitlementAssociationProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ApplicationEntitlementAssociationProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ApplicationEntitlementAssociationProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut application_identifier: Option<::Value> = None; + let mut entitlement_name: Option<::Value> = None; + let mut stack_name: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ApplicationIdentifier" => { + application_identifier = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EntitlementName" => { + entitlement_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "StackName" => { + stack_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ApplicationEntitlementAssociationProperties { + application_identifier: application_identifier.ok_or(::serde::de::Error::missing_field("ApplicationIdentifier"))?, + entitlement_name: entitlement_name.ok_or(::serde::de::Error::missing_field("EntitlementName"))?, + stack_name: stack_name.ok_or(::serde::de::Error::missing_field("StackName"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for ApplicationEntitlementAssociation { + type Properties = ApplicationEntitlementAssociationProperties; + const TYPE: &'static str = "AWS::AppStream::ApplicationEntitlementAssociation"; + fn properties(&self) -> &ApplicationEntitlementAssociationProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut ApplicationEntitlementAssociationProperties { + &mut self.properties + } +} + +impl ::private::Sealed for ApplicationEntitlementAssociation {} + +impl From for ApplicationEntitlementAssociation { + fn from(properties: ApplicationEntitlementAssociationProperties) -> ApplicationEntitlementAssociation { + ApplicationEntitlementAssociation { properties } + } +} + +/// The [`AWS::AppStream::ApplicationFleetAssociation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-applicationfleetassociation.html) resource type. +#[derive(Debug, Default)] +pub struct ApplicationFleetAssociation { + properties: ApplicationFleetAssociationProperties +} + +/// Properties for the `ApplicationFleetAssociation` resource. +#[derive(Debug, Default)] +pub struct ApplicationFleetAssociationProperties { + /// Property [`ApplicationArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-applicationfleetassociation.html#cfn-appstream-applicationfleetassociation-applicationarn). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub application_arn: ::Value, + /// Property [`FleetName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-applicationfleetassociation.html#cfn-appstream-applicationfleetassociation-fleetname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub fleet_name: ::Value, +} + +impl ::serde::Serialize for ApplicationFleetAssociationProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ApplicationArn", &self.application_arn)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FleetName", &self.fleet_name)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for ApplicationFleetAssociationProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ApplicationFleetAssociationProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ApplicationFleetAssociationProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut application_arn: Option<::Value> = None; + let mut fleet_name: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ApplicationArn" => { + application_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FleetName" => { + fleet_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ApplicationFleetAssociationProperties { + application_arn: application_arn.ok_or(::serde::de::Error::missing_field("ApplicationArn"))?, + fleet_name: fleet_name.ok_or(::serde::de::Error::missing_field("FleetName"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for ApplicationFleetAssociation { + type Properties = ApplicationFleetAssociationProperties; + const TYPE: &'static str = "AWS::AppStream::ApplicationFleetAssociation"; + fn properties(&self) -> &ApplicationFleetAssociationProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut ApplicationFleetAssociationProperties { + &mut self.properties + } +} + +impl ::private::Sealed for ApplicationFleetAssociation {} + +impl From for ApplicationFleetAssociation { + fn from(properties: ApplicationFleetAssociationProperties) -> ApplicationFleetAssociation { + ApplicationFleetAssociation { properties } + } +} + /// The [`AWS::AppStream::DirectoryConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-directoryconfig.html) resource type. #[derive(Debug, Default)] -pub struct DirectoryConfig { - properties: DirectoryConfigProperties +pub struct DirectoryConfig { + properties: DirectoryConfigProperties +} + +/// Properties for the `DirectoryConfig` resource. +#[derive(Debug, Default)] +pub struct DirectoryConfigProperties { + /// Property [`DirectoryName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-directoryconfig.html#cfn-appstream-directoryconfig-directoryname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub directory_name: ::Value, + /// Property [`OrganizationalUnitDistinguishedNames`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-directoryconfig.html#cfn-appstream-directoryconfig-organizationalunitdistinguishednames). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub organizational_unit_distinguished_names: ::ValueList, + /// Property [`ServiceAccountCredentials`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-directoryconfig.html#cfn-appstream-directoryconfig-serviceaccountcredentials). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub service_account_credentials: ::Value, +} + +impl ::serde::Serialize for DirectoryConfigProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DirectoryName", &self.directory_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OrganizationalUnitDistinguishedNames", &self.organizational_unit_distinguished_names)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServiceAccountCredentials", &self.service_account_credentials)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for DirectoryConfigProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = DirectoryConfigProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type DirectoryConfigProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut directory_name: Option<::Value> = None; + let mut organizational_unit_distinguished_names: Option<::ValueList> = None; + let mut service_account_credentials: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DirectoryName" => { + directory_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OrganizationalUnitDistinguishedNames" => { + organizational_unit_distinguished_names = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ServiceAccountCredentials" => { + service_account_credentials = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(DirectoryConfigProperties { + directory_name: directory_name.ok_or(::serde::de::Error::missing_field("DirectoryName"))?, + organizational_unit_distinguished_names: organizational_unit_distinguished_names.ok_or(::serde::de::Error::missing_field("OrganizationalUnitDistinguishedNames"))?, + service_account_credentials: service_account_credentials.ok_or(::serde::de::Error::missing_field("ServiceAccountCredentials"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for DirectoryConfig { + type Properties = DirectoryConfigProperties; + const TYPE: &'static str = "AWS::AppStream::DirectoryConfig"; + fn properties(&self) -> &DirectoryConfigProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut DirectoryConfigProperties { + &mut self.properties + } +} + +impl ::private::Sealed for DirectoryConfig {} + +impl From for DirectoryConfig { + fn from(properties: DirectoryConfigProperties) -> DirectoryConfig { + DirectoryConfig { properties } + } +} + +/// The [`AWS::AppStream::Entitlement`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-entitlement.html) resource type. +#[derive(Debug, Default)] +pub struct Entitlement { + properties: EntitlementProperties } -/// Properties for the `DirectoryConfig` resource. +/// Properties for the `Entitlement` resource. #[derive(Debug, Default)] -pub struct DirectoryConfigProperties { - /// Property [`DirectoryName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-directoryconfig.html#cfn-appstream-directoryconfig-directoryname). +pub struct EntitlementProperties { + /// Property [`AppVisibility`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-entitlement.html#cfn-appstream-entitlement-appvisibility). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub directory_name: ::Value, - /// Property [`OrganizationalUnitDistinguishedNames`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-directoryconfig.html#cfn-appstream-directoryconfig-organizationalunitdistinguishednames). + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub app_visibility: ::Value, + /// Property [`Attributes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-entitlement.html#cfn-appstream-entitlement-attributes). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub organizational_unit_distinguished_names: ::ValueList, - /// Property [`ServiceAccountCredentials`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-directoryconfig.html#cfn-appstream-directoryconfig-serviceaccountcredentials). + pub attributes: ::ValueList, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-entitlement.html#cfn-appstream-entitlement-description). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub service_account_credentials: ::Value, + pub description: Option<::Value>, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-entitlement.html#cfn-appstream-entitlement-name). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub name: ::Value, + /// Property [`StackName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-entitlement.html#cfn-appstream-entitlement-stackname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub stack_name: ::Value, } -impl ::serde::Serialize for DirectoryConfigProperties { +impl ::serde::Serialize for EntitlementProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DirectoryName", &self.directory_name)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "OrganizationalUnitDistinguishedNames", &self.organizational_unit_distinguished_names)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServiceAccountCredentials", &self.service_account_credentials)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AppVisibility", &self.app_visibility)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Attributes", &self.attributes)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "StackName", &self.stack_name)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for DirectoryConfigProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for EntitlementProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = DirectoryConfigProperties; + type Value = EntitlementProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type DirectoryConfigProperties") + write!(f, "a struct of type EntitlementProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut directory_name: Option<::Value> = None; - let mut organizational_unit_distinguished_names: Option<::ValueList> = None; - let mut service_account_credentials: Option<::Value> = None; + let mut app_visibility: Option<::Value> = None; + let mut attributes: Option<::ValueList> = None; + let mut description: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut stack_name: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "DirectoryName" => { - directory_name = ::serde::de::MapAccess::next_value(&mut map)?; + "AppVisibility" => { + app_visibility = ::serde::de::MapAccess::next_value(&mut map)?; } - "OrganizationalUnitDistinguishedNames" => { - organizational_unit_distinguished_names = ::serde::de::MapAccess::next_value(&mut map)?; + "Attributes" => { + attributes = ::serde::de::MapAccess::next_value(&mut map)?; } - "ServiceAccountCredentials" => { - service_account_credentials = ::serde::de::MapAccess::next_value(&mut map)?; + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "StackName" => { + stack_name = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(DirectoryConfigProperties { - directory_name: directory_name.ok_or(::serde::de::Error::missing_field("DirectoryName"))?, - organizational_unit_distinguished_names: organizational_unit_distinguished_names.ok_or(::serde::de::Error::missing_field("OrganizationalUnitDistinguishedNames"))?, - service_account_credentials: service_account_credentials.ok_or(::serde::de::Error::missing_field("ServiceAccountCredentials"))?, + Ok(EntitlementProperties { + app_visibility: app_visibility.ok_or(::serde::de::Error::missing_field("AppVisibility"))?, + attributes: attributes.ok_or(::serde::de::Error::missing_field("Attributes"))?, + description: description, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + stack_name: stack_name.ok_or(::serde::de::Error::missing_field("StackName"))?, }) } } @@ -79,22 +732,22 @@ impl<'de> ::serde::Deserialize<'de> for DirectoryConfigProperties { } } -impl ::Resource for DirectoryConfig { - type Properties = DirectoryConfigProperties; - const TYPE: &'static str = "AWS::AppStream::DirectoryConfig"; - fn properties(&self) -> &DirectoryConfigProperties { +impl ::Resource for Entitlement { + type Properties = EntitlementProperties; + const TYPE: &'static str = "AWS::AppStream::Entitlement"; + fn properties(&self) -> &EntitlementProperties { &self.properties } - fn properties_mut(&mut self) -> &mut DirectoryConfigProperties { + fn properties_mut(&mut self) -> &mut EntitlementProperties { &mut self.properties } } -impl ::private::Sealed for DirectoryConfig {} +impl ::private::Sealed for Entitlement {} -impl From for DirectoryConfig { - fn from(properties: DirectoryConfigProperties) -> DirectoryConfig { - DirectoryConfig { properties } +impl From for Entitlement { + fn from(properties: EntitlementProperties) -> Entitlement { + Entitlement { properties } } } @@ -111,7 +764,7 @@ pub struct FleetProperties { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub compute_capacity: ::Value, + pub compute_capacity: Option<::Value>, /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-description). /// /// Update type: _Mutable_. @@ -167,6 +820,11 @@ pub struct FleetProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub instance_type: ::Value, + /// Property [`MaxConcurrentSessions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-maxconcurrentsessions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub max_concurrent_sessions: Option<::Value>, /// Property [`MaxUserDurationInSeconds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-maxuserdurationinseconds). /// /// Update type: _Mutable_. @@ -177,6 +835,11 @@ pub struct FleetProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub name: ::Value, + /// Property [`Platform`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-platform). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub platform: Option<::Value>, /// Property [`StreamView`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-streamview). /// /// Update type: _Mutable_. @@ -187,6 +850,11 @@ pub struct FleetProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub tags: Option<::ValueList<::Tag>>, + /// Property [`UsbDeviceFilterStrings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-usbdevicefilterstrings). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub usb_device_filter_strings: Option<::ValueList>, /// Property [`VpcConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appstream-fleet.html#cfn-appstream-fleet-vpcconfig). /// /// Update type: _Mutable_. @@ -197,7 +865,9 @@ pub struct FleetProperties { impl ::serde::Serialize for FleetProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ComputeCapacity", &self.compute_capacity)?; + if let Some(ref compute_capacity) = self.compute_capacity { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ComputeCapacity", compute_capacity)?; + } if let Some(ref description) = self.description { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; } @@ -229,16 +899,25 @@ impl ::serde::Serialize for FleetProperties { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ImageName", image_name)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceType", &self.instance_type)?; + if let Some(ref max_concurrent_sessions) = self.max_concurrent_sessions { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxConcurrentSessions", max_concurrent_sessions)?; + } if let Some(ref max_user_duration_in_seconds) = self.max_user_duration_in_seconds { ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxUserDurationInSeconds", max_user_duration_in_seconds)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + if let Some(ref platform) = self.platform { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Platform", platform)?; + } if let Some(ref stream_view) = self.stream_view { ::serde::ser::SerializeMap::serialize_entry(&mut map, "StreamView", stream_view)?; } if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } + if let Some(ref usb_device_filter_strings) = self.usb_device_filter_strings { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UsbDeviceFilterStrings", usb_device_filter_strings)?; + } if let Some(ref vpc_config) = self.vpc_config { ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcConfig", vpc_config)?; } @@ -270,10 +949,13 @@ impl<'de> ::serde::Deserialize<'de> for FleetProperties { let mut image_arn: Option<::Value> = None; let mut image_name: Option<::Value> = None; let mut instance_type: Option<::Value> = None; + let mut max_concurrent_sessions: Option<::Value> = None; let mut max_user_duration_in_seconds: Option<::Value> = None; let mut name: Option<::Value> = None; + let mut platform: Option<::Value> = None; let mut stream_view: Option<::Value> = None; let mut tags: Option<::ValueList<::Tag>> = None; + let mut usb_device_filter_strings: Option<::ValueList> = None; let mut vpc_config: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { @@ -314,18 +996,27 @@ impl<'de> ::serde::Deserialize<'de> for FleetProperties { "InstanceType" => { instance_type = ::serde::de::MapAccess::next_value(&mut map)?; } + "MaxConcurrentSessions" => { + max_concurrent_sessions = ::serde::de::MapAccess::next_value(&mut map)?; + } "MaxUserDurationInSeconds" => { max_user_duration_in_seconds = ::serde::de::MapAccess::next_value(&mut map)?; } "Name" => { name = ::serde::de::MapAccess::next_value(&mut map)?; } + "Platform" => { + platform = ::serde::de::MapAccess::next_value(&mut map)?; + } "StreamView" => { stream_view = ::serde::de::MapAccess::next_value(&mut map)?; } "Tags" => { tags = ::serde::de::MapAccess::next_value(&mut map)?; } + "UsbDeviceFilterStrings" => { + usb_device_filter_strings = ::serde::de::MapAccess::next_value(&mut map)?; + } "VpcConfig" => { vpc_config = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -334,7 +1025,7 @@ impl<'de> ::serde::Deserialize<'de> for FleetProperties { } Ok(FleetProperties { - compute_capacity: compute_capacity.ok_or(::serde::de::Error::missing_field("ComputeCapacity"))?, + compute_capacity: compute_capacity, description: description, disconnect_timeout_in_seconds: disconnect_timeout_in_seconds, display_name: display_name, @@ -346,10 +1037,13 @@ impl<'de> ::serde::Deserialize<'de> for FleetProperties { image_arn: image_arn, image_name: image_name, instance_type: instance_type.ok_or(::serde::de::Error::missing_field("InstanceType"))?, + max_concurrent_sessions: max_concurrent_sessions, max_user_duration_in_seconds: max_user_duration_in_seconds, name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + platform: platform, stream_view: stream_view, tags: tags, + usb_device_filter_strings: usb_device_filter_strings, vpc_config: vpc_config, }) } @@ -1166,6 +1860,224 @@ impl From for User { } } +pub mod app_block { + //! Property types for the `AppBlock` resource. + + /// The [`AWS::AppStream::AppBlock.S3Location`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-s3location.html) property type. + #[derive(Debug, Default)] + pub struct S3Location { + /// Property [`S3Bucket`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-s3location.html#cfn-appstream-appblock-s3location-s3bucket). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub s3_bucket: ::Value, + /// Property [`S3Key`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-s3location.html#cfn-appstream-appblock-s3location-s3key). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub s3_key: ::Value, + } + + impl ::codec::SerializeValue for S3Location { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3Bucket", &self.s3_bucket)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3Key", &self.s3_key)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for S3Location { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = S3Location; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type S3Location") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut s3_bucket: Option<::Value> = None; + let mut s3_key: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "S3Bucket" => { + s3_bucket = ::serde::de::MapAccess::next_value(&mut map)?; + } + "S3Key" => { + s3_key = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(S3Location { + s3_bucket: s3_bucket.ok_or(::serde::de::Error::missing_field("S3Bucket"))?, + s3_key: s3_key.ok_or(::serde::de::Error::missing_field("S3Key"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AppStream::AppBlock.ScriptDetails`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-scriptdetails.html) property type. + #[derive(Debug, Default)] + pub struct ScriptDetails { + /// Property [`ExecutableParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-scriptdetails.html#cfn-appstream-appblock-scriptdetails-executableparameters). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub executable_parameters: Option<::Value>, + /// Property [`ExecutablePath`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-scriptdetails.html#cfn-appstream-appblock-scriptdetails-executablepath). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub executable_path: ::Value, + /// Property [`ScriptS3Location`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-scriptdetails.html#cfn-appstream-appblock-scriptdetails-scripts3location). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub script_s3_location: ::Value, + /// Property [`TimeoutInSeconds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-appblock-scriptdetails.html#cfn-appstream-appblock-scriptdetails-timeoutinseconds). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub timeout_in_seconds: ::Value, + } + + impl ::codec::SerializeValue for ScriptDetails { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref executable_parameters) = self.executable_parameters { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExecutableParameters", executable_parameters)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExecutablePath", &self.executable_path)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ScriptS3Location", &self.script_s3_location)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TimeoutInSeconds", &self.timeout_in_seconds)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ScriptDetails { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ScriptDetails; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ScriptDetails") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut executable_parameters: Option<::Value> = None; + let mut executable_path: Option<::Value> = None; + let mut script_s3_location: Option<::Value> = None; + let mut timeout_in_seconds: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ExecutableParameters" => { + executable_parameters = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ExecutablePath" => { + executable_path = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ScriptS3Location" => { + script_s3_location = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TimeoutInSeconds" => { + timeout_in_seconds = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ScriptDetails { + executable_parameters: executable_parameters, + executable_path: executable_path.ok_or(::serde::de::Error::missing_field("ExecutablePath"))?, + script_s3_location: script_s3_location.ok_or(::serde::de::Error::missing_field("ScriptS3Location"))?, + timeout_in_seconds: timeout_in_seconds.ok_or(::serde::de::Error::missing_field("TimeoutInSeconds"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + +pub mod application { + //! Property types for the `Application` resource. + + /// The [`AWS::AppStream::Application.S3Location`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-application-s3location.html) property type. + #[derive(Debug, Default)] + pub struct S3Location { + /// Property [`S3Bucket`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-application-s3location.html#cfn-appstream-application-s3location-s3bucket). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub s3_bucket: ::Value, + /// Property [`S3Key`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-application-s3location.html#cfn-appstream-application-s3location-s3key). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub s3_key: ::Value, + } + + impl ::codec::SerializeValue for S3Location { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3Bucket", &self.s3_bucket)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3Key", &self.s3_key)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for S3Location { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = S3Location; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type S3Location") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut s3_bucket: Option<::Value> = None; + let mut s3_key: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "S3Bucket" => { + s3_bucket = ::serde::de::MapAccess::next_value(&mut map)?; + } + "S3Key" => { + s3_key = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(S3Location { + s3_bucket: s3_bucket.ok_or(::serde::de::Error::missing_field("S3Bucket"))?, + s3_key: s3_key.ok_or(::serde::de::Error::missing_field("S3Key"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + pub mod directory_config { //! Property types for the `DirectoryConfig` resource. @@ -1232,6 +2144,72 @@ pub mod directory_config { } } +pub mod entitlement { + //! Property types for the `Entitlement` resource. + + /// The [`AWS::AppStream::Entitlement.Attribute`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-entitlement-attribute.html) property type. + #[derive(Debug, Default)] + pub struct Attribute { + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-entitlement-attribute.html#cfn-appstream-entitlement-attribute-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: ::Value, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appstream-entitlement-attribute.html#cfn-appstream-entitlement-attribute-value). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub value: ::Value, + } + + impl ::codec::SerializeValue for Attribute { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", &self.value)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Attribute { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Attribute; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Attribute") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut name: Option<::Value> = None; + let mut value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Attribute { + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + value: value.ok_or(::serde::de::Error::missing_field("Value"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + pub mod fleet { //! Property types for the `Fleet` resource. diff --git a/src/aws/appsync.rs b/src/aws/appsync.rs index ffe772b..e3bfbba 100644 --- a/src/aws/appsync.rs +++ b/src/aws/appsync.rs @@ -294,6 +294,11 @@ pub struct DataSourceProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub name: ::Value, + /// Property [`OpenSearchServiceConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-datasource.html#cfn-appsync-datasource-opensearchserviceconfig). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub open_search_service_config: Option<::Value>, /// Property [`RelationalDatabaseConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-datasource.html#cfn-appsync-datasource-relationaldatabaseconfig). /// /// Update type: _Mutable_. @@ -331,6 +336,9 @@ impl ::serde::Serialize for DataSourceProperties { ::serde::ser::SerializeMap::serialize_entry(&mut map, "LambdaConfig", lambda_config)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + if let Some(ref open_search_service_config) = self.open_search_service_config { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OpenSearchServiceConfig", open_search_service_config)?; + } if let Some(ref relational_database_config) = self.relational_database_config { ::serde::ser::SerializeMap::serialize_entry(&mut map, "RelationalDatabaseConfig", relational_database_config)?; } @@ -361,6 +369,7 @@ impl<'de> ::serde::Deserialize<'de> for DataSourceProperties { let mut http_config: Option<::Value> = None; let mut lambda_config: Option<::Value> = None; let mut name: Option<::Value> = None; + let mut open_search_service_config: Option<::Value> = None; let mut relational_database_config: Option<::Value> = None; let mut service_role_arn: Option<::Value> = None; let mut r#type: Option<::Value> = None; @@ -388,6 +397,9 @@ impl<'de> ::serde::Deserialize<'de> for DataSourceProperties { "Name" => { name = ::serde::de::MapAccess::next_value(&mut map)?; } + "OpenSearchServiceConfig" => { + open_search_service_config = ::serde::de::MapAccess::next_value(&mut map)?; + } "RelationalDatabaseConfig" => { relational_database_config = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -409,6 +421,7 @@ impl<'de> ::serde::Deserialize<'de> for DataSourceProperties { http_config: http_config, lambda_config: lambda_config, name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + open_search_service_config: open_search_service_config, relational_database_config: relational_database_config, service_role_arn: service_role_arn, r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?, @@ -439,6 +452,193 @@ impl From for DataSource { } } +/// The [`AWS::AppSync::DomainName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-domainname.html) resource type. +#[derive(Debug, Default)] +pub struct DomainName { + properties: DomainNameProperties +} + +/// Properties for the `DomainName` resource. +#[derive(Debug, Default)] +pub struct DomainNameProperties { + /// Property [`CertificateArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-domainname.html#cfn-appsync-domainname-certificatearn). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub certificate_arn: ::Value, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-domainname.html#cfn-appsync-domainname-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`DomainName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-domainname.html#cfn-appsync-domainname-domainname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub domain_name: ::Value, +} + +impl ::serde::Serialize for DomainNameProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CertificateArn", &self.certificate_arn)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DomainName", &self.domain_name)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for DomainNameProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = DomainNameProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type DomainNameProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut certificate_arn: Option<::Value> = None; + let mut description: Option<::Value> = None; + let mut domain_name: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CertificateArn" => { + certificate_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DomainName" => { + domain_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(DomainNameProperties { + certificate_arn: certificate_arn.ok_or(::serde::de::Error::missing_field("CertificateArn"))?, + description: description, + domain_name: domain_name.ok_or(::serde::de::Error::missing_field("DomainName"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for DomainName { + type Properties = DomainNameProperties; + const TYPE: &'static str = "AWS::AppSync::DomainName"; + fn properties(&self) -> &DomainNameProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut DomainNameProperties { + &mut self.properties + } +} + +impl ::private::Sealed for DomainName {} + +impl From for DomainName { + fn from(properties: DomainNameProperties) -> DomainName { + DomainName { properties } + } +} + +/// The [`AWS::AppSync::DomainNameApiAssociation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-domainnameapiassociation.html) resource type. +#[derive(Debug, Default)] +pub struct DomainNameApiAssociation { + properties: DomainNameApiAssociationProperties +} + +/// Properties for the `DomainNameApiAssociation` resource. +#[derive(Debug, Default)] +pub struct DomainNameApiAssociationProperties { + /// Property [`ApiId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-domainnameapiassociation.html#cfn-appsync-domainnameapiassociation-apiid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub api_id: ::Value, + /// Property [`DomainName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-domainnameapiassociation.html#cfn-appsync-domainnameapiassociation-domainname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub domain_name: ::Value, +} + +impl ::serde::Serialize for DomainNameApiAssociationProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ApiId", &self.api_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DomainName", &self.domain_name)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for DomainNameApiAssociationProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = DomainNameApiAssociationProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type DomainNameApiAssociationProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut api_id: Option<::Value> = None; + let mut domain_name: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ApiId" => { + api_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DomainName" => { + domain_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(DomainNameApiAssociationProperties { + api_id: api_id.ok_or(::serde::de::Error::missing_field("ApiId"))?, + domain_name: domain_name.ok_or(::serde::de::Error::missing_field("DomainName"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for DomainNameApiAssociation { + type Properties = DomainNameApiAssociationProperties; + const TYPE: &'static str = "AWS::AppSync::DomainNameApiAssociation"; + fn properties(&self) -> &DomainNameApiAssociationProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut DomainNameApiAssociationProperties { + &mut self.properties + } +} + +impl ::private::Sealed for DomainNameApiAssociation {} + +impl From for DomainNameApiAssociation { + fn from(properties: DomainNameApiAssociationProperties) -> DomainNameApiAssociation { + DomainNameApiAssociation { properties } + } +} + /// The [`AWS::AppSync::FunctionConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-functionconfiguration.html) resource type. #[derive(Debug, Default)] pub struct FunctionConfiguration { @@ -468,6 +668,11 @@ pub struct FunctionConfigurationProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub function_version: ::Value, + /// Property [`MaxBatchSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-functionconfiguration.html#cfn-appsync-functionconfiguration-maxbatchsize). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub max_batch_size: Option<::Value>, /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-functionconfiguration.html#cfn-appsync-functionconfiguration-name). /// /// Update type: _Mutable_. @@ -509,6 +714,9 @@ impl ::serde::Serialize for FunctionConfigurationProperties { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "FunctionVersion", &self.function_version)?; + if let Some(ref max_batch_size) = self.max_batch_size { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxBatchSize", max_batch_size)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; if let Some(ref request_mapping_template) = self.request_mapping_template { ::serde::ser::SerializeMap::serialize_entry(&mut map, "RequestMappingTemplate", request_mapping_template)?; @@ -545,6 +753,7 @@ impl<'de> ::serde::Deserialize<'de> for FunctionConfigurationProperties { let mut data_source_name: Option<::Value> = None; let mut description: Option<::Value> = None; let mut function_version: Option<::Value> = None; + let mut max_batch_size: Option<::Value> = None; let mut name: Option<::Value> = None; let mut request_mapping_template: Option<::Value> = None; let mut request_mapping_template_s3_location: Option<::Value> = None; @@ -566,6 +775,9 @@ impl<'de> ::serde::Deserialize<'de> for FunctionConfigurationProperties { "FunctionVersion" => { function_version = ::serde::de::MapAccess::next_value(&mut map)?; } + "MaxBatchSize" => { + max_batch_size = ::serde::de::MapAccess::next_value(&mut map)?; + } "Name" => { name = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -593,6 +805,7 @@ impl<'de> ::serde::Deserialize<'de> for FunctionConfigurationProperties { data_source_name: data_source_name.ok_or(::serde::de::Error::missing_field("DataSourceName"))?, description: description, function_version: function_version.ok_or(::serde::de::Error::missing_field("FunctionVersion"))?, + max_batch_size: max_batch_size, name: name.ok_or(::serde::de::Error::missing_field("Name"))?, request_mapping_template: request_mapping_template, request_mapping_template_s3_location: request_mapping_template_s3_location, @@ -645,6 +858,11 @@ pub struct GraphQLApiProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub authentication_type: ::Value, + /// Property [`LambdaAuthorizerConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html#cfn-appsync-graphqlapi-lambdaauthorizerconfig). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub lambda_authorizer_config: Option<::Value>, /// Property [`LogConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-graphqlapi.html#cfn-appsync-graphqlapi-logconfig). /// /// Update type: _Mutable_. @@ -684,6 +902,9 @@ impl ::serde::Serialize for GraphQLApiProperties { ::serde::ser::SerializeMap::serialize_entry(&mut map, "AdditionalAuthenticationProviders", additional_authentication_providers)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "AuthenticationType", &self.authentication_type)?; + if let Some(ref lambda_authorizer_config) = self.lambda_authorizer_config { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LambdaAuthorizerConfig", lambda_authorizer_config)?; + } if let Some(ref log_config) = self.log_config { ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogConfig", log_config)?; } @@ -718,6 +939,7 @@ impl<'de> ::serde::Deserialize<'de> for GraphQLApiProperties { fn visit_map>(self, mut map: A) -> Result { let mut additional_authentication_providers: Option<::Value> = None; let mut authentication_type: Option<::Value> = None; + let mut lambda_authorizer_config: Option<::Value> = None; let mut log_config: Option<::Value> = None; let mut name: Option<::Value> = None; let mut open_id_connect_config: Option<::Value> = None; @@ -733,6 +955,9 @@ impl<'de> ::serde::Deserialize<'de> for GraphQLApiProperties { "AuthenticationType" => { authentication_type = ::serde::de::MapAccess::next_value(&mut map)?; } + "LambdaAuthorizerConfig" => { + lambda_authorizer_config = ::serde::de::MapAccess::next_value(&mut map)?; + } "LogConfig" => { log_config = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -758,6 +983,7 @@ impl<'de> ::serde::Deserialize<'de> for GraphQLApiProperties { Ok(GraphQLApiProperties { additional_authentication_providers: additional_authentication_providers, authentication_type: authentication_type.ok_or(::serde::de::Error::missing_field("AuthenticationType"))?, + lambda_authorizer_config: lambda_authorizer_config, log_config: log_config, name: name.ok_or(::serde::de::Error::missing_field("Name"))?, open_id_connect_config: open_id_connect_config, @@ -927,6 +1153,11 @@ pub struct ResolverProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub kind: Option<::Value>, + /// Property [`MaxBatchSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-resolver.html#cfn-appsync-resolver-maxbatchsize). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub max_batch_size: Option<::Value>, /// Property [`PipelineConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-appsync-resolver.html#cfn-appsync-resolver-pipelineconfig). /// /// Update type: _Mutable_. @@ -978,6 +1209,9 @@ impl ::serde::Serialize for ResolverProperties { if let Some(ref kind) = self.kind { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Kind", kind)?; } + if let Some(ref max_batch_size) = self.max_batch_size { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxBatchSize", max_batch_size)?; + } if let Some(ref pipeline_config) = self.pipeline_config { ::serde::ser::SerializeMap::serialize_entry(&mut map, "PipelineConfig", pipeline_config)?; } @@ -1018,6 +1252,7 @@ impl<'de> ::serde::Deserialize<'de> for ResolverProperties { let mut data_source_name: Option<::Value> = None; let mut field_name: Option<::Value> = None; let mut kind: Option<::Value> = None; + let mut max_batch_size: Option<::Value> = None; let mut pipeline_config: Option<::Value> = None; let mut request_mapping_template: Option<::Value> = None; let mut request_mapping_template_s3_location: Option<::Value> = None; @@ -1043,6 +1278,9 @@ impl<'de> ::serde::Deserialize<'de> for ResolverProperties { "Kind" => { kind = ::serde::de::MapAccess::next_value(&mut map)?; } + "MaxBatchSize" => { + max_batch_size = ::serde::de::MapAccess::next_value(&mut map)?; + } "PipelineConfig" => { pipeline_config = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1074,6 +1312,7 @@ impl<'de> ::serde::Deserialize<'de> for ResolverProperties { data_source_name: data_source_name, field_name: field_name.ok_or(::serde::de::Error::missing_field("FieldName"))?, kind: kind, + max_batch_size: max_batch_size, pipeline_config: pipeline_config, request_mapping_template: request_mapping_template, request_mapping_template_s3_location: request_mapping_template_s3_location, @@ -1592,6 +1831,68 @@ pub mod data_source { } } + /// The [`AWS::AppSync::DataSource.OpenSearchServiceConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-opensearchserviceconfig.html) property type. + #[derive(Debug, Default)] + pub struct OpenSearchServiceConfig { + /// Property [`AwsRegion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-opensearchserviceconfig.html#cfn-appsync-datasource-opensearchserviceconfig-awsregion). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub aws_region: ::Value, + /// Property [`Endpoint`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-opensearchserviceconfig.html#cfn-appsync-datasource-opensearchserviceconfig-endpoint). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub endpoint: ::Value, + } + + impl ::codec::SerializeValue for OpenSearchServiceConfig { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AwsRegion", &self.aws_region)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Endpoint", &self.endpoint)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for OpenSearchServiceConfig { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = OpenSearchServiceConfig; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type OpenSearchServiceConfig") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut aws_region: Option<::Value> = None; + let mut endpoint: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AwsRegion" => { + aws_region = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Endpoint" => { + endpoint = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(OpenSearchServiceConfig { + aws_region: aws_region.ok_or(::serde::de::Error::missing_field("AwsRegion"))?, + endpoint: endpoint.ok_or(::serde::de::Error::missing_field("Endpoint"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::AppSync::DataSource.RdsHttpEndpointConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-datasource-rdshttpendpointconfig.html) property type. #[derive(Debug, Default)] pub struct RdsHttpEndpointConfig { @@ -1901,6 +2202,11 @@ pub mod graph_ql_api { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub authentication_type: ::Value, + /// Property [`LambdaAuthorizerConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-additionalauthenticationprovider.html#cfn-appsync-graphqlapi-additionalauthenticationprovider-lambdaauthorizerconfig). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub lambda_authorizer_config: Option<::Value>, /// Property [`OpenIDConnectConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-additionalauthenticationprovider.html#cfn-appsync-graphqlapi-additionalauthenticationprovider-openidconnectconfig). /// /// Update type: _Mutable_. @@ -1917,6 +2223,9 @@ pub mod graph_ql_api { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "AuthenticationType", &self.authentication_type)?; + if let Some(ref lambda_authorizer_config) = self.lambda_authorizer_config { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LambdaAuthorizerConfig", lambda_authorizer_config)?; + } if let Some(ref open_id_connect_config) = self.open_id_connect_config { ::serde::ser::SerializeMap::serialize_entry(&mut map, "OpenIDConnectConfig", open_id_connect_config)?; } @@ -1940,6 +2249,7 @@ pub mod graph_ql_api { fn visit_map>(self, mut map: A) -> Result { let mut authentication_type: Option<::Value> = None; + let mut lambda_authorizer_config: Option<::Value> = None; let mut open_id_connect_config: Option<::Value> = None; let mut user_pool_config: Option<::Value> = None; @@ -1948,6 +2258,9 @@ pub mod graph_ql_api { "AuthenticationType" => { authentication_type = ::serde::de::MapAccess::next_value(&mut map)?; } + "LambdaAuthorizerConfig" => { + lambda_authorizer_config = ::serde::de::MapAccess::next_value(&mut map)?; + } "OpenIDConnectConfig" => { open_id_connect_config = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1960,6 +2273,7 @@ pub mod graph_ql_api { Ok(AdditionalAuthenticationProvider { authentication_type: authentication_type.ok_or(::serde::de::Error::missing_field("AuthenticationType"))?, + lambda_authorizer_config: lambda_authorizer_config, open_id_connect_config: open_id_connect_config, user_pool_config: user_pool_config, }) @@ -2081,6 +2395,85 @@ pub mod graph_ql_api { } } + /// The [`AWS::AppSync::GraphQLApi.LambdaAuthorizerConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-lambdaauthorizerconfig.html) property type. + #[derive(Debug, Default)] + pub struct LambdaAuthorizerConfig { + /// Property [`AuthorizerResultTtlInSeconds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-lambdaauthorizerconfig.html#cfn-appsync-graphqlapi-lambdaauthorizerconfig-authorizerresultttlinseconds). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub authorizer_result_ttl_in_seconds: Option<::Value>, + /// Property [`AuthorizerUri`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-lambdaauthorizerconfig.html#cfn-appsync-graphqlapi-lambdaauthorizerconfig-authorizeruri). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub authorizer_uri: Option<::Value>, + /// Property [`IdentityValidationExpression`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-lambdaauthorizerconfig.html#cfn-appsync-graphqlapi-lambdaauthorizerconfig-identityvalidationexpression). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub identity_validation_expression: Option<::Value>, + } + + impl ::codec::SerializeValue for LambdaAuthorizerConfig { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref authorizer_result_ttl_in_seconds) = self.authorizer_result_ttl_in_seconds { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AuthorizerResultTtlInSeconds", authorizer_result_ttl_in_seconds)?; + } + if let Some(ref authorizer_uri) = self.authorizer_uri { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AuthorizerUri", authorizer_uri)?; + } + if let Some(ref identity_validation_expression) = self.identity_validation_expression { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IdentityValidationExpression", identity_validation_expression)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for LambdaAuthorizerConfig { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = LambdaAuthorizerConfig; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type LambdaAuthorizerConfig") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut authorizer_result_ttl_in_seconds: Option<::Value> = None; + let mut authorizer_uri: Option<::Value> = None; + let mut identity_validation_expression: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AuthorizerResultTtlInSeconds" => { + authorizer_result_ttl_in_seconds = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AuthorizerUri" => { + authorizer_uri = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IdentityValidationExpression" => { + identity_validation_expression = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(LambdaAuthorizerConfig { + authorizer_result_ttl_in_seconds: authorizer_result_ttl_in_seconds, + authorizer_uri: authorizer_uri, + identity_validation_expression: identity_validation_expression, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::AppSync::GraphQLApi.LogConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-appsync-graphqlapi-logconfig.html) property type. #[derive(Debug, Default)] pub struct LogConfig { @@ -2392,7 +2785,7 @@ pub mod resolver { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub ttl: Option<::Value>, + pub ttl: ::Value, } impl ::codec::SerializeValue for CachingConfig { @@ -2401,9 +2794,7 @@ pub mod resolver { if let Some(ref caching_keys) = self.caching_keys { ::serde::ser::SerializeMap::serialize_entry(&mut map, "CachingKeys", caching_keys)?; } - if let Some(ref ttl) = self.ttl { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ttl", ttl)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ttl", &self.ttl)?; ::serde::ser::SerializeMap::end(map) } } @@ -2437,7 +2828,7 @@ pub mod resolver { Ok(CachingConfig { caching_keys: caching_keys, - ttl: ttl, + ttl: ttl.ok_or(::serde::de::Error::missing_field("Ttl"))?, }) } } diff --git a/src/aws/aps.rs b/src/aws/aps.rs new file mode 100644 index 0000000..3b19b18 --- /dev/null +++ b/src/aws/aps.rs @@ -0,0 +1,216 @@ +//! Types for the `APS` service. + +/// The [`AWS::APS::RuleGroupsNamespace`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-aps-rulegroupsnamespace.html) resource type. +#[derive(Debug, Default)] +pub struct RuleGroupsNamespace { + properties: RuleGroupsNamespaceProperties +} + +/// Properties for the `RuleGroupsNamespace` resource. +#[derive(Debug, Default)] +pub struct RuleGroupsNamespaceProperties { + /// Property [`Data`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-aps-rulegroupsnamespace.html#cfn-aps-rulegroupsnamespace-data). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub data: ::Value, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-aps-rulegroupsnamespace.html#cfn-aps-rulegroupsnamespace-name). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub name: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-aps-rulegroupsnamespace.html#cfn-aps-rulegroupsnamespace-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`Workspace`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-aps-rulegroupsnamespace.html#cfn-aps-rulegroupsnamespace-workspace). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub workspace: ::Value, +} + +impl ::serde::Serialize for RuleGroupsNamespaceProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Data", &self.data)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Workspace", &self.workspace)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for RuleGroupsNamespaceProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = RuleGroupsNamespaceProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type RuleGroupsNamespaceProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut data: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut workspace: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Data" => { + data = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Workspace" => { + workspace = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(RuleGroupsNamespaceProperties { + data: data.ok_or(::serde::de::Error::missing_field("Data"))?, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + tags: tags, + workspace: workspace.ok_or(::serde::de::Error::missing_field("Workspace"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for RuleGroupsNamespace { + type Properties = RuleGroupsNamespaceProperties; + const TYPE: &'static str = "AWS::APS::RuleGroupsNamespace"; + fn properties(&self) -> &RuleGroupsNamespaceProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut RuleGroupsNamespaceProperties { + &mut self.properties + } +} + +impl ::private::Sealed for RuleGroupsNamespace {} + +impl From for RuleGroupsNamespace { + fn from(properties: RuleGroupsNamespaceProperties) -> RuleGroupsNamespace { + RuleGroupsNamespace { properties } + } +} + +/// The [`AWS::APS::Workspace`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-aps-workspace.html) resource type. +#[derive(Debug, Default)] +pub struct Workspace { + properties: WorkspaceProperties +} + +/// Properties for the `Workspace` resource. +#[derive(Debug, Default)] +pub struct WorkspaceProperties { + /// Property [`AlertManagerDefinition`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-aps-workspace.html#cfn-aps-workspace-alertmanagerdefinition). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub alert_manager_definition: Option<::Value>, + /// Property [`Alias`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-aps-workspace.html#cfn-aps-workspace-alias). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub alias: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-aps-workspace.html#cfn-aps-workspace-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, +} + +impl ::serde::Serialize for WorkspaceProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref alert_manager_definition) = self.alert_manager_definition { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AlertManagerDefinition", alert_manager_definition)?; + } + if let Some(ref alias) = self.alias { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Alias", alias)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for WorkspaceProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = WorkspaceProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type WorkspaceProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut alert_manager_definition: Option<::Value> = None; + let mut alias: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AlertManagerDefinition" => { + alert_manager_definition = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Alias" => { + alias = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(WorkspaceProperties { + alert_manager_definition: alert_manager_definition, + alias: alias, + tags: tags, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for Workspace { + type Properties = WorkspaceProperties; + const TYPE: &'static str = "AWS::APS::Workspace"; + fn properties(&self) -> &WorkspaceProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut WorkspaceProperties { + &mut self.properties + } +} + +impl ::private::Sealed for Workspace {} + +impl From for Workspace { + fn from(properties: WorkspaceProperties) -> Workspace { + Workspace { properties } + } +} diff --git a/src/aws/athena.rs b/src/aws/athena.rs index fad6006..a8d1604 100644 --- a/src/aws/athena.rs +++ b/src/aws/athena.rs @@ -16,8 +16,8 @@ pub struct DataCatalogProperties { pub description: Option<::Value>, /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-datacatalog.html#cfn-athena-datacatalog-name). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. pub name: ::Value, /// Property [`Parameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-datacatalog.html#cfn-athena-datacatalog-parameters). /// @@ -252,6 +252,117 @@ impl From for NamedQuery { } } +/// The [`AWS::Athena::PreparedStatement`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-preparedstatement.html) resource type. +#[derive(Debug, Default)] +pub struct PreparedStatement { + properties: PreparedStatementProperties +} + +/// Properties for the `PreparedStatement` resource. +#[derive(Debug, Default)] +pub struct PreparedStatementProperties { + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-preparedstatement.html#cfn-athena-preparedstatement-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`QueryStatement`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-preparedstatement.html#cfn-athena-preparedstatement-querystatement). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub query_statement: ::Value, + /// Property [`StatementName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-preparedstatement.html#cfn-athena-preparedstatement-statementname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub statement_name: ::Value, + /// Property [`WorkGroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-preparedstatement.html#cfn-athena-preparedstatement-workgroup). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub work_group: ::Value, +} + +impl ::serde::Serialize for PreparedStatementProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "QueryStatement", &self.query_statement)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "StatementName", &self.statement_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "WorkGroup", &self.work_group)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for PreparedStatementProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = PreparedStatementProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type PreparedStatementProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut description: Option<::Value> = None; + let mut query_statement: Option<::Value> = None; + let mut statement_name: Option<::Value> = None; + let mut work_group: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "QueryStatement" => { + query_statement = ::serde::de::MapAccess::next_value(&mut map)?; + } + "StatementName" => { + statement_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "WorkGroup" => { + work_group = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(PreparedStatementProperties { + description: description, + query_statement: query_statement.ok_or(::serde::de::Error::missing_field("QueryStatement"))?, + statement_name: statement_name.ok_or(::serde::de::Error::missing_field("StatementName"))?, + work_group: work_group.ok_or(::serde::de::Error::missing_field("WorkGroup"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for PreparedStatement { + type Properties = PreparedStatementProperties; + const TYPE: &'static str = "AWS::Athena::PreparedStatement"; + fn properties(&self) -> &PreparedStatementProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut PreparedStatementProperties { + &mut self.properties + } +} + +impl ::private::Sealed for PreparedStatement {} + +impl From for PreparedStatement { + fn from(properties: PreparedStatementProperties) -> PreparedStatement { + PreparedStatement { properties } + } +} + /// The [`AWS::Athena::WorkGroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-athena-workgroup.html) resource type. #[derive(Debug, Default)] pub struct WorkGroup { diff --git a/src/aws/autoscaling.rs b/src/aws/autoscaling.rs index 9ac6646..15ac27f 100644 --- a/src/aws/autoscaling.rs +++ b/src/aws/autoscaling.rs @@ -39,6 +39,11 @@ pub struct AutoScalingGroupProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub desired_capacity: Option<::Value>, + /// Property [`DesiredCapacityType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-desiredcapacitytype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub desired_capacity_type: Option<::Value>, /// Property [`HealthCheckGracePeriod`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-group.html#cfn-as-group-healthcheckgraceperiod). /// /// Update type: _Mutable_. @@ -162,6 +167,9 @@ impl ::serde::Serialize for AutoScalingGroupProperties { if let Some(ref desired_capacity) = self.desired_capacity { ::serde::ser::SerializeMap::serialize_entry(&mut map, "DesiredCapacity", desired_capacity)?; } + if let Some(ref desired_capacity_type) = self.desired_capacity_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DesiredCapacityType", desired_capacity_type)?; + } if let Some(ref health_check_grace_period) = self.health_check_grace_period { ::serde::ser::SerializeMap::serialize_entry(&mut map, "HealthCheckGracePeriod", health_check_grace_period)?; } @@ -240,6 +248,7 @@ impl<'de> ::serde::Deserialize<'de> for AutoScalingGroupProperties { let mut context: Option<::Value> = None; let mut cooldown: Option<::Value> = None; let mut desired_capacity: Option<::Value> = None; + let mut desired_capacity_type: Option<::Value> = None; let mut health_check_grace_period: Option<::Value> = None; let mut health_check_type: Option<::Value> = None; let mut instance_id: Option<::Value> = None; @@ -281,6 +290,9 @@ impl<'de> ::serde::Deserialize<'de> for AutoScalingGroupProperties { "DesiredCapacity" => { desired_capacity = ::serde::de::MapAccess::next_value(&mut map)?; } + "DesiredCapacityType" => { + desired_capacity_type = ::serde::de::MapAccess::next_value(&mut map)?; + } "HealthCheckGracePeriod" => { health_check_grace_period = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -352,6 +364,7 @@ impl<'de> ::serde::Deserialize<'de> for AutoScalingGroupProperties { context: context, cooldown: cooldown, desired_capacity: desired_capacity, + desired_capacity_type: desired_capacity_type, health_check_grace_period: health_check_grace_period, health_check_type: health_check_type, instance_id: instance_id, @@ -399,7 +412,7 @@ impl From for AutoScalingGroup { } } -/// The [`AWS::AutoScaling::LaunchConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html) resource type. +/// The [`AWS::AutoScaling::LaunchConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html) resource type. #[derive(Debug, Default)] pub struct LaunchConfiguration { properties: LaunchConfigurationProperties @@ -408,97 +421,97 @@ pub struct LaunchConfiguration { /// Properties for the `LaunchConfiguration` resource. #[derive(Debug, Default)] pub struct LaunchConfigurationProperties { - /// Property [`AssociatePublicIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html#cf-as-launchconfig-associatepubip). + /// Property [`AssociatePublicIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-associatepublicipaddress). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub associate_public_ip_address: Option<::Value>, - /// Property [`BlockDeviceMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html#cfn-as-launchconfig-blockdevicemappings). + /// Property [`BlockDeviceMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-blockdevicemappings). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub block_device_mappings: Option<::ValueList>, - /// Property [`ClassicLinkVPCId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html#cfn-as-launchconfig-classiclinkvpcid). + /// Property [`ClassicLinkVPCId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-classiclinkvpcid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub classic_link_vpc_id: Option<::Value>, - /// Property [`ClassicLinkVPCSecurityGroups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html#cfn-as-launchconfig-classiclinkvpcsecuritygroups). + /// Property [`ClassicLinkVPCSecurityGroups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-classiclinkvpcsecuritygroups). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub classic_link_vpc_security_groups: Option<::ValueList>, - /// Property [`EbsOptimized`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html#cfn-as-launchconfig-ebsoptimized). + /// Property [`EbsOptimized`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-ebsoptimized). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub ebs_optimized: Option<::Value>, - /// Property [`IamInstanceProfile`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html#cfn-as-launchconfig-iaminstanceprofile). + /// Property [`IamInstanceProfile`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-iaminstanceprofile). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub iam_instance_profile: Option<::Value>, - /// Property [`ImageId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html#cfn-as-launchconfig-imageid). + /// Property [`ImageId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-imageid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub image_id: ::Value, - /// Property [`InstanceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html#cfn-as-launchconfig-instanceid). + /// Property [`InstanceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-instanceid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub instance_id: Option<::Value>, - /// Property [`InstanceMonitoring`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html#cfn-as-launchconfig-instancemonitoring). + /// Property [`InstanceMonitoring`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-instancemonitoring). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub instance_monitoring: Option<::Value>, - /// Property [`InstanceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html#cfn-as-launchconfig-instancetype). + /// Property [`InstanceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-instancetype). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub instance_type: ::Value, - /// Property [`KernelId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html#cfn-as-launchconfig-kernelid). + /// Property [`KernelId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-kernelid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub kernel_id: Option<::Value>, - /// Property [`KeyName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html#cfn-as-launchconfig-keyname). + /// Property [`KeyName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-keyname). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub key_name: Option<::Value>, - /// Property [`LaunchConfigurationName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html#cfn-autoscaling-launchconfig-launchconfigurationname). + /// Property [`LaunchConfigurationName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-launchconfigurationname). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub launch_configuration_name: Option<::Value>, - /// Property [`MetadataOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html#cfn-autoscaling-launchconfig-metadataoptions). + /// Property [`MetadataOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-metadataoptions). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub metadata_options: Option<::Value>, - /// Property [`PlacementTenancy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html#cfn-as-launchconfig-placementtenancy). + /// Property [`PlacementTenancy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-placementtenancy). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub placement_tenancy: Option<::Value>, - /// Property [`RamDiskId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html#cfn-as-launchconfig-ramdiskid). + /// Property [`RamDiskId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-ramdiskid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub ram_disk_id: Option<::Value>, - /// Property [`SecurityGroups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html#cfn-as-launchconfig-securitygroups). + /// Property [`SecurityGroups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-securitygroups). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub security_groups: Option<::ValueList>, - /// Property [`SpotPrice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html#cfn-as-launchconfig-spotprice). + /// Property [`SpotPrice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-spotprice). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub spot_price: Option<::Value>, - /// Property [`UserData`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig.html#cfn-as-launchconfig-userdata). + /// Property [`UserData`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-launchconfiguration.html#cfn-autoscaling-launchconfiguration-userdata). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. @@ -707,7 +720,7 @@ impl From for LaunchConfiguration { } } -/// The [`AWS::AutoScaling::LifecycleHook`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-as-lifecyclehook.html) resource type. +/// The [`AWS::AutoScaling::LifecycleHook`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html) resource type. #[derive(Debug, Default)] pub struct LifecycleHook { properties: LifecycleHookProperties @@ -716,42 +729,42 @@ pub struct LifecycleHook { /// Properties for the `LifecycleHook` resource. #[derive(Debug, Default)] pub struct LifecycleHookProperties { - /// Property [`AutoScalingGroupName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-as-lifecyclehook.html#cfn-as-lifecyclehook-autoscalinggroupname). + /// Property [`AutoScalingGroupName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html#cfn-autoscaling-lifecyclehook-autoscalinggroupname). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub auto_scaling_group_name: ::Value, - /// Property [`DefaultResult`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-as-lifecyclehook.html#cfn-as-lifecyclehook-defaultresult). + /// Property [`DefaultResult`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html#cfn-autoscaling-lifecyclehook-defaultresult). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub default_result: Option<::Value>, - /// Property [`HeartbeatTimeout`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-as-lifecyclehook.html#cfn-as-lifecyclehook-heartbeattimeout). + /// Property [`HeartbeatTimeout`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html#cfn-autoscaling-lifecyclehook-heartbeattimeout). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub heartbeat_timeout: Option<::Value>, - /// Property [`LifecycleHookName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-as-lifecyclehook.html#cfn-autoscaling-lifecyclehook-lifecyclehookname). + /// Property [`LifecycleHookName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html#cfn-autoscaling-lifecyclehook-lifecyclehookname). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub lifecycle_hook_name: Option<::Value>, - /// Property [`LifecycleTransition`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-as-lifecyclehook.html#cfn-as-lifecyclehook-lifecycletransition). + /// Property [`LifecycleTransition`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html#cfn-autoscaling-lifecyclehook-lifecycletransition). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub lifecycle_transition: ::Value, - /// Property [`NotificationMetadata`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-as-lifecyclehook.html#cfn-as-lifecyclehook-notificationmetadata). + /// Property [`NotificationMetadata`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html#cfn-autoscaling-lifecyclehook-notificationmetadata). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub notification_metadata: Option<::Value>, - /// Property [`NotificationTargetARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-as-lifecyclehook.html#cfn-as-lifecyclehook-notificationtargetarn). + /// Property [`NotificationTargetARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html#cfn-autoscaling-lifecyclehook-notificationtargetarn). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub notification_target_arn: Option<::Value>, - /// Property [`RoleARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-as-lifecyclehook.html#cfn-as-lifecyclehook-rolearn). + /// Property [`RoleARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-lifecyclehook.html#cfn-autoscaling-lifecyclehook-rolearn). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. @@ -916,6 +929,11 @@ pub struct ScalingPolicyProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub policy_type: Option<::Value>, + /// Property [`PredictiveScalingConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-policy.html#cfn-autoscaling-scalingpolicy-predictivescalingconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub predictive_scaling_configuration: Option<::Value>, /// Property [`ScalingAdjustment`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-policy.html#cfn-as-scalingpolicy-scalingadjustment). /// /// Update type: _Mutable_. @@ -955,6 +973,9 @@ impl ::serde::Serialize for ScalingPolicyProperties { if let Some(ref policy_type) = self.policy_type { ::serde::ser::SerializeMap::serialize_entry(&mut map, "PolicyType", policy_type)?; } + if let Some(ref predictive_scaling_configuration) = self.predictive_scaling_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PredictiveScalingConfiguration", predictive_scaling_configuration)?; + } if let Some(ref scaling_adjustment) = self.scaling_adjustment { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ScalingAdjustment", scaling_adjustment)?; } @@ -987,6 +1008,7 @@ impl<'de> ::serde::Deserialize<'de> for ScalingPolicyProperties { let mut metric_aggregation_type: Option<::Value> = None; let mut min_adjustment_magnitude: Option<::Value> = None; let mut policy_type: Option<::Value> = None; + let mut predictive_scaling_configuration: Option<::Value> = None; let mut scaling_adjustment: Option<::Value> = None; let mut step_adjustments: Option<::ValueList> = None; let mut target_tracking_configuration: Option<::Value> = None; @@ -1014,6 +1036,9 @@ impl<'de> ::serde::Deserialize<'de> for ScalingPolicyProperties { "PolicyType" => { policy_type = ::serde::de::MapAccess::next_value(&mut map)?; } + "PredictiveScalingConfiguration" => { + predictive_scaling_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } "ScalingAdjustment" => { scaling_adjustment = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1035,6 +1060,7 @@ impl<'de> ::serde::Deserialize<'de> for ScalingPolicyProperties { metric_aggregation_type: metric_aggregation_type, min_adjustment_magnitude: min_adjustment_magnitude, policy_type: policy_type, + predictive_scaling_configuration: predictive_scaling_configuration, scaling_adjustment: scaling_adjustment, step_adjustments: step_adjustments, target_tracking_configuration: target_tracking_configuration, @@ -1246,6 +1272,11 @@ pub struct WarmPoolProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub auto_scaling_group_name: ::Value, + /// Property [`InstanceReusePolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-warmpool.html#cfn-autoscaling-warmpool-instancereusepolicy). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub instance_reuse_policy: Option<::Value>, /// Property [`MaxGroupPreparedCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-autoscaling-warmpool.html#cfn-autoscaling-warmpool-maxgrouppreparedcapacity). /// /// Update type: _Mutable_. @@ -1267,6 +1298,9 @@ impl ::serde::Serialize for WarmPoolProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "AutoScalingGroupName", &self.auto_scaling_group_name)?; + if let Some(ref instance_reuse_policy) = self.instance_reuse_policy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceReusePolicy", instance_reuse_policy)?; + } if let Some(ref max_group_prepared_capacity) = self.max_group_prepared_capacity { ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxGroupPreparedCapacity", max_group_prepared_capacity)?; } @@ -1293,6 +1327,7 @@ impl<'de> ::serde::Deserialize<'de> for WarmPoolProperties { fn visit_map>(self, mut map: A) -> Result { let mut auto_scaling_group_name: Option<::Value> = None; + let mut instance_reuse_policy: Option<::Value> = None; let mut max_group_prepared_capacity: Option<::Value> = None; let mut min_size: Option<::Value> = None; let mut pool_state: Option<::Value> = None; @@ -1302,6 +1337,9 @@ impl<'de> ::serde::Deserialize<'de> for WarmPoolProperties { "AutoScalingGroupName" => { auto_scaling_group_name = ::serde::de::MapAccess::next_value(&mut map)?; } + "InstanceReusePolicy" => { + instance_reuse_policy = ::serde::de::MapAccess::next_value(&mut map)?; + } "MaxGroupPreparedCapacity" => { max_group_prepared_capacity = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1317,6 +1355,7 @@ impl<'de> ::serde::Deserialize<'de> for WarmPoolProperties { Ok(WarmPoolProperties { auto_scaling_group_name: auto_scaling_group_name.ok_or(::serde::de::Error::missing_field("AutoScalingGroupName"))?, + instance_reuse_policy: instance_reuse_policy, max_group_prepared_capacity: max_group_prepared_capacity, min_size: min_size, pool_state: pool_state, @@ -1350,116 +1389,64 @@ impl From for WarmPool { pub mod auto_scaling_group { //! Property types for the `AutoScalingGroup` resource. - /// The [`AWS::AutoScaling::AutoScalingGroup.InstancesDistribution`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancesdistribution.html) property type. + /// The [`AWS::AutoScaling::AutoScalingGroup.AcceleratorCountRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-acceleratorcountrequest.html) property type. #[derive(Debug, Default)] - pub struct InstancesDistribution { - /// Property [`OnDemandAllocationStrategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancesdistribution.html#cfn-autoscaling-autoscalinggroup-instancesdistribution-ondemandallocationstrategy). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub on_demand_allocation_strategy: Option<::Value>, - /// Property [`OnDemandBaseCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancesdistribution.html#cfn-autoscaling-autoscalinggroup-instancesdistribution-ondemandbasecapacity). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub on_demand_base_capacity: Option<::Value>, - /// Property [`OnDemandPercentageAboveBaseCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancesdistribution.html#cfn-autoscaling-autoscalinggroup-instancesdistribution-ondemandpercentageabovebasecapacity). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub on_demand_percentage_above_base_capacity: Option<::Value>, - /// Property [`SpotAllocationStrategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancesdistribution.html#cfn-autoscaling-autoscalinggroup-instancesdistribution-spotallocationstrategy). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub spot_allocation_strategy: Option<::Value>, - /// Property [`SpotInstancePools`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancesdistribution.html#cfn-autoscaling-autoscalinggroup-instancesdistribution-spotinstancepools). + pub struct AcceleratorCountRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-acceleratorcountrequest.html#cfn-autoscaling-autoscalinggroup-acceleratorcountrequest-max). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub spot_instance_pools: Option<::Value>, - /// Property [`SpotMaxPrice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancesdistribution.html#cfn-autoscaling-autoscalinggroup-instancesdistribution-spotmaxprice). + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-acceleratorcountrequest.html#cfn-autoscaling-autoscalinggroup-acceleratorcountrequest-min). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub spot_max_price: Option<::Value>, + pub min: Option<::Value>, } - impl ::codec::SerializeValue for InstancesDistribution { + impl ::codec::SerializeValue for AcceleratorCountRequest { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref on_demand_allocation_strategy) = self.on_demand_allocation_strategy { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "OnDemandAllocationStrategy", on_demand_allocation_strategy)?; - } - if let Some(ref on_demand_base_capacity) = self.on_demand_base_capacity { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "OnDemandBaseCapacity", on_demand_base_capacity)?; - } - if let Some(ref on_demand_percentage_above_base_capacity) = self.on_demand_percentage_above_base_capacity { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "OnDemandPercentageAboveBaseCapacity", on_demand_percentage_above_base_capacity)?; - } - if let Some(ref spot_allocation_strategy) = self.spot_allocation_strategy { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpotAllocationStrategy", spot_allocation_strategy)?; - } - if let Some(ref spot_instance_pools) = self.spot_instance_pools { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpotInstancePools", spot_instance_pools)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; } - if let Some(ref spot_max_price) = self.spot_max_price { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpotMaxPrice", spot_max_price)?; + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for InstancesDistribution { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for AcceleratorCountRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = InstancesDistribution; + type Value = AcceleratorCountRequest; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type InstancesDistribution") + write!(f, "a struct of type AcceleratorCountRequest") } fn visit_map>(self, mut map: A) -> Result { - let mut on_demand_allocation_strategy: Option<::Value> = None; - let mut on_demand_base_capacity: Option<::Value> = None; - let mut on_demand_percentage_above_base_capacity: Option<::Value> = None; - let mut spot_allocation_strategy: Option<::Value> = None; - let mut spot_instance_pools: Option<::Value> = None; - let mut spot_max_price: Option<::Value> = None; + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "OnDemandAllocationStrategy" => { - on_demand_allocation_strategy = ::serde::de::MapAccess::next_value(&mut map)?; - } - "OnDemandBaseCapacity" => { - on_demand_base_capacity = ::serde::de::MapAccess::next_value(&mut map)?; - } - "OnDemandPercentageAboveBaseCapacity" => { - on_demand_percentage_above_base_capacity = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SpotAllocationStrategy" => { - spot_allocation_strategy = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SpotInstancePools" => { - spot_instance_pools = ::serde::de::MapAccess::next_value(&mut map)?; + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; } - "SpotMaxPrice" => { - spot_max_price = ::serde::de::MapAccess::next_value(&mut map)?; + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(InstancesDistribution { - on_demand_allocation_strategy: on_demand_allocation_strategy, - on_demand_base_capacity: on_demand_base_capacity, - on_demand_percentage_above_base_capacity: on_demand_percentage_above_base_capacity, - spot_allocation_strategy: spot_allocation_strategy, - spot_instance_pools: spot_instance_pools, - spot_max_price: spot_max_price, + Ok(AcceleratorCountRequest { + max: max, + min: min, }) } } @@ -1468,62 +1455,64 @@ pub mod auto_scaling_group { } } - /// The [`AWS::AutoScaling::AutoScalingGroup.LaunchTemplate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplate.html) property type. + /// The [`AWS::AutoScaling::AutoScalingGroup.AcceleratorTotalMemoryMiBRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-acceleratortotalmemorymibrequest.html) property type. #[derive(Debug, Default)] - pub struct LaunchTemplate { - /// Property [`LaunchTemplateSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplate.html#cfn-as-group-launchtemplate). + pub struct AcceleratorTotalMemoryMiBRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-acceleratortotalmemorymibrequest.html#cfn-autoscaling-autoscalinggroup-acceleratortotalmemorymibrequest-max). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub launch_template_specification: ::Value, - /// Property [`Overrides`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplate.html#cfn-as-mixedinstancespolicy-overrides). + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-acceleratortotalmemorymibrequest.html#cfn-autoscaling-autoscalinggroup-acceleratortotalmemorymibrequest-min). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub overrides: Option<::ValueList>, + pub min: Option<::Value>, } - impl ::codec::SerializeValue for LaunchTemplate { + impl ::codec::SerializeValue for AcceleratorTotalMemoryMiBRequest { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplateSpecification", &self.launch_template_specification)?; - if let Some(ref overrides) = self.overrides { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Overrides", overrides)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for LaunchTemplate { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for AcceleratorTotalMemoryMiBRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = LaunchTemplate; + type Value = AcceleratorTotalMemoryMiBRequest; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type LaunchTemplate") + write!(f, "a struct of type AcceleratorTotalMemoryMiBRequest") } fn visit_map>(self, mut map: A) -> Result { - let mut launch_template_specification: Option<::Value> = None; - let mut overrides: Option<::ValueList> = None; + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "LaunchTemplateSpecification" => { - launch_template_specification = ::serde::de::MapAccess::next_value(&mut map)?; + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; } - "Overrides" => { - overrides = ::serde::de::MapAccess::next_value(&mut map)?; + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(LaunchTemplate { - launch_template_specification: launch_template_specification.ok_or(::serde::de::Error::missing_field("LaunchTemplateSpecification"))?, - overrides: overrides, + Ok(AcceleratorTotalMemoryMiBRequest { + max: max, + min: min, }) } } @@ -1532,77 +1521,64 @@ pub mod auto_scaling_group { } } - /// The [`AWS::AutoScaling::AutoScalingGroup.LaunchTemplateOverrides`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplateoverrides.html) property type. + /// The [`AWS::AutoScaling::AutoScalingGroup.BaselineEbsBandwidthMbpsRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-baselineebsbandwidthmbpsrequest.html) property type. #[derive(Debug, Default)] - pub struct LaunchTemplateOverrides { - /// Property [`InstanceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplateoverrides.html#cfn-autoscaling-autoscalinggroup-launchtemplateoverrides-instancetype). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub instance_type: Option<::Value>, - /// Property [`LaunchTemplateSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplateoverrides.html#cfn-autoscaling-autoscalinggroup-launchtemplateoverrides-launchtemplatespecification). + pub struct BaselineEbsBandwidthMbpsRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-baselineebsbandwidthmbpsrequest.html#cfn-autoscaling-autoscalinggroup-baselineebsbandwidthmbpsrequest-max). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub launch_template_specification: Option<::Value>, - /// Property [`WeightedCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplateoverrides.html#cfn-autoscaling-autoscalinggroup-launchtemplateoverrides-weightedcapacity). + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-baselineebsbandwidthmbpsrequest.html#cfn-autoscaling-autoscalinggroup-baselineebsbandwidthmbpsrequest-min). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub weighted_capacity: Option<::Value>, + pub min: Option<::Value>, } - impl ::codec::SerializeValue for LaunchTemplateOverrides { + impl ::codec::SerializeValue for BaselineEbsBandwidthMbpsRequest { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref instance_type) = self.instance_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceType", instance_type)?; - } - if let Some(ref launch_template_specification) = self.launch_template_specification { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplateSpecification", launch_template_specification)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; } - if let Some(ref weighted_capacity) = self.weighted_capacity { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "WeightedCapacity", weighted_capacity)?; + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for LaunchTemplateOverrides { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for BaselineEbsBandwidthMbpsRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = LaunchTemplateOverrides; + type Value = BaselineEbsBandwidthMbpsRequest; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type LaunchTemplateOverrides") + write!(f, "a struct of type BaselineEbsBandwidthMbpsRequest") } fn visit_map>(self, mut map: A) -> Result { - let mut instance_type: Option<::Value> = None; - let mut launch_template_specification: Option<::Value> = None; - let mut weighted_capacity: Option<::Value> = None; + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "InstanceType" => { - instance_type = ::serde::de::MapAccess::next_value(&mut map)?; - } - "LaunchTemplateSpecification" => { - launch_template_specification = ::serde::de::MapAccess::next_value(&mut map)?; + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; } - "WeightedCapacity" => { - weighted_capacity = ::serde::de::MapAccess::next_value(&mut map)?; + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(LaunchTemplateOverrides { - instance_type: instance_type, - launch_template_specification: launch_template_specification, - weighted_capacity: weighted_capacity, + Ok(BaselineEbsBandwidthMbpsRequest { + max: max, + min: min, }) } } @@ -1611,71 +1587,658 @@ pub mod auto_scaling_group { } } - /// The [`AWS::AutoScaling::AutoScalingGroup.LaunchTemplateSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplatespecification.html) property type. + /// The [`AWS::AutoScaling::AutoScalingGroup.InstanceRequirements`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html) property type. #[derive(Debug, Default)] - pub struct LaunchTemplateSpecification { - /// Property [`LaunchTemplateId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplatespecification.html#cfn-autoscaling-autoscalinggroup-launchtemplatespecification-launchtemplateid). + pub struct InstanceRequirements { + /// Property [`AcceleratorCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-acceleratorcount). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub launch_template_id: Option<::Value>, - /// Property [`LaunchTemplateName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplatespecification.html#cfn-autoscaling-autoscalinggroup-launchtemplatespecification-launchtemplatename). + pub accelerator_count: Option<::Value>, + /// Property [`AcceleratorManufacturers`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-acceleratormanufacturers). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub launch_template_name: Option<::Value>, - /// Property [`Version`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplatespecification.html#cfn-autoscaling-autoscalinggroup-launchtemplatespecification-version). + pub accelerator_manufacturers: Option<::ValueList>, + /// Property [`AcceleratorNames`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-acceleratornames). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub version: ::Value, + pub accelerator_names: Option<::ValueList>, + /// Property [`AcceleratorTotalMemoryMiB`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-acceleratortotalmemorymib). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub accelerator_total_memory_mi_b: Option<::Value>, + /// Property [`AcceleratorTypes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-acceleratortypes). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub accelerator_types: Option<::ValueList>, + /// Property [`BareMetal`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-baremetal). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub bare_metal: Option<::Value>, + /// Property [`BaselineEbsBandwidthMbps`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-baselineebsbandwidthmbps). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub baseline_ebs_bandwidth_mbps: Option<::Value>, + /// Property [`BurstablePerformance`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-burstableperformance). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub burstable_performance: Option<::Value>, + /// Property [`CpuManufacturers`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-cpumanufacturers). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub cpu_manufacturers: Option<::ValueList>, + /// Property [`ExcludedInstanceTypes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-excludedinstancetypes). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub excluded_instance_types: Option<::ValueList>, + /// Property [`InstanceGenerations`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-instancegenerations). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub instance_generations: Option<::ValueList>, + /// Property [`LocalStorage`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-localstorage). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub local_storage: Option<::Value>, + /// Property [`LocalStorageTypes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-localstoragetypes). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub local_storage_types: Option<::ValueList>, + /// Property [`MemoryGiBPerVCpu`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-memorygibpervcpu). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub memory_gi_b_per_v_cpu: Option<::Value>, + /// Property [`MemoryMiB`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-memorymib). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub memory_mi_b: Option<::Value>, + /// Property [`NetworkInterfaceCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-networkinterfacecount). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub network_interface_count: Option<::Value>, + /// Property [`OnDemandMaxPricePercentageOverLowestPrice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-ondemandmaxpricepercentageoverlowestprice). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub on_demand_max_price_percentage_over_lowest_price: Option<::Value>, + /// Property [`RequireHibernateSupport`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-requirehibernatesupport). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub require_hibernate_support: Option<::Value>, + /// Property [`SpotMaxPricePercentageOverLowestPrice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-spotmaxpricepercentageoverlowestprice). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub spot_max_price_percentage_over_lowest_price: Option<::Value>, + /// Property [`TotalLocalStorageGB`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-totallocalstoragegb). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub total_local_storage_gb: Option<::Value>, + /// Property [`VCpuCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancerequirements.html#cfn-autoscaling-autoscalinggroup-instancerequirements-vcpucount). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub v_cpu_count: Option<::Value>, } - impl ::codec::SerializeValue for LaunchTemplateSpecification { + impl ::codec::SerializeValue for InstanceRequirements { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref launch_template_id) = self.launch_template_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplateId", launch_template_id)?; + if let Some(ref accelerator_count) = self.accelerator_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcceleratorCount", accelerator_count)?; } - if let Some(ref launch_template_name) = self.launch_template_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplateName", launch_template_name)?; + if let Some(ref accelerator_manufacturers) = self.accelerator_manufacturers { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcceleratorManufacturers", accelerator_manufacturers)?; + } + if let Some(ref accelerator_names) = self.accelerator_names { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcceleratorNames", accelerator_names)?; + } + if let Some(ref accelerator_total_memory_mi_b) = self.accelerator_total_memory_mi_b { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcceleratorTotalMemoryMiB", accelerator_total_memory_mi_b)?; + } + if let Some(ref accelerator_types) = self.accelerator_types { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcceleratorTypes", accelerator_types)?; + } + if let Some(ref bare_metal) = self.bare_metal { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BareMetal", bare_metal)?; + } + if let Some(ref baseline_ebs_bandwidth_mbps) = self.baseline_ebs_bandwidth_mbps { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BaselineEbsBandwidthMbps", baseline_ebs_bandwidth_mbps)?; + } + if let Some(ref burstable_performance) = self.burstable_performance { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BurstablePerformance", burstable_performance)?; + } + if let Some(ref cpu_manufacturers) = self.cpu_manufacturers { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CpuManufacturers", cpu_manufacturers)?; + } + if let Some(ref excluded_instance_types) = self.excluded_instance_types { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExcludedInstanceTypes", excluded_instance_types)?; + } + if let Some(ref instance_generations) = self.instance_generations { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceGenerations", instance_generations)?; + } + if let Some(ref local_storage) = self.local_storage { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LocalStorage", local_storage)?; + } + if let Some(ref local_storage_types) = self.local_storage_types { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LocalStorageTypes", local_storage_types)?; + } + if let Some(ref memory_gi_b_per_v_cpu) = self.memory_gi_b_per_v_cpu { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MemoryGiBPerVCpu", memory_gi_b_per_v_cpu)?; + } + if let Some(ref memory_mi_b) = self.memory_mi_b { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MemoryMiB", memory_mi_b)?; + } + if let Some(ref network_interface_count) = self.network_interface_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaceCount", network_interface_count)?; + } + if let Some(ref on_demand_max_price_percentage_over_lowest_price) = self.on_demand_max_price_percentage_over_lowest_price { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OnDemandMaxPricePercentageOverLowestPrice", on_demand_max_price_percentage_over_lowest_price)?; + } + if let Some(ref require_hibernate_support) = self.require_hibernate_support { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RequireHibernateSupport", require_hibernate_support)?; + } + if let Some(ref spot_max_price_percentage_over_lowest_price) = self.spot_max_price_percentage_over_lowest_price { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpotMaxPricePercentageOverLowestPrice", spot_max_price_percentage_over_lowest_price)?; + } + if let Some(ref total_local_storage_gb) = self.total_local_storage_gb { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TotalLocalStorageGB", total_local_storage_gb)?; + } + if let Some(ref v_cpu_count) = self.v_cpu_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VCpuCount", v_cpu_count)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Version", &self.version)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for LaunchTemplateSpecification { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for InstanceRequirements { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = LaunchTemplateSpecification; + type Value = InstanceRequirements; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type LaunchTemplateSpecification") + write!(f, "a struct of type InstanceRequirements") } fn visit_map>(self, mut map: A) -> Result { - let mut launch_template_id: Option<::Value> = None; - let mut launch_template_name: Option<::Value> = None; - let mut version: Option<::Value> = None; + let mut accelerator_count: Option<::Value> = None; + let mut accelerator_manufacturers: Option<::ValueList> = None; + let mut accelerator_names: Option<::ValueList> = None; + let mut accelerator_total_memory_mi_b: Option<::Value> = None; + let mut accelerator_types: Option<::ValueList> = None; + let mut bare_metal: Option<::Value> = None; + let mut baseline_ebs_bandwidth_mbps: Option<::Value> = None; + let mut burstable_performance: Option<::Value> = None; + let mut cpu_manufacturers: Option<::ValueList> = None; + let mut excluded_instance_types: Option<::ValueList> = None; + let mut instance_generations: Option<::ValueList> = None; + let mut local_storage: Option<::Value> = None; + let mut local_storage_types: Option<::ValueList> = None; + let mut memory_gi_b_per_v_cpu: Option<::Value> = None; + let mut memory_mi_b: Option<::Value> = None; + let mut network_interface_count: Option<::Value> = None; + let mut on_demand_max_price_percentage_over_lowest_price: Option<::Value> = None; + let mut require_hibernate_support: Option<::Value> = None; + let mut spot_max_price_percentage_over_lowest_price: Option<::Value> = None; + let mut total_local_storage_gb: Option<::Value> = None; + let mut v_cpu_count: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "LaunchTemplateId" => { - launch_template_id = ::serde::de::MapAccess::next_value(&mut map)?; + "AcceleratorCount" => { + accelerator_count = ::serde::de::MapAccess::next_value(&mut map)?; } - "LaunchTemplateName" => { - launch_template_name = ::serde::de::MapAccess::next_value(&mut map)?; + "AcceleratorManufacturers" => { + accelerator_manufacturers = ::serde::de::MapAccess::next_value(&mut map)?; } - "Version" => { - version = ::serde::de::MapAccess::next_value(&mut map)?; + "AcceleratorNames" => { + accelerator_names = ::serde::de::MapAccess::next_value(&mut map)?; } - _ => {} - } - } - + "AcceleratorTotalMemoryMiB" => { + accelerator_total_memory_mi_b = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AcceleratorTypes" => { + accelerator_types = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BareMetal" => { + bare_metal = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BaselineEbsBandwidthMbps" => { + baseline_ebs_bandwidth_mbps = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BurstablePerformance" => { + burstable_performance = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CpuManufacturers" => { + cpu_manufacturers = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ExcludedInstanceTypes" => { + excluded_instance_types = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceGenerations" => { + instance_generations = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LocalStorage" => { + local_storage = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LocalStorageTypes" => { + local_storage_types = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MemoryGiBPerVCpu" => { + memory_gi_b_per_v_cpu = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MemoryMiB" => { + memory_mi_b = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NetworkInterfaceCount" => { + network_interface_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OnDemandMaxPricePercentageOverLowestPrice" => { + on_demand_max_price_percentage_over_lowest_price = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RequireHibernateSupport" => { + require_hibernate_support = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SpotMaxPricePercentageOverLowestPrice" => { + spot_max_price_percentage_over_lowest_price = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TotalLocalStorageGB" => { + total_local_storage_gb = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VCpuCount" => { + v_cpu_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(InstanceRequirements { + accelerator_count: accelerator_count, + accelerator_manufacturers: accelerator_manufacturers, + accelerator_names: accelerator_names, + accelerator_total_memory_mi_b: accelerator_total_memory_mi_b, + accelerator_types: accelerator_types, + bare_metal: bare_metal, + baseline_ebs_bandwidth_mbps: baseline_ebs_bandwidth_mbps, + burstable_performance: burstable_performance, + cpu_manufacturers: cpu_manufacturers, + excluded_instance_types: excluded_instance_types, + instance_generations: instance_generations, + local_storage: local_storage, + local_storage_types: local_storage_types, + memory_gi_b_per_v_cpu: memory_gi_b_per_v_cpu, + memory_mi_b: memory_mi_b, + network_interface_count: network_interface_count, + on_demand_max_price_percentage_over_lowest_price: on_demand_max_price_percentage_over_lowest_price, + require_hibernate_support: require_hibernate_support, + spot_max_price_percentage_over_lowest_price: spot_max_price_percentage_over_lowest_price, + total_local_storage_gb: total_local_storage_gb, + v_cpu_count: v_cpu_count, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AutoScaling::AutoScalingGroup.InstancesDistribution`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancesdistribution.html) property type. + #[derive(Debug, Default)] + pub struct InstancesDistribution { + /// Property [`OnDemandAllocationStrategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancesdistribution.html#cfn-autoscaling-autoscalinggroup-instancesdistribution-ondemandallocationstrategy). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub on_demand_allocation_strategy: Option<::Value>, + /// Property [`OnDemandBaseCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancesdistribution.html#cfn-autoscaling-autoscalinggroup-instancesdistribution-ondemandbasecapacity). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub on_demand_base_capacity: Option<::Value>, + /// Property [`OnDemandPercentageAboveBaseCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancesdistribution.html#cfn-autoscaling-autoscalinggroup-instancesdistribution-ondemandpercentageabovebasecapacity). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub on_demand_percentage_above_base_capacity: Option<::Value>, + /// Property [`SpotAllocationStrategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancesdistribution.html#cfn-autoscaling-autoscalinggroup-instancesdistribution-spotallocationstrategy). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub spot_allocation_strategy: Option<::Value>, + /// Property [`SpotInstancePools`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancesdistribution.html#cfn-autoscaling-autoscalinggroup-instancesdistribution-spotinstancepools). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub spot_instance_pools: Option<::Value>, + /// Property [`SpotMaxPrice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-instancesdistribution.html#cfn-autoscaling-autoscalinggroup-instancesdistribution-spotmaxprice). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub spot_max_price: Option<::Value>, + } + + impl ::codec::SerializeValue for InstancesDistribution { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref on_demand_allocation_strategy) = self.on_demand_allocation_strategy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OnDemandAllocationStrategy", on_demand_allocation_strategy)?; + } + if let Some(ref on_demand_base_capacity) = self.on_demand_base_capacity { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OnDemandBaseCapacity", on_demand_base_capacity)?; + } + if let Some(ref on_demand_percentage_above_base_capacity) = self.on_demand_percentage_above_base_capacity { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OnDemandPercentageAboveBaseCapacity", on_demand_percentage_above_base_capacity)?; + } + if let Some(ref spot_allocation_strategy) = self.spot_allocation_strategy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpotAllocationStrategy", spot_allocation_strategy)?; + } + if let Some(ref spot_instance_pools) = self.spot_instance_pools { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpotInstancePools", spot_instance_pools)?; + } + if let Some(ref spot_max_price) = self.spot_max_price { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpotMaxPrice", spot_max_price)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for InstancesDistribution { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = InstancesDistribution; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type InstancesDistribution") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut on_demand_allocation_strategy: Option<::Value> = None; + let mut on_demand_base_capacity: Option<::Value> = None; + let mut on_demand_percentage_above_base_capacity: Option<::Value> = None; + let mut spot_allocation_strategy: Option<::Value> = None; + let mut spot_instance_pools: Option<::Value> = None; + let mut spot_max_price: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "OnDemandAllocationStrategy" => { + on_demand_allocation_strategy = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OnDemandBaseCapacity" => { + on_demand_base_capacity = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OnDemandPercentageAboveBaseCapacity" => { + on_demand_percentage_above_base_capacity = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SpotAllocationStrategy" => { + spot_allocation_strategy = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SpotInstancePools" => { + spot_instance_pools = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SpotMaxPrice" => { + spot_max_price = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(InstancesDistribution { + on_demand_allocation_strategy: on_demand_allocation_strategy, + on_demand_base_capacity: on_demand_base_capacity, + on_demand_percentage_above_base_capacity: on_demand_percentage_above_base_capacity, + spot_allocation_strategy: spot_allocation_strategy, + spot_instance_pools: spot_instance_pools, + spot_max_price: spot_max_price, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AutoScaling::AutoScalingGroup.LaunchTemplate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplate.html) property type. + #[derive(Debug, Default)] + pub struct LaunchTemplate { + /// Property [`LaunchTemplateSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplate.html#cfn-as-group-launchtemplate). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub launch_template_specification: ::Value, + /// Property [`Overrides`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplate.html#cfn-as-mixedinstancespolicy-overrides). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub overrides: Option<::ValueList>, + } + + impl ::codec::SerializeValue for LaunchTemplate { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplateSpecification", &self.launch_template_specification)?; + if let Some(ref overrides) = self.overrides { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Overrides", overrides)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for LaunchTemplate { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = LaunchTemplate; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type LaunchTemplate") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut launch_template_specification: Option<::Value> = None; + let mut overrides: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "LaunchTemplateSpecification" => { + launch_template_specification = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Overrides" => { + overrides = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(LaunchTemplate { + launch_template_specification: launch_template_specification.ok_or(::serde::de::Error::missing_field("LaunchTemplateSpecification"))?, + overrides: overrides, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AutoScaling::AutoScalingGroup.LaunchTemplateOverrides`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplateoverrides.html) property type. + #[derive(Debug, Default)] + pub struct LaunchTemplateOverrides { + /// Property [`InstanceRequirements`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplateoverrides.html#cfn-as-mixedinstancespolicy-instancerequirements). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub instance_requirements: Option<::Value>, + /// Property [`InstanceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplateoverrides.html#cfn-autoscaling-autoscalinggroup-launchtemplateoverrides-instancetype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub instance_type: Option<::Value>, + /// Property [`LaunchTemplateSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplateoverrides.html#cfn-autoscaling-autoscalinggroup-launchtemplateoverrides-launchtemplatespecification). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub launch_template_specification: Option<::Value>, + /// Property [`WeightedCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-mixedinstancespolicy-launchtemplateoverrides.html#cfn-autoscaling-autoscalinggroup-launchtemplateoverrides-weightedcapacity). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub weighted_capacity: Option<::Value>, + } + + impl ::codec::SerializeValue for LaunchTemplateOverrides { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref instance_requirements) = self.instance_requirements { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceRequirements", instance_requirements)?; + } + if let Some(ref instance_type) = self.instance_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceType", instance_type)?; + } + if let Some(ref launch_template_specification) = self.launch_template_specification { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplateSpecification", launch_template_specification)?; + } + if let Some(ref weighted_capacity) = self.weighted_capacity { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "WeightedCapacity", weighted_capacity)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for LaunchTemplateOverrides { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = LaunchTemplateOverrides; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type LaunchTemplateOverrides") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut instance_requirements: Option<::Value> = None; + let mut instance_type: Option<::Value> = None; + let mut launch_template_specification: Option<::Value> = None; + let mut weighted_capacity: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "InstanceRequirements" => { + instance_requirements = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceType" => { + instance_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LaunchTemplateSpecification" => { + launch_template_specification = ::serde::de::MapAccess::next_value(&mut map)?; + } + "WeightedCapacity" => { + weighted_capacity = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(LaunchTemplateOverrides { + instance_requirements: instance_requirements, + instance_type: instance_type, + launch_template_specification: launch_template_specification, + weighted_capacity: weighted_capacity, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AutoScaling::AutoScalingGroup.LaunchTemplateSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplatespecification.html) property type. + #[derive(Debug, Default)] + pub struct LaunchTemplateSpecification { + /// Property [`LaunchTemplateId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplatespecification.html#cfn-autoscaling-autoscalinggroup-launchtemplatespecification-launchtemplateid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub launch_template_id: Option<::Value>, + /// Property [`LaunchTemplateName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplatespecification.html#cfn-autoscaling-autoscalinggroup-launchtemplatespecification-launchtemplatename). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub launch_template_name: Option<::Value>, + /// Property [`Version`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-launchtemplatespecification.html#cfn-autoscaling-autoscalinggroup-launchtemplatespecification-version). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub version: ::Value, + } + + impl ::codec::SerializeValue for LaunchTemplateSpecification { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref launch_template_id) = self.launch_template_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplateId", launch_template_id)?; + } + if let Some(ref launch_template_name) = self.launch_template_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplateName", launch_template_name)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Version", &self.version)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for LaunchTemplateSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = LaunchTemplateSpecification; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type LaunchTemplateSpecification") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut launch_template_id: Option<::Value> = None; + let mut launch_template_name: Option<::Value> = None; + let mut version: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "LaunchTemplateId" => { + launch_template_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LaunchTemplateName" => { + launch_template_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Version" => { + version = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + Ok(LaunchTemplateSpecification { launch_template_id: launch_template_id, launch_template_name: launch_template_name, @@ -1688,125 +2251,1367 @@ pub mod auto_scaling_group { } } - /// The [`AWS::AutoScaling::AutoScalingGroup.LifecycleHookSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html) property type. + /// The [`AWS::AutoScaling::AutoScalingGroup.LifecycleHookSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html) property type. + #[derive(Debug, Default)] + pub struct LifecycleHookSpecification { + /// Property [`DefaultResult`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html#cfn-autoscaling-autoscalinggroup-lifecyclehookspecification-defaultresult). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub default_result: Option<::Value>, + /// Property [`HeartbeatTimeout`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html#cfn-autoscaling-autoscalinggroup-lifecyclehookspecification-heartbeattimeout). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub heartbeat_timeout: Option<::Value>, + /// Property [`LifecycleHookName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html#cfn-autoscaling-autoscalinggroup-lifecyclehookspecification-lifecyclehookname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub lifecycle_hook_name: ::Value, + /// Property [`LifecycleTransition`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html#cfn-autoscaling-autoscalinggroup-lifecyclehookspecification-lifecycletransition). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub lifecycle_transition: ::Value, + /// Property [`NotificationMetadata`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html#cfn-autoscaling-autoscalinggroup-lifecyclehookspecification-notificationmetadata). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub notification_metadata: Option<::Value>, + /// Property [`NotificationTargetARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html#cfn-autoscaling-autoscalinggroup-lifecyclehookspecification-notificationtargetarn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub notification_target_arn: Option<::Value>, + /// Property [`RoleARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html#cfn-autoscaling-autoscalinggroup-lifecyclehookspecification-rolearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub role_arn: Option<::Value>, + } + + impl ::codec::SerializeValue for LifecycleHookSpecification { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref default_result) = self.default_result { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DefaultResult", default_result)?; + } + if let Some(ref heartbeat_timeout) = self.heartbeat_timeout { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HeartbeatTimeout", heartbeat_timeout)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LifecycleHookName", &self.lifecycle_hook_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LifecycleTransition", &self.lifecycle_transition)?; + if let Some(ref notification_metadata) = self.notification_metadata { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NotificationMetadata", notification_metadata)?; + } + if let Some(ref notification_target_arn) = self.notification_target_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NotificationTargetARN", notification_target_arn)?; + } + if let Some(ref role_arn) = self.role_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RoleARN", role_arn)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for LifecycleHookSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = LifecycleHookSpecification; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type LifecycleHookSpecification") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut default_result: Option<::Value> = None; + let mut heartbeat_timeout: Option<::Value> = None; + let mut lifecycle_hook_name: Option<::Value> = None; + let mut lifecycle_transition: Option<::Value> = None; + let mut notification_metadata: Option<::Value> = None; + let mut notification_target_arn: Option<::Value> = None; + let mut role_arn: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DefaultResult" => { + default_result = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HeartbeatTimeout" => { + heartbeat_timeout = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LifecycleHookName" => { + lifecycle_hook_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LifecycleTransition" => { + lifecycle_transition = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NotificationMetadata" => { + notification_metadata = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NotificationTargetARN" => { + notification_target_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RoleARN" => { + role_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(LifecycleHookSpecification { + default_result: default_result, + heartbeat_timeout: heartbeat_timeout, + lifecycle_hook_name: lifecycle_hook_name.ok_or(::serde::de::Error::missing_field("LifecycleHookName"))?, + lifecycle_transition: lifecycle_transition.ok_or(::serde::de::Error::missing_field("LifecycleTransition"))?, + notification_metadata: notification_metadata, + notification_target_arn: notification_target_arn, + role_arn: role_arn, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AutoScaling::AutoScalingGroup.MemoryGiBPerVCpuRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-memorygibpervcpurequest.html) property type. + #[derive(Debug, Default)] + pub struct MemoryGiBPerVCpuRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-memorygibpervcpurequest.html#cfn-autoscaling-autoscalinggroup-memorygibpervcpurequest-max). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-memorygibpervcpurequest.html#cfn-autoscaling-autoscalinggroup-memorygibpervcpurequest-min). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub min: Option<::Value>, + } + + impl ::codec::SerializeValue for MemoryGiBPerVCpuRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for MemoryGiBPerVCpuRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MemoryGiBPerVCpuRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MemoryGiBPerVCpuRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(MemoryGiBPerVCpuRequest { + max: max, + min: min, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AutoScaling::AutoScalingGroup.MemoryMiBRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-memorymibrequest.html) property type. + #[derive(Debug, Default)] + pub struct MemoryMiBRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-memorymibrequest.html#cfn-autoscaling-autoscalinggroup-memorymibrequest-max). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-memorymibrequest.html#cfn-autoscaling-autoscalinggroup-memorymibrequest-min). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub min: Option<::Value>, + } + + impl ::codec::SerializeValue for MemoryMiBRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for MemoryMiBRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MemoryMiBRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MemoryMiBRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(MemoryMiBRequest { + max: max, + min: min, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AutoScaling::AutoScalingGroup.MetricsCollection`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-metricscollection.html) property type. + #[derive(Debug, Default)] + pub struct MetricsCollection { + /// Property [`Granularity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-metricscollection.html#cfn-as-metricscollection-granularity). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub granularity: ::Value, + /// Property [`Metrics`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-metricscollection.html#cfn-as-metricscollection-metrics). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub metrics: Option<::ValueList>, + } + + impl ::codec::SerializeValue for MetricsCollection { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Granularity", &self.granularity)?; + if let Some(ref metrics) = self.metrics { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Metrics", metrics)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for MetricsCollection { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MetricsCollection; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MetricsCollection") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut granularity: Option<::Value> = None; + let mut metrics: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Granularity" => { + granularity = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Metrics" => { + metrics = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(MetricsCollection { + granularity: granularity.ok_or(::serde::de::Error::missing_field("Granularity"))?, + metrics: metrics, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AutoScaling::AutoScalingGroup.MixedInstancesPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-group-mixedinstancespolicy.html) property type. + #[derive(Debug, Default)] + pub struct MixedInstancesPolicy { + /// Property [`InstancesDistribution`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-group-mixedinstancespolicy.html#cfn-as-mixedinstancespolicy-instancesdistribution). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub instances_distribution: Option<::Value>, + /// Property [`LaunchTemplate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-group-mixedinstancespolicy.html#cfn-as-mixedinstancespolicy-launchtemplate). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub launch_template: ::Value, + } + + impl ::codec::SerializeValue for MixedInstancesPolicy { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref instances_distribution) = self.instances_distribution { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstancesDistribution", instances_distribution)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplate", &self.launch_template)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for MixedInstancesPolicy { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MixedInstancesPolicy; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MixedInstancesPolicy") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut instances_distribution: Option<::Value> = None; + let mut launch_template: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "InstancesDistribution" => { + instances_distribution = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LaunchTemplate" => { + launch_template = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(MixedInstancesPolicy { + instances_distribution: instances_distribution, + launch_template: launch_template.ok_or(::serde::de::Error::missing_field("LaunchTemplate"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AutoScaling::AutoScalingGroup.NetworkInterfaceCountRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-networkinterfacecountrequest.html) property type. + #[derive(Debug, Default)] + pub struct NetworkInterfaceCountRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-networkinterfacecountrequest.html#cfn-autoscaling-autoscalinggroup-networkinterfacecountrequest-max). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-networkinterfacecountrequest.html#cfn-autoscaling-autoscalinggroup-networkinterfacecountrequest-min). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub min: Option<::Value>, + } + + impl ::codec::SerializeValue for NetworkInterfaceCountRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for NetworkInterfaceCountRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = NetworkInterfaceCountRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type NetworkInterfaceCountRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(NetworkInterfaceCountRequest { + max: max, + min: min, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AutoScaling::AutoScalingGroup.NotificationConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-notificationconfigurations.html) property type. + #[derive(Debug, Default)] + pub struct NotificationConfiguration { + /// Property [`NotificationTypes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-notificationconfigurations.html#cfn-as-group-notificationconfigurations-notificationtypes). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub notification_types: Option<::ValueList>, + /// Property [`TopicARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-notificationconfigurations.html#cfn-autoscaling-autoscalinggroup-notificationconfigurations-topicarn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub topic_arn: ::Value, + } + + impl ::codec::SerializeValue for NotificationConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref notification_types) = self.notification_types { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NotificationTypes", notification_types)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TopicARN", &self.topic_arn)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for NotificationConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = NotificationConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type NotificationConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut notification_types: Option<::ValueList> = None; + let mut topic_arn: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "NotificationTypes" => { + notification_types = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TopicARN" => { + topic_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(NotificationConfiguration { + notification_types: notification_types, + topic_arn: topic_arn.ok_or(::serde::de::Error::missing_field("TopicARN"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AutoScaling::AutoScalingGroup.TagProperty`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-tags.html) property type. + #[derive(Debug, Default)] + pub struct TagProperty { + /// Property [`Key`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-tags.html#cfn-as-tags-Key). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub key: ::Value, + /// Property [`PropagateAtLaunch`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-tags.html#cfn-as-tags-PropagateAtLaunch). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub propagate_at_launch: ::Value, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-tags.html#cfn-as-tags-Value). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub value: ::Value, + } + + impl ::codec::SerializeValue for TagProperty { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Key", &self.key)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PropagateAtLaunch", &self.propagate_at_launch)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", &self.value)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for TagProperty { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = TagProperty; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type TagProperty") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut key: Option<::Value> = None; + let mut propagate_at_launch: Option<::Value> = None; + let mut value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Key" => { + key = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PropagateAtLaunch" => { + propagate_at_launch = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(TagProperty { + key: key.ok_or(::serde::de::Error::missing_field("Key"))?, + propagate_at_launch: propagate_at_launch.ok_or(::serde::de::Error::missing_field("PropagateAtLaunch"))?, + value: value.ok_or(::serde::de::Error::missing_field("Value"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AutoScaling::AutoScalingGroup.TotalLocalStorageGBRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-totallocalstoragegbrequest.html) property type. + #[derive(Debug, Default)] + pub struct TotalLocalStorageGBRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-totallocalstoragegbrequest.html#cfn-autoscaling-autoscalinggroup-totallocalstoragegbrequest-max). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-totallocalstoragegbrequest.html#cfn-autoscaling-autoscalinggroup-totallocalstoragegbrequest-min). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub min: Option<::Value>, + } + + impl ::codec::SerializeValue for TotalLocalStorageGBRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for TotalLocalStorageGBRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = TotalLocalStorageGBRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type TotalLocalStorageGBRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(TotalLocalStorageGBRequest { + max: max, + min: min, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AutoScaling::AutoScalingGroup.VCpuCountRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-vcpucountrequest.html) property type. + #[derive(Debug, Default)] + pub struct VCpuCountRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-vcpucountrequest.html#cfn-autoscaling-autoscalinggroup-vcpucountrequest-max). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-vcpucountrequest.html#cfn-autoscaling-autoscalinggroup-vcpucountrequest-min). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub min: Option<::Value>, + } + + impl ::codec::SerializeValue for VCpuCountRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for VCpuCountRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = VCpuCountRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type VCpuCountRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(VCpuCountRequest { + max: max, + min: min, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + +pub mod launch_configuration { + //! Property types for the `LaunchConfiguration` resource. + + /// The [`AWS::AutoScaling::LaunchConfiguration.BlockDevice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevice.html) property type. + #[derive(Debug, Default)] + pub struct BlockDevice { + /// Property [`DeleteOnTermination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevice.html#cfn-autoscaling-launchconfiguration-blockdevice-deleteontermination). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub delete_on_termination: Option<::Value>, + /// Property [`Encrypted`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevice.html#cfn-autoscaling-launchconfiguration-blockdevice-encrypted). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub encrypted: Option<::Value>, + /// Property [`Iops`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevice.html#cfn-autoscaling-launchconfiguration-blockdevice-iops). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub iops: Option<::Value>, + /// Property [`SnapshotId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevice.html#cfn-autoscaling-launchconfiguration-blockdevice-snapshotid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub snapshot_id: Option<::Value>, + /// Property [`Throughput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevice.html#cfn-autoscaling-launchconfiguration-blockdevice-throughput). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub throughput: Option<::Value>, + /// Property [`VolumeSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevice.html#cfn-autoscaling-launchconfiguration-blockdevice-volumesize). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub volume_size: Option<::Value>, + /// Property [`VolumeType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevice.html#cfn-autoscaling-launchconfiguration-blockdevice-volumetype). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub volume_type: Option<::Value>, + } + + impl ::codec::SerializeValue for BlockDevice { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref delete_on_termination) = self.delete_on_termination { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeleteOnTermination", delete_on_termination)?; + } + if let Some(ref encrypted) = self.encrypted { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Encrypted", encrypted)?; + } + if let Some(ref iops) = self.iops { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Iops", iops)?; + } + if let Some(ref snapshot_id) = self.snapshot_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SnapshotId", snapshot_id)?; + } + if let Some(ref throughput) = self.throughput { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Throughput", throughput)?; + } + if let Some(ref volume_size) = self.volume_size { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VolumeSize", volume_size)?; + } + if let Some(ref volume_type) = self.volume_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VolumeType", volume_type)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for BlockDevice { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = BlockDevice; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type BlockDevice") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut delete_on_termination: Option<::Value> = None; + let mut encrypted: Option<::Value> = None; + let mut iops: Option<::Value> = None; + let mut snapshot_id: Option<::Value> = None; + let mut throughput: Option<::Value> = None; + let mut volume_size: Option<::Value> = None; + let mut volume_type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DeleteOnTermination" => { + delete_on_termination = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Encrypted" => { + encrypted = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Iops" => { + iops = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SnapshotId" => { + snapshot_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Throughput" => { + throughput = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VolumeSize" => { + volume_size = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VolumeType" => { + volume_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(BlockDevice { + delete_on_termination: delete_on_termination, + encrypted: encrypted, + iops: iops, + snapshot_id: snapshot_id, + throughput: throughput, + volume_size: volume_size, + volume_type: volume_type, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AutoScaling::LaunchConfiguration.BlockDeviceMapping`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevicemapping.html) property type. + #[derive(Debug, Default)] + pub struct BlockDeviceMapping { + /// Property [`DeviceName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevicemapping.html#cfn-autoscaling-launchconfiguration-blockdevicemapping-devicename). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub device_name: ::Value, + /// Property [`Ebs`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevicemapping.html#cfn-autoscaling-launchconfiguration-blockdevicemapping-ebs). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub ebs: Option<::Value>, + /// Property [`NoDevice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevicemapping.html#cfn-autoscaling-launchconfiguration-blockdevicemapping-nodevice). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub no_device: Option<::Value>, + /// Property [`VirtualName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-blockdevicemapping.html#cfn-autoscaling-launchconfiguration-blockdevicemapping-virtualname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub virtual_name: Option<::Value>, + } + + impl ::codec::SerializeValue for BlockDeviceMapping { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeviceName", &self.device_name)?; + if let Some(ref ebs) = self.ebs { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ebs", ebs)?; + } + if let Some(ref no_device) = self.no_device { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NoDevice", no_device)?; + } + if let Some(ref virtual_name) = self.virtual_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VirtualName", virtual_name)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for BlockDeviceMapping { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = BlockDeviceMapping; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type BlockDeviceMapping") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut device_name: Option<::Value> = None; + let mut ebs: Option<::Value> = None; + let mut no_device: Option<::Value> = None; + let mut virtual_name: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DeviceName" => { + device_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Ebs" => { + ebs = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NoDevice" => { + no_device = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VirtualName" => { + virtual_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(BlockDeviceMapping { + device_name: device_name.ok_or(::serde::de::Error::missing_field("DeviceName"))?, + ebs: ebs, + no_device: no_device, + virtual_name: virtual_name, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AutoScaling::LaunchConfiguration.MetadataOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-metadataoptions.html) property type. + #[derive(Debug, Default)] + pub struct MetadataOptions { + /// Property [`HttpEndpoint`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-metadataoptions.html#cfn-autoscaling-launchconfiguration-metadataoptions-httpendpoint). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub http_endpoint: Option<::Value>, + /// Property [`HttpPutResponseHopLimit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-metadataoptions.html#cfn-autoscaling-launchconfiguration-metadataoptions-httpputresponsehoplimit). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub http_put_response_hop_limit: Option<::Value>, + /// Property [`HttpTokens`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfiguration-metadataoptions.html#cfn-autoscaling-launchconfiguration-metadataoptions-httptokens). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub http_tokens: Option<::Value>, + } + + impl ::codec::SerializeValue for MetadataOptions { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref http_endpoint) = self.http_endpoint { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HttpEndpoint", http_endpoint)?; + } + if let Some(ref http_put_response_hop_limit) = self.http_put_response_hop_limit { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HttpPutResponseHopLimit", http_put_response_hop_limit)?; + } + if let Some(ref http_tokens) = self.http_tokens { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HttpTokens", http_tokens)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for MetadataOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MetadataOptions; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MetadataOptions") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut http_endpoint: Option<::Value> = None; + let mut http_put_response_hop_limit: Option<::Value> = None; + let mut http_tokens: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "HttpEndpoint" => { + http_endpoint = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HttpPutResponseHopLimit" => { + http_put_response_hop_limit = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HttpTokens" => { + http_tokens = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(MetadataOptions { + http_endpoint: http_endpoint, + http_put_response_hop_limit: http_put_response_hop_limit, + http_tokens: http_tokens, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + +pub mod scaling_policy { + //! Property types for the `ScalingPolicy` resource. + + /// The [`AWS::AutoScaling::ScalingPolicy.CustomizedMetricSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-customizedmetricspecification.html) property type. + #[derive(Debug, Default)] + pub struct CustomizedMetricSpecification { + /// Property [`Dimensions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-customizedmetricspecification.html#cfn-autoscaling-scalingpolicy-customizedmetricspecification-dimensions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub dimensions: Option<::ValueList>, + /// Property [`MetricName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-customizedmetricspecification.html#cfn-autoscaling-scalingpolicy-customizedmetricspecification-metricname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub metric_name: ::Value, + /// Property [`Namespace`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-customizedmetricspecification.html#cfn-autoscaling-scalingpolicy-customizedmetricspecification-namespace). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub namespace: ::Value, + /// Property [`Statistic`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-customizedmetricspecification.html#cfn-autoscaling-scalingpolicy-customizedmetricspecification-statistic). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub statistic: ::Value, + /// Property [`Unit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-customizedmetricspecification.html#cfn-autoscaling-scalingpolicy-customizedmetricspecification-unit). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub unit: Option<::Value>, + } + + impl ::codec::SerializeValue for CustomizedMetricSpecification { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref dimensions) = self.dimensions { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Dimensions", dimensions)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MetricName", &self.metric_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Namespace", &self.namespace)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Statistic", &self.statistic)?; + if let Some(ref unit) = self.unit { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Unit", unit)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CustomizedMetricSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CustomizedMetricSpecification; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CustomizedMetricSpecification") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut dimensions: Option<::ValueList> = None; + let mut metric_name: Option<::Value> = None; + let mut namespace: Option<::Value> = None; + let mut statistic: Option<::Value> = None; + let mut unit: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Dimensions" => { + dimensions = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MetricName" => { + metric_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Namespace" => { + namespace = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Statistic" => { + statistic = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Unit" => { + unit = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CustomizedMetricSpecification { + dimensions: dimensions, + metric_name: metric_name.ok_or(::serde::de::Error::missing_field("MetricName"))?, + namespace: namespace.ok_or(::serde::de::Error::missing_field("Namespace"))?, + statistic: statistic.ok_or(::serde::de::Error::missing_field("Statistic"))?, + unit: unit, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AutoScaling::ScalingPolicy.Metric`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metric.html) property type. #[derive(Debug, Default)] - pub struct LifecycleHookSpecification { - /// Property [`DefaultResult`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html#cfn-autoscaling-autoscalinggroup-lifecyclehookspecification-defaultresult). + pub struct Metric { + /// Property [`Dimensions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metric.html#cfn-autoscaling-scalingpolicy-metric-dimensions). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub default_result: Option<::Value>, - /// Property [`HeartbeatTimeout`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html#cfn-autoscaling-autoscalinggroup-lifecyclehookspecification-heartbeattimeout). + pub dimensions: Option<::ValueList>, + /// Property [`MetricName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metric.html#cfn-autoscaling-scalingpolicy-metric-metricname). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub heartbeat_timeout: Option<::Value>, - /// Property [`LifecycleHookName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html#cfn-autoscaling-autoscalinggroup-lifecyclehookspecification-lifecyclehookname). + pub metric_name: ::Value, + /// Property [`Namespace`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metric.html#cfn-autoscaling-scalingpolicy-metric-namespace). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub lifecycle_hook_name: ::Value, - /// Property [`LifecycleTransition`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html#cfn-autoscaling-autoscalinggroup-lifecyclehookspecification-lifecycletransition). + pub namespace: ::Value, + } + + impl ::codec::SerializeValue for Metric { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref dimensions) = self.dimensions { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Dimensions", dimensions)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MetricName", &self.metric_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Namespace", &self.namespace)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Metric { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Metric; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Metric") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut dimensions: Option<::ValueList> = None; + let mut metric_name: Option<::Value> = None; + let mut namespace: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Dimensions" => { + dimensions = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MetricName" => { + metric_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Namespace" => { + namespace = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Metric { + dimensions: dimensions, + metric_name: metric_name.ok_or(::serde::de::Error::missing_field("MetricName"))?, + namespace: namespace.ok_or(::serde::de::Error::missing_field("Namespace"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AutoScaling::ScalingPolicy.MetricDataQuery`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricdataquery.html) property type. + #[derive(Debug, Default)] + pub struct MetricDataQuery { + /// Property [`Expression`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricdataquery.html#cfn-autoscaling-scalingpolicy-metricdataquery-expression). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub lifecycle_transition: ::Value, - /// Property [`NotificationMetadata`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html#cfn-autoscaling-autoscalinggroup-lifecyclehookspecification-notificationmetadata). + pub expression: Option<::Value>, + /// Property [`Id`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricdataquery.html#cfn-autoscaling-scalingpolicy-metricdataquery-id). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub notification_metadata: Option<::Value>, - /// Property [`NotificationTargetARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html#cfn-autoscaling-autoscalinggroup-lifecyclehookspecification-notificationtargetarn). + pub id: ::Value, + /// Property [`Label`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricdataquery.html#cfn-autoscaling-scalingpolicy-metricdataquery-label). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub notification_target_arn: Option<::Value>, - /// Property [`RoleARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-autoscalinggroup-lifecyclehookspecification.html#cfn-autoscaling-autoscalinggroup-lifecyclehookspecification-rolearn). + pub label: Option<::Value>, + /// Property [`MetricStat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricdataquery.html#cfn-autoscaling-scalingpolicy-metricdataquery-metricstat). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub role_arn: Option<::Value>, + pub metric_stat: Option<::Value>, + /// Property [`ReturnData`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricdataquery.html#cfn-autoscaling-scalingpolicy-metricdataquery-returndata). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub return_data: Option<::Value>, } - impl ::codec::SerializeValue for LifecycleHookSpecification { + impl ::codec::SerializeValue for MetricDataQuery { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref default_result) = self.default_result { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DefaultResult", default_result)?; - } - if let Some(ref heartbeat_timeout) = self.heartbeat_timeout { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "HeartbeatTimeout", heartbeat_timeout)?; + if let Some(ref expression) = self.expression { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Expression", expression)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LifecycleHookName", &self.lifecycle_hook_name)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LifecycleTransition", &self.lifecycle_transition)?; - if let Some(ref notification_metadata) = self.notification_metadata { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NotificationMetadata", notification_metadata)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Id", &self.id)?; + if let Some(ref label) = self.label { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Label", label)?; } - if let Some(ref notification_target_arn) = self.notification_target_arn { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NotificationTargetARN", notification_target_arn)?; + if let Some(ref metric_stat) = self.metric_stat { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MetricStat", metric_stat)?; } - if let Some(ref role_arn) = self.role_arn { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "RoleARN", role_arn)?; + if let Some(ref return_data) = self.return_data { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReturnData", return_data)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for LifecycleHookSpecification { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for MetricDataQuery { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = LifecycleHookSpecification; + type Value = MetricDataQuery; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type LifecycleHookSpecification") + write!(f, "a struct of type MetricDataQuery") } fn visit_map>(self, mut map: A) -> Result { - let mut default_result: Option<::Value> = None; - let mut heartbeat_timeout: Option<::Value> = None; - let mut lifecycle_hook_name: Option<::Value> = None; - let mut lifecycle_transition: Option<::Value> = None; - let mut notification_metadata: Option<::Value> = None; - let mut notification_target_arn: Option<::Value> = None; - let mut role_arn: Option<::Value> = None; + let mut expression: Option<::Value> = None; + let mut id: Option<::Value> = None; + let mut label: Option<::Value> = None; + let mut metric_stat: Option<::Value> = None; + let mut return_data: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "DefaultResult" => { - default_result = ::serde::de::MapAccess::next_value(&mut map)?; + "Expression" => { + expression = ::serde::de::MapAccess::next_value(&mut map)?; } - "HeartbeatTimeout" => { - heartbeat_timeout = ::serde::de::MapAccess::next_value(&mut map)?; + "Id" => { + id = ::serde::de::MapAccess::next_value(&mut map)?; } - "LifecycleHookName" => { - lifecycle_hook_name = ::serde::de::MapAccess::next_value(&mut map)?; + "Label" => { + label = ::serde::de::MapAccess::next_value(&mut map)?; } - "LifecycleTransition" => { - lifecycle_transition = ::serde::de::MapAccess::next_value(&mut map)?; + "MetricStat" => { + metric_stat = ::serde::de::MapAccess::next_value(&mut map)?; } - "NotificationMetadata" => { - notification_metadata = ::serde::de::MapAccess::next_value(&mut map)?; + "ReturnData" => { + return_data = ::serde::de::MapAccess::next_value(&mut map)?; } - "NotificationTargetARN" => { - notification_target_arn = ::serde::de::MapAccess::next_value(&mut map)?; + _ => {} + } + } + + Ok(MetricDataQuery { + expression: expression, + id: id.ok_or(::serde::de::Error::missing_field("Id"))?, + label: label, + metric_stat: metric_stat, + return_data: return_data, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AutoScaling::ScalingPolicy.MetricDimension`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricdimension.html) property type. + #[derive(Debug, Default)] + pub struct MetricDimension { + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricdimension.html#cfn-autoscaling-scalingpolicy-metricdimension-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: ::Value, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricdimension.html#cfn-autoscaling-scalingpolicy-metricdimension-value). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub value: ::Value, + } + + impl ::codec::SerializeValue for MetricDimension { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", &self.value)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for MetricDimension { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MetricDimension; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MetricDimension") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut name: Option<::Value> = None; + let mut value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; } - "RoleARN" => { - role_arn = ::serde::de::MapAccess::next_value(&mut map)?; + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(LifecycleHookSpecification { - default_result: default_result, - heartbeat_timeout: heartbeat_timeout, - lifecycle_hook_name: lifecycle_hook_name.ok_or(::serde::de::Error::missing_field("LifecycleHookName"))?, - lifecycle_transition: lifecycle_transition.ok_or(::serde::de::Error::missing_field("LifecycleTransition"))?, - notification_metadata: notification_metadata, - notification_target_arn: notification_target_arn, - role_arn: role_arn, + Ok(MetricDimension { + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + value: value.ok_or(::serde::de::Error::missing_field("Value"))?, }) } } @@ -1815,62 +3620,73 @@ pub mod auto_scaling_group { } } - /// The [`AWS::AutoScaling::AutoScalingGroup.MetricsCollection`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-metricscollection.html) property type. + /// The [`AWS::AutoScaling::ScalingPolicy.MetricStat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricstat.html) property type. #[derive(Debug, Default)] - pub struct MetricsCollection { - /// Property [`Granularity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-metricscollection.html#cfn-as-metricscollection-granularity). + pub struct MetricStat { + /// Property [`Metric`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricstat.html#cfn-autoscaling-scalingpolicy-metricstat-metric). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub granularity: ::Value, - /// Property [`Metrics`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-metricscollection.html#cfn-as-metricscollection-metrics). + pub metric: ::Value, + /// Property [`Stat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricstat.html#cfn-autoscaling-scalingpolicy-metricstat-stat). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub metrics: Option<::ValueList>, + pub stat: ::Value, + /// Property [`Unit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricstat.html#cfn-autoscaling-scalingpolicy-metricstat-unit). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub unit: Option<::Value>, } - impl ::codec::SerializeValue for MetricsCollection { + impl ::codec::SerializeValue for MetricStat { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Granularity", &self.granularity)?; - if let Some(ref metrics) = self.metrics { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Metrics", metrics)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Metric", &self.metric)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Stat", &self.stat)?; + if let Some(ref unit) = self.unit { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Unit", unit)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for MetricsCollection { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for MetricStat { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = MetricsCollection; + type Value = MetricStat; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type MetricsCollection") + write!(f, "a struct of type MetricStat") } fn visit_map>(self, mut map: A) -> Result { - let mut granularity: Option<::Value> = None; - let mut metrics: Option<::ValueList> = None; + let mut metric: Option<::Value> = None; + let mut stat: Option<::Value> = None; + let mut unit: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Granularity" => { - granularity = ::serde::de::MapAccess::next_value(&mut map)?; + "Metric" => { + metric = ::serde::de::MapAccess::next_value(&mut map)?; } - "Metrics" => { - metrics = ::serde::de::MapAccess::next_value(&mut map)?; + "Stat" => { + stat = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Unit" => { + unit = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(MetricsCollection { - granularity: granularity.ok_or(::serde::de::Error::missing_field("Granularity"))?, - metrics: metrics, + Ok(MetricStat { + metric: metric.ok_or(::serde::de::Error::missing_field("Metric"))?, + stat: stat.ok_or(::serde::de::Error::missing_field("Stat"))?, + unit: unit, }) } } @@ -1879,62 +3695,62 @@ pub mod auto_scaling_group { } } - /// The [`AWS::AutoScaling::AutoScalingGroup.MixedInstancesPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-group-mixedinstancespolicy.html) property type. + /// The [`AWS::AutoScaling::ScalingPolicy.PredefinedMetricSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predefinedmetricspecification.html) property type. #[derive(Debug, Default)] - pub struct MixedInstancesPolicy { - /// Property [`InstancesDistribution`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-group-mixedinstancespolicy.html#cfn-as-mixedinstancespolicy-instancesdistribution). + pub struct PredefinedMetricSpecification { + /// Property [`PredefinedMetricType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predefinedmetricspecification.html#cfn-autoscaling-scalingpolicy-predefinedmetricspecification-predefinedmetrictype). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub instances_distribution: Option<::Value>, - /// Property [`LaunchTemplate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-as-group-mixedinstancespolicy.html#cfn-as-mixedinstancespolicy-launchtemplate). + pub predefined_metric_type: ::Value, + /// Property [`ResourceLabel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predefinedmetricspecification.html#cfn-autoscaling-scalingpolicy-predefinedmetricspecification-resourcelabel). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub launch_template: ::Value, + pub resource_label: Option<::Value>, } - impl ::codec::SerializeValue for MixedInstancesPolicy { + impl ::codec::SerializeValue for PredefinedMetricSpecification { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref instances_distribution) = self.instances_distribution { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstancesDistribution", instances_distribution)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PredefinedMetricType", &self.predefined_metric_type)?; + if let Some(ref resource_label) = self.resource_label { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceLabel", resource_label)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplate", &self.launch_template)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for MixedInstancesPolicy { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for PredefinedMetricSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = MixedInstancesPolicy; + type Value = PredefinedMetricSpecification; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type MixedInstancesPolicy") + write!(f, "a struct of type PredefinedMetricSpecification") } fn visit_map>(self, mut map: A) -> Result { - let mut instances_distribution: Option<::Value> = None; - let mut launch_template: Option<::Value> = None; + let mut predefined_metric_type: Option<::Value> = None; + let mut resource_label: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "InstancesDistribution" => { - instances_distribution = ::serde::de::MapAccess::next_value(&mut map)?; + "PredefinedMetricType" => { + predefined_metric_type = ::serde::de::MapAccess::next_value(&mut map)?; } - "LaunchTemplate" => { - launch_template = ::serde::de::MapAccess::next_value(&mut map)?; + "ResourceLabel" => { + resource_label = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(MixedInstancesPolicy { - instances_distribution: instances_distribution, - launch_template: launch_template.ok_or(::serde::de::Error::missing_field("LaunchTemplate"))?, + Ok(PredefinedMetricSpecification { + predefined_metric_type: predefined_metric_type.ok_or(::serde::de::Error::missing_field("PredefinedMetricType"))?, + resource_label: resource_label, }) } } @@ -1943,62 +3759,101 @@ pub mod auto_scaling_group { } } - /// The [`AWS::AutoScaling::AutoScalingGroup.NotificationConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-notificationconfigurations.html) property type. + /// The [`AWS::AutoScaling::ScalingPolicy.PredictiveScalingConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingconfiguration.html) property type. #[derive(Debug, Default)] - pub struct NotificationConfiguration { - /// Property [`NotificationTypes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-notificationconfigurations.html#cfn-as-group-notificationconfigurations-notificationtypes). + pub struct PredictiveScalingConfiguration { + /// Property [`MaxCapacityBreachBehavior`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingconfiguration.html#cfn-autoscaling-scalingpolicy-predictivescalingconfiguration-maxcapacitybreachbehavior). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub notification_types: Option<::ValueList>, - /// Property [`TopicARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-notificationconfigurations.html#cfn-autoscaling-autoscalinggroup-notificationconfigurations-topicarn). + pub max_capacity_breach_behavior: Option<::Value>, + /// Property [`MaxCapacityBuffer`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingconfiguration.html#cfn-autoscaling-scalingpolicy-predictivescalingconfiguration-maxcapacitybuffer). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub topic_arn: ::Value, + pub max_capacity_buffer: Option<::Value>, + /// Property [`MetricSpecifications`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingconfiguration.html#cfn-autoscaling-scalingpolicy-predictivescalingconfiguration-metricspecifications). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub metric_specifications: ::ValueList, + /// Property [`Mode`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingconfiguration.html#cfn-autoscaling-scalingpolicy-predictivescalingconfiguration-mode). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub mode: Option<::Value>, + /// Property [`SchedulingBufferTime`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingconfiguration.html#cfn-autoscaling-scalingpolicy-predictivescalingconfiguration-schedulingbuffertime). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub scheduling_buffer_time: Option<::Value>, } - impl ::codec::SerializeValue for NotificationConfiguration { + impl ::codec::SerializeValue for PredictiveScalingConfiguration { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref notification_types) = self.notification_types { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NotificationTypes", notification_types)?; + if let Some(ref max_capacity_breach_behavior) = self.max_capacity_breach_behavior { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxCapacityBreachBehavior", max_capacity_breach_behavior)?; + } + if let Some(ref max_capacity_buffer) = self.max_capacity_buffer { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxCapacityBuffer", max_capacity_buffer)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MetricSpecifications", &self.metric_specifications)?; + if let Some(ref mode) = self.mode { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Mode", mode)?; + } + if let Some(ref scheduling_buffer_time) = self.scheduling_buffer_time { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SchedulingBufferTime", scheduling_buffer_time)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TopicARN", &self.topic_arn)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for NotificationConfiguration { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for PredictiveScalingConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = NotificationConfiguration; + type Value = PredictiveScalingConfiguration; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type NotificationConfiguration") + write!(f, "a struct of type PredictiveScalingConfiguration") } fn visit_map>(self, mut map: A) -> Result { - let mut notification_types: Option<::ValueList> = None; - let mut topic_arn: Option<::Value> = None; + let mut max_capacity_breach_behavior: Option<::Value> = None; + let mut max_capacity_buffer: Option<::Value> = None; + let mut metric_specifications: Option<::ValueList> = None; + let mut mode: Option<::Value> = None; + let mut scheduling_buffer_time: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "NotificationTypes" => { - notification_types = ::serde::de::MapAccess::next_value(&mut map)?; + "MaxCapacityBreachBehavior" => { + max_capacity_breach_behavior = ::serde::de::MapAccess::next_value(&mut map)?; } - "TopicARN" => { - topic_arn = ::serde::de::MapAccess::next_value(&mut map)?; + "MaxCapacityBuffer" => { + max_capacity_buffer = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MetricSpecifications" => { + metric_specifications = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Mode" => { + mode = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SchedulingBufferTime" => { + scheduling_buffer_time = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(NotificationConfiguration { - notification_types: notification_types, - topic_arn: topic_arn.ok_or(::serde::de::Error::missing_field("TopicARN"))?, + Ok(PredictiveScalingConfiguration { + max_capacity_breach_behavior: max_capacity_breach_behavior, + max_capacity_buffer: max_capacity_buffer, + metric_specifications: metric_specifications.ok_or(::serde::de::Error::missing_field("MetricSpecifications"))?, + mode: mode, + scheduling_buffer_time: scheduling_buffer_time, }) } } @@ -2007,71 +3862,49 @@ pub mod auto_scaling_group { } } - /// The [`AWS::AutoScaling::AutoScalingGroup.TagProperty`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-tags.html) property type. + /// The [`AWS::AutoScaling::ScalingPolicy.PredictiveScalingCustomizedCapacityMetric`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingcustomizedcapacitymetric.html) property type. #[derive(Debug, Default)] - pub struct TagProperty { - /// Property [`Key`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-tags.html#cfn-as-tags-Key). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub key: ::Value, - /// Property [`PropagateAtLaunch`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-tags.html#cfn-as-tags-PropagateAtLaunch). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub propagate_at_launch: ::Value, - /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-tags.html#cfn-as-tags-Value). + pub struct PredictiveScalingCustomizedCapacityMetric { + /// Property [`MetricDataQueries`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingcustomizedcapacitymetric.html#cfn-autoscaling-scalingpolicy-predictivescalingcustomizedcapacitymetric-metricdataqueries). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub value: ::Value, + pub metric_data_queries: ::ValueList, } - impl ::codec::SerializeValue for TagProperty { + impl ::codec::SerializeValue for PredictiveScalingCustomizedCapacityMetric { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Key", &self.key)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PropagateAtLaunch", &self.propagate_at_launch)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", &self.value)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MetricDataQueries", &self.metric_data_queries)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for TagProperty { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for PredictiveScalingCustomizedCapacityMetric { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = TagProperty; + type Value = PredictiveScalingCustomizedCapacityMetric; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type TagProperty") + write!(f, "a struct of type PredictiveScalingCustomizedCapacityMetric") } fn visit_map>(self, mut map: A) -> Result { - let mut key: Option<::Value> = None; - let mut propagate_at_launch: Option<::Value> = None; - let mut value: Option<::Value> = None; + let mut metric_data_queries: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Key" => { - key = ::serde::de::MapAccess::next_value(&mut map)?; - } - "PropagateAtLaunch" => { - propagate_at_launch = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Value" => { - value = ::serde::de::MapAccess::next_value(&mut map)?; + "MetricDataQueries" => { + metric_data_queries = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(TagProperty { - key: key.ok_or(::serde::de::Error::missing_field("Key"))?, - propagate_at_launch: propagate_at_launch.ok_or(::serde::de::Error::missing_field("PropagateAtLaunch"))?, - value: value.ok_or(::serde::de::Error::missing_field("Value"))?, + Ok(PredictiveScalingCustomizedCapacityMetric { + metric_data_queries: metric_data_queries.ok_or(::serde::de::Error::missing_field("MetricDataQueries"))?, }) } } @@ -2079,224 +3912,101 @@ pub mod auto_scaling_group { d.deserialize_map(Visitor) } } -} - -pub mod launch_configuration { - //! Property types for the `LaunchConfiguration` resource. - /// The [`AWS::AutoScaling::LaunchConfiguration.BlockDevice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig-blockdev-template.html) property type. + /// The [`AWS::AutoScaling::ScalingPolicy.PredictiveScalingCustomizedLoadMetric`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingcustomizedloadmetric.html) property type. #[derive(Debug, Default)] - pub struct BlockDevice { - /// Property [`DeleteOnTermination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig-blockdev-template.html#cfn-as-launchconfig-blockdev-template-deleteonterm). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub delete_on_termination: Option<::Value>, - /// Property [`Encrypted`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig-blockdev-template.html#cfn-as-launchconfig-blockdev-template-encrypted). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub encrypted: Option<::Value>, - /// Property [`Iops`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig-blockdev-template.html#cfn-as-launchconfig-blockdev-template-iops). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub iops: Option<::Value>, - /// Property [`SnapshotId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig-blockdev-template.html#cfn-as-launchconfig-blockdev-template-snapshotid). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub snapshot_id: Option<::Value>, - /// Property [`Throughput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig-blockdev-template.html#cfn-as-launchconfig-blockdev-template-throughput). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub throughput: Option<::Value>, - /// Property [`VolumeSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig-blockdev-template.html#cfn-as-launchconfig-blockdev-template-volumesize). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub volume_size: Option<::Value>, - /// Property [`VolumeType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig-blockdev-template.html#cfn-as-launchconfig-blockdev-template-volumetype). + pub struct PredictiveScalingCustomizedLoadMetric { + /// Property [`MetricDataQueries`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingcustomizedloadmetric.html#cfn-autoscaling-scalingpolicy-predictivescalingcustomizedloadmetric-metricdataqueries). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub volume_type: Option<::Value>, + pub metric_data_queries: ::ValueList, } - impl ::codec::SerializeValue for BlockDevice { + impl ::codec::SerializeValue for PredictiveScalingCustomizedLoadMetric { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref delete_on_termination) = self.delete_on_termination { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeleteOnTermination", delete_on_termination)?; - } - if let Some(ref encrypted) = self.encrypted { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Encrypted", encrypted)?; - } - if let Some(ref iops) = self.iops { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Iops", iops)?; - } - if let Some(ref snapshot_id) = self.snapshot_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SnapshotId", snapshot_id)?; - } - if let Some(ref throughput) = self.throughput { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Throughput", throughput)?; - } - if let Some(ref volume_size) = self.volume_size { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VolumeSize", volume_size)?; - } - if let Some(ref volume_type) = self.volume_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VolumeType", volume_type)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MetricDataQueries", &self.metric_data_queries)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for BlockDevice { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for PredictiveScalingCustomizedLoadMetric { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = BlockDevice; + type Value = PredictiveScalingCustomizedLoadMetric; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type BlockDevice") + write!(f, "a struct of type PredictiveScalingCustomizedLoadMetric") } fn visit_map>(self, mut map: A) -> Result { - let mut delete_on_termination: Option<::Value> = None; - let mut encrypted: Option<::Value> = None; - let mut iops: Option<::Value> = None; - let mut snapshot_id: Option<::Value> = None; - let mut throughput: Option<::Value> = None; - let mut volume_size: Option<::Value> = None; - let mut volume_type: Option<::Value> = None; + let mut metric_data_queries: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "DeleteOnTermination" => { - delete_on_termination = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Encrypted" => { - encrypted = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Iops" => { - iops = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SnapshotId" => { - snapshot_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Throughput" => { - throughput = ::serde::de::MapAccess::next_value(&mut map)?; - } - "VolumeSize" => { - volume_size = ::serde::de::MapAccess::next_value(&mut map)?; - } - "VolumeType" => { - volume_type = ::serde::de::MapAccess::next_value(&mut map)?; + "MetricDataQueries" => { + metric_data_queries = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(BlockDevice { - delete_on_termination: delete_on_termination, - encrypted: encrypted, - iops: iops, - snapshot_id: snapshot_id, - throughput: throughput, - volume_size: volume_size, - volume_type: volume_type, + Ok(PredictiveScalingCustomizedLoadMetric { + metric_data_queries: metric_data_queries.ok_or(::serde::de::Error::missing_field("MetricDataQueries"))?, }) } - } - - d.deserialize_map(Visitor) - } - } - - /// The [`AWS::AutoScaling::LaunchConfiguration.BlockDeviceMapping`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig-blockdev-mapping.html) property type. - #[derive(Debug, Default)] - pub struct BlockDeviceMapping { - /// Property [`DeviceName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig-blockdev-mapping.html#cfn-as-launchconfig-blockdev-mapping-devicename). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub device_name: ::Value, - /// Property [`Ebs`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig-blockdev-mapping.html#cfn-as-launchconfig-blockdev-mapping-ebs). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub ebs: Option<::Value>, - /// Property [`NoDevice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig-blockdev-mapping.html#cfn-as-launchconfig-blockdev-mapping-nodevice). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub no_device: Option<::Value>, - /// Property [`VirtualName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-as-launchconfig-blockdev-mapping.html#cfn-as-launchconfig-blockdev-mapping-virtualname). + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::AutoScaling::ScalingPolicy.PredictiveScalingCustomizedScalingMetric`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingcustomizedscalingmetric.html) property type. + #[derive(Debug, Default)] + pub struct PredictiveScalingCustomizedScalingMetric { + /// Property [`MetricDataQueries`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingcustomizedscalingmetric.html#cfn-autoscaling-scalingpolicy-predictivescalingcustomizedscalingmetric-metricdataqueries). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub virtual_name: Option<::Value>, + pub metric_data_queries: ::ValueList, } - impl ::codec::SerializeValue for BlockDeviceMapping { + impl ::codec::SerializeValue for PredictiveScalingCustomizedScalingMetric { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeviceName", &self.device_name)?; - if let Some(ref ebs) = self.ebs { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ebs", ebs)?; - } - if let Some(ref no_device) = self.no_device { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NoDevice", no_device)?; - } - if let Some(ref virtual_name) = self.virtual_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VirtualName", virtual_name)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MetricDataQueries", &self.metric_data_queries)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for BlockDeviceMapping { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for PredictiveScalingCustomizedScalingMetric { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = BlockDeviceMapping; + type Value = PredictiveScalingCustomizedScalingMetric; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type BlockDeviceMapping") + write!(f, "a struct of type PredictiveScalingCustomizedScalingMetric") } fn visit_map>(self, mut map: A) -> Result { - let mut device_name: Option<::Value> = None; - let mut ebs: Option<::Value> = None; - let mut no_device: Option<::Value> = None; - let mut virtual_name: Option<::Value> = None; + let mut metric_data_queries: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "DeviceName" => { - device_name = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Ebs" => { - ebs = ::serde::de::MapAccess::next_value(&mut map)?; - } - "NoDevice" => { - no_device = ::serde::de::MapAccess::next_value(&mut map)?; - } - "VirtualName" => { - virtual_name = ::serde::de::MapAccess::next_value(&mut map)?; + "MetricDataQueries" => { + metric_data_queries = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(BlockDeviceMapping { - device_name: device_name.ok_or(::serde::de::Error::missing_field("DeviceName"))?, - ebs: ebs, - no_device: no_device, - virtual_name: virtual_name, + Ok(PredictiveScalingCustomizedScalingMetric { + metric_data_queries: metric_data_queries.ok_or(::serde::de::Error::missing_field("MetricDataQueries"))?, }) } } @@ -2305,77 +4015,127 @@ pub mod launch_configuration { } } - /// The [`AWS::AutoScaling::LaunchConfiguration.MetadataOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfig-metadataoptions.html) property type. + /// The [`AWS::AutoScaling::ScalingPolicy.PredictiveScalingMetricSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingmetricspecification.html) property type. #[derive(Debug, Default)] - pub struct MetadataOptions { - /// Property [`HttpEndpoint`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfig-metadataoptions.html#cfn-autoscaling-launchconfig-metadataoptions-httpendpoint). + pub struct PredictiveScalingMetricSpecification { + /// Property [`CustomizedCapacityMetricSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingmetricspecification.html#cfn-autoscaling-scalingpolicy-predictivescalingmetricspecification-customizedcapacitymetricspecification). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub http_endpoint: Option<::Value>, - /// Property [`HttpPutResponseHopLimit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfig-metadataoptions.html#cfn-autoscaling-launchconfig-metadataoptions-httpputresponsehoplimit). + pub customized_capacity_metric_specification: Option<::Value>, + /// Property [`CustomizedLoadMetricSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingmetricspecification.html#cfn-autoscaling-scalingpolicy-predictivescalingmetricspecification-customizedloadmetricspecification). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub http_put_response_hop_limit: Option<::Value>, - /// Property [`HttpTokens`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-launchconfig-metadataoptions.html#cfn-autoscaling-launchconfig-metadataoptions-httptokens). + pub customized_load_metric_specification: Option<::Value>, + /// Property [`CustomizedScalingMetricSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingmetricspecification.html#cfn-autoscaling-scalingpolicy-predictivescalingmetricspecification-customizedscalingmetricspecification). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub http_tokens: Option<::Value>, + pub customized_scaling_metric_specification: Option<::Value>, + /// Property [`PredefinedLoadMetricSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingmetricspecification.html#cfn-autoscaling-scalingpolicy-predictivescalingmetricspecification-predefinedloadmetricspecification). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub predefined_load_metric_specification: Option<::Value>, + /// Property [`PredefinedMetricPairSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingmetricspecification.html#cfn-autoscaling-scalingpolicy-predictivescalingmetricspecification-predefinedmetricpairspecification). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub predefined_metric_pair_specification: Option<::Value>, + /// Property [`PredefinedScalingMetricSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingmetricspecification.html#cfn-autoscaling-scalingpolicy-predictivescalingmetricspecification-predefinedscalingmetricspecification). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub predefined_scaling_metric_specification: Option<::Value>, + /// Property [`TargetValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingmetricspecification.html#cfn-autoscaling-scalingpolicy-predictivescalingmetricspecification-targetvalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub target_value: ::Value, } - impl ::codec::SerializeValue for MetadataOptions { + impl ::codec::SerializeValue for PredictiveScalingMetricSpecification { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref http_endpoint) = self.http_endpoint { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "HttpEndpoint", http_endpoint)?; + if let Some(ref customized_capacity_metric_specification) = self.customized_capacity_metric_specification { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CustomizedCapacityMetricSpecification", customized_capacity_metric_specification)?; } - if let Some(ref http_put_response_hop_limit) = self.http_put_response_hop_limit { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "HttpPutResponseHopLimit", http_put_response_hop_limit)?; + if let Some(ref customized_load_metric_specification) = self.customized_load_metric_specification { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CustomizedLoadMetricSpecification", customized_load_metric_specification)?; } - if let Some(ref http_tokens) = self.http_tokens { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "HttpTokens", http_tokens)?; + if let Some(ref customized_scaling_metric_specification) = self.customized_scaling_metric_specification { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CustomizedScalingMetricSpecification", customized_scaling_metric_specification)?; + } + if let Some(ref predefined_load_metric_specification) = self.predefined_load_metric_specification { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PredefinedLoadMetricSpecification", predefined_load_metric_specification)?; } + if let Some(ref predefined_metric_pair_specification) = self.predefined_metric_pair_specification { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PredefinedMetricPairSpecification", predefined_metric_pair_specification)?; + } + if let Some(ref predefined_scaling_metric_specification) = self.predefined_scaling_metric_specification { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PredefinedScalingMetricSpecification", predefined_scaling_metric_specification)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetValue", &self.target_value)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for MetadataOptions { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for PredictiveScalingMetricSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = MetadataOptions; + type Value = PredictiveScalingMetricSpecification; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type MetadataOptions") + write!(f, "a struct of type PredictiveScalingMetricSpecification") } fn visit_map>(self, mut map: A) -> Result { - let mut http_endpoint: Option<::Value> = None; - let mut http_put_response_hop_limit: Option<::Value> = None; - let mut http_tokens: Option<::Value> = None; + let mut customized_capacity_metric_specification: Option<::Value> = None; + let mut customized_load_metric_specification: Option<::Value> = None; + let mut customized_scaling_metric_specification: Option<::Value> = None; + let mut predefined_load_metric_specification: Option<::Value> = None; + let mut predefined_metric_pair_specification: Option<::Value> = None; + let mut predefined_scaling_metric_specification: Option<::Value> = None; + let mut target_value: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "HttpEndpoint" => { - http_endpoint = ::serde::de::MapAccess::next_value(&mut map)?; + "CustomizedCapacityMetricSpecification" => { + customized_capacity_metric_specification = ::serde::de::MapAccess::next_value(&mut map)?; } - "HttpPutResponseHopLimit" => { - http_put_response_hop_limit = ::serde::de::MapAccess::next_value(&mut map)?; + "CustomizedLoadMetricSpecification" => { + customized_load_metric_specification = ::serde::de::MapAccess::next_value(&mut map)?; } - "HttpTokens" => { - http_tokens = ::serde::de::MapAccess::next_value(&mut map)?; + "CustomizedScalingMetricSpecification" => { + customized_scaling_metric_specification = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PredefinedLoadMetricSpecification" => { + predefined_load_metric_specification = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PredefinedMetricPairSpecification" => { + predefined_metric_pair_specification = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PredefinedScalingMetricSpecification" => { + predefined_scaling_metric_specification = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TargetValue" => { + target_value = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(MetadataOptions { - http_endpoint: http_endpoint, - http_put_response_hop_limit: http_put_response_hop_limit, - http_tokens: http_tokens, + Ok(PredictiveScalingMetricSpecification { + customized_capacity_metric_specification: customized_capacity_metric_specification, + customized_load_metric_specification: customized_load_metric_specification, + customized_scaling_metric_specification: customized_scaling_metric_specification, + predefined_load_metric_specification: predefined_load_metric_specification, + predefined_metric_pair_specification: predefined_metric_pair_specification, + predefined_scaling_metric_specification: predefined_scaling_metric_specification, + target_value: target_value.ok_or(::serde::de::Error::missing_field("TargetValue"))?, }) } } @@ -2383,102 +4143,63 @@ pub mod launch_configuration { d.deserialize_map(Visitor) } } -} - -pub mod scaling_policy { - //! Property types for the `ScalingPolicy` resource. - /// The [`AWS::AutoScaling::ScalingPolicy.CustomizedMetricSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-customizedmetricspecification.html) property type. + /// The [`AWS::AutoScaling::ScalingPolicy.PredictiveScalingPredefinedLoadMetric`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingpredefinedloadmetric.html) property type. #[derive(Debug, Default)] - pub struct CustomizedMetricSpecification { - /// Property [`Dimensions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-customizedmetricspecification.html#cfn-autoscaling-scalingpolicy-customizedmetricspecification-dimensions). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub dimensions: Option<::ValueList>, - /// Property [`MetricName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-customizedmetricspecification.html#cfn-autoscaling-scalingpolicy-customizedmetricspecification-metricname). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub metric_name: ::Value, - /// Property [`Namespace`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-customizedmetricspecification.html#cfn-autoscaling-scalingpolicy-customizedmetricspecification-namespace). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub namespace: ::Value, - /// Property [`Statistic`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-customizedmetricspecification.html#cfn-autoscaling-scalingpolicy-customizedmetricspecification-statistic). + pub struct PredictiveScalingPredefinedLoadMetric { + /// Property [`PredefinedMetricType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingpredefinedloadmetric.html#cfn-autoscaling-scalingpolicy-predictivescalingpredefinedloadmetric-predefinedmetrictype). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub statistic: ::Value, - /// Property [`Unit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-customizedmetricspecification.html#cfn-autoscaling-scalingpolicy-customizedmetricspecification-unit). + pub predefined_metric_type: ::Value, + /// Property [`ResourceLabel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingpredefinedloadmetric.html#cfn-autoscaling-scalingpolicy-predictivescalingpredefinedloadmetric-resourcelabel). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub unit: Option<::Value>, + pub resource_label: Option<::Value>, } - impl ::codec::SerializeValue for CustomizedMetricSpecification { + impl ::codec::SerializeValue for PredictiveScalingPredefinedLoadMetric { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref dimensions) = self.dimensions { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Dimensions", dimensions)?; - } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "MetricName", &self.metric_name)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Namespace", &self.namespace)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Statistic", &self.statistic)?; - if let Some(ref unit) = self.unit { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Unit", unit)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PredefinedMetricType", &self.predefined_metric_type)?; + if let Some(ref resource_label) = self.resource_label { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceLabel", resource_label)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for CustomizedMetricSpecification { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for PredictiveScalingPredefinedLoadMetric { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = CustomizedMetricSpecification; + type Value = PredictiveScalingPredefinedLoadMetric; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type CustomizedMetricSpecification") + write!(f, "a struct of type PredictiveScalingPredefinedLoadMetric") } fn visit_map>(self, mut map: A) -> Result { - let mut dimensions: Option<::ValueList> = None; - let mut metric_name: Option<::Value> = None; - let mut namespace: Option<::Value> = None; - let mut statistic: Option<::Value> = None; - let mut unit: Option<::Value> = None; + let mut predefined_metric_type: Option<::Value> = None; + let mut resource_label: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Dimensions" => { - dimensions = ::serde::de::MapAccess::next_value(&mut map)?; - } - "MetricName" => { - metric_name = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Namespace" => { - namespace = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Statistic" => { - statistic = ::serde::de::MapAccess::next_value(&mut map)?; + "PredefinedMetricType" => { + predefined_metric_type = ::serde::de::MapAccess::next_value(&mut map)?; } - "Unit" => { - unit = ::serde::de::MapAccess::next_value(&mut map)?; + "ResourceLabel" => { + resource_label = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(CustomizedMetricSpecification { - dimensions: dimensions, - metric_name: metric_name.ok_or(::serde::de::Error::missing_field("MetricName"))?, - namespace: namespace.ok_or(::serde::de::Error::missing_field("Namespace"))?, - statistic: statistic.ok_or(::serde::de::Error::missing_field("Statistic"))?, - unit: unit, + Ok(PredictiveScalingPredefinedLoadMetric { + predefined_metric_type: predefined_metric_type.ok_or(::serde::de::Error::missing_field("PredefinedMetricType"))?, + resource_label: resource_label, }) } } @@ -2487,60 +4208,62 @@ pub mod scaling_policy { } } - /// The [`AWS::AutoScaling::ScalingPolicy.MetricDimension`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricdimension.html) property type. + /// The [`AWS::AutoScaling::ScalingPolicy.PredictiveScalingPredefinedMetricPair`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingpredefinedmetricpair.html) property type. #[derive(Debug, Default)] - pub struct MetricDimension { - /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricdimension.html#cfn-autoscaling-scalingpolicy-metricdimension-name). + pub struct PredictiveScalingPredefinedMetricPair { + /// Property [`PredefinedMetricType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingpredefinedmetricpair.html#cfn-autoscaling-scalingpolicy-predictivescalingpredefinedmetricpair-predefinedmetrictype). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub name: ::Value, - /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-metricdimension.html#cfn-autoscaling-scalingpolicy-metricdimension-value). + pub predefined_metric_type: ::Value, + /// Property [`ResourceLabel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingpredefinedmetricpair.html#cfn-autoscaling-scalingpolicy-predictivescalingpredefinedmetricpair-resourcelabel). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub value: ::Value, + pub resource_label: Option<::Value>, } - impl ::codec::SerializeValue for MetricDimension { + impl ::codec::SerializeValue for PredictiveScalingPredefinedMetricPair { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", &self.value)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PredefinedMetricType", &self.predefined_metric_type)?; + if let Some(ref resource_label) = self.resource_label { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceLabel", resource_label)?; + } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for MetricDimension { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for PredictiveScalingPredefinedMetricPair { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = MetricDimension; + type Value = PredictiveScalingPredefinedMetricPair; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type MetricDimension") + write!(f, "a struct of type PredictiveScalingPredefinedMetricPair") } fn visit_map>(self, mut map: A) -> Result { - let mut name: Option<::Value> = None; - let mut value: Option<::Value> = None; + let mut predefined_metric_type: Option<::Value> = None; + let mut resource_label: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Name" => { - name = ::serde::de::MapAccess::next_value(&mut map)?; + "PredefinedMetricType" => { + predefined_metric_type = ::serde::de::MapAccess::next_value(&mut map)?; } - "Value" => { - value = ::serde::de::MapAccess::next_value(&mut map)?; + "ResourceLabel" => { + resource_label = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(MetricDimension { - name: name.ok_or(::serde::de::Error::missing_field("Name"))?, - value: value.ok_or(::serde::de::Error::missing_field("Value"))?, + Ok(PredictiveScalingPredefinedMetricPair { + predefined_metric_type: predefined_metric_type.ok_or(::serde::de::Error::missing_field("PredefinedMetricType"))?, + resource_label: resource_label, }) } } @@ -2549,22 +4272,22 @@ pub mod scaling_policy { } } - /// The [`AWS::AutoScaling::ScalingPolicy.PredefinedMetricSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predefinedmetricspecification.html) property type. + /// The [`AWS::AutoScaling::ScalingPolicy.PredictiveScalingPredefinedScalingMetric`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingpredefinedscalingmetric.html) property type. #[derive(Debug, Default)] - pub struct PredefinedMetricSpecification { - /// Property [`PredefinedMetricType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predefinedmetricspecification.html#cfn-autoscaling-scalingpolicy-predefinedmetricspecification-predefinedmetrictype). + pub struct PredictiveScalingPredefinedScalingMetric { + /// Property [`PredefinedMetricType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingpredefinedscalingmetric.html#cfn-autoscaling-scalingpolicy-predictivescalingpredefinedscalingmetric-predefinedmetrictype). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub predefined_metric_type: ::Value, - /// Property [`ResourceLabel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predefinedmetricspecification.html#cfn-autoscaling-scalingpolicy-predefinedmetricspecification-resourcelabel). + /// Property [`ResourceLabel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-scalingpolicy-predictivescalingpredefinedscalingmetric.html#cfn-autoscaling-scalingpolicy-predictivescalingpredefinedscalingmetric-resourcelabel). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub resource_label: Option<::Value>, } - impl ::codec::SerializeValue for PredefinedMetricSpecification { + impl ::codec::SerializeValue for PredictiveScalingPredefinedScalingMetric { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "PredefinedMetricType", &self.predefined_metric_type)?; @@ -2575,15 +4298,15 @@ pub mod scaling_policy { } } - impl ::codec::DeserializeValue for PredefinedMetricSpecification { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for PredictiveScalingPredefinedScalingMetric { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = PredefinedMetricSpecification; + type Value = PredictiveScalingPredefinedScalingMetric; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type PredefinedMetricSpecification") + write!(f, "a struct of type PredictiveScalingPredefinedScalingMetric") } fn visit_map>(self, mut map: A) -> Result { @@ -2602,7 +4325,7 @@ pub mod scaling_policy { } } - Ok(PredefinedMetricSpecification { + Ok(PredictiveScalingPredefinedScalingMetric { predefined_metric_type: predefined_metric_type.ok_or(::serde::de::Error::missing_field("PredefinedMetricType"))?, resource_label: resource_label, }) @@ -2780,3 +4503,60 @@ pub mod scaling_policy { } } } + +pub mod warm_pool { + //! Property types for the `WarmPool` resource. + + /// The [`AWS::AutoScaling::WarmPool.InstanceReusePolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-warmpool-instancereusepolicy.html) property type. + #[derive(Debug, Default)] + pub struct InstanceReusePolicy { + /// Property [`ReuseOnScaleIn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-autoscaling-warmpool-instancereusepolicy.html#cfn-autoscaling-warmpool-instancereusepolicy-reuseonscalein). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub reuse_on_scale_in: Option<::Value>, + } + + impl ::codec::SerializeValue for InstanceReusePolicy { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref reuse_on_scale_in) = self.reuse_on_scale_in { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReuseOnScaleIn", reuse_on_scale_in)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for InstanceReusePolicy { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = InstanceReusePolicy; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type InstanceReusePolicy") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut reuse_on_scale_in: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ReuseOnScaleIn" => { + reuse_on_scale_in = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(InstanceReusePolicy { + reuse_on_scale_in: reuse_on_scale_in, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} diff --git a/src/aws/backup.rs b/src/aws/backup.rs index d3ac8a7..2eda579 100644 --- a/src/aws/backup.rs +++ b/src/aws/backup.rs @@ -205,6 +205,11 @@ pub struct BackupVaultProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub encryption_key_arn: Option<::Value>, + /// Property [`LockConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-backupvault.html#cfn-backup-backupvault-lockconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub lock_configuration: Option<::Value>, /// Property [`Notifications`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-backupvault.html#cfn-backup-backupvault-notifications). /// /// Update type: _Mutable_. @@ -225,6 +230,9 @@ impl ::serde::Serialize for BackupVaultProperties { if let Some(ref encryption_key_arn) = self.encryption_key_arn { ::serde::ser::SerializeMap::serialize_entry(&mut map, "EncryptionKeyArn", encryption_key_arn)?; } + if let Some(ref lock_configuration) = self.lock_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LockConfiguration", lock_configuration)?; + } if let Some(ref notifications) = self.notifications { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Notifications", notifications)?; } @@ -248,6 +256,7 @@ impl<'de> ::serde::Deserialize<'de> for BackupVaultProperties { let mut backup_vault_name: Option<::Value> = None; let mut backup_vault_tags: Option<::ValueMap> = None; let mut encryption_key_arn: Option<::Value> = None; + let mut lock_configuration: Option<::Value> = None; let mut notifications: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { @@ -264,6 +273,9 @@ impl<'de> ::serde::Deserialize<'de> for BackupVaultProperties { "EncryptionKeyArn" => { encryption_key_arn = ::serde::de::MapAccess::next_value(&mut map)?; } + "LockConfiguration" => { + lock_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } "Notifications" => { notifications = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -276,6 +288,7 @@ impl<'de> ::serde::Deserialize<'de> for BackupVaultProperties { backup_vault_name: backup_vault_name.ok_or(::serde::de::Error::missing_field("BackupVaultName"))?, backup_vault_tags: backup_vault_tags, encryption_key_arn: encryption_key_arn, + lock_configuration: lock_configuration, notifications: notifications, }) } @@ -304,6 +317,247 @@ impl From for BackupVault { } } +/// The [`AWS::Backup::Framework`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-framework.html) resource type. +#[derive(Debug, Default)] +pub struct Framework { + properties: FrameworkProperties +} + +/// Properties for the `Framework` resource. +#[derive(Debug, Default)] +pub struct FrameworkProperties { + /// Property [`FrameworkControls`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-framework.html#cfn-backup-framework-frameworkcontrols). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub framework_controls: ::ValueList, + /// Property [`FrameworkDescription`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-framework.html#cfn-backup-framework-frameworkdescription). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub framework_description: Option<::Value>, + /// Property [`FrameworkName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-framework.html#cfn-backup-framework-frameworkname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub framework_name: Option<::Value>, + /// Property [`FrameworkTags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-framework.html#cfn-backup-framework-frameworktags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub framework_tags: Option<::ValueList<::Tag>>, +} + +impl ::serde::Serialize for FrameworkProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FrameworkControls", &self.framework_controls)?; + if let Some(ref framework_description) = self.framework_description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FrameworkDescription", framework_description)?; + } + if let Some(ref framework_name) = self.framework_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FrameworkName", framework_name)?; + } + if let Some(ref framework_tags) = self.framework_tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FrameworkTags", framework_tags)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for FrameworkProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = FrameworkProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type FrameworkProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut framework_controls: Option<::ValueList> = None; + let mut framework_description: Option<::Value> = None; + let mut framework_name: Option<::Value> = None; + let mut framework_tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "FrameworkControls" => { + framework_controls = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FrameworkDescription" => { + framework_description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FrameworkName" => { + framework_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FrameworkTags" => { + framework_tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(FrameworkProperties { + framework_controls: framework_controls.ok_or(::serde::de::Error::missing_field("FrameworkControls"))?, + framework_description: framework_description, + framework_name: framework_name, + framework_tags: framework_tags, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for Framework { + type Properties = FrameworkProperties; + const TYPE: &'static str = "AWS::Backup::Framework"; + fn properties(&self) -> &FrameworkProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut FrameworkProperties { + &mut self.properties + } +} + +impl ::private::Sealed for Framework {} + +impl From for Framework { + fn from(properties: FrameworkProperties) -> Framework { + Framework { properties } + } +} + +/// The [`AWS::Backup::ReportPlan`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-reportplan.html) resource type. +#[derive(Debug, Default)] +pub struct ReportPlan { + properties: ReportPlanProperties +} + +/// Properties for the `ReportPlan` resource. +#[derive(Debug, Default)] +pub struct ReportPlanProperties { + /// Property [`ReportDeliveryChannel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-reportplan.html#cfn-backup-reportplan-reportdeliverychannel). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub report_delivery_channel: ::Value<::json::Value>, + /// Property [`ReportPlanDescription`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-reportplan.html#cfn-backup-reportplan-reportplandescription). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub report_plan_description: Option<::Value>, + /// Property [`ReportPlanName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-reportplan.html#cfn-backup-reportplan-reportplanname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub report_plan_name: Option<::Value>, + /// Property [`ReportPlanTags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-reportplan.html#cfn-backup-reportplan-reportplantags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub report_plan_tags: Option<::ValueList<::Tag>>, + /// Property [`ReportSetting`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-backup-reportplan.html#cfn-backup-reportplan-reportsetting). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub report_setting: ::Value<::json::Value>, +} + +impl ::serde::Serialize for ReportPlanProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReportDeliveryChannel", &self.report_delivery_channel)?; + if let Some(ref report_plan_description) = self.report_plan_description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReportPlanDescription", report_plan_description)?; + } + if let Some(ref report_plan_name) = self.report_plan_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReportPlanName", report_plan_name)?; + } + if let Some(ref report_plan_tags) = self.report_plan_tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReportPlanTags", report_plan_tags)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReportSetting", &self.report_setting)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for ReportPlanProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ReportPlanProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ReportPlanProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut report_delivery_channel: Option<::Value<::json::Value>> = None; + let mut report_plan_description: Option<::Value> = None; + let mut report_plan_name: Option<::Value> = None; + let mut report_plan_tags: Option<::ValueList<::Tag>> = None; + let mut report_setting: Option<::Value<::json::Value>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ReportDeliveryChannel" => { + report_delivery_channel = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ReportPlanDescription" => { + report_plan_description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ReportPlanName" => { + report_plan_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ReportPlanTags" => { + report_plan_tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ReportSetting" => { + report_setting = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ReportPlanProperties { + report_delivery_channel: report_delivery_channel.ok_or(::serde::de::Error::missing_field("ReportDeliveryChannel"))?, + report_plan_description: report_plan_description, + report_plan_name: report_plan_name, + report_plan_tags: report_plan_tags, + report_setting: report_setting.ok_or(::serde::de::Error::missing_field("ReportSetting"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for ReportPlan { + type Properties = ReportPlanProperties; + const TYPE: &'static str = "AWS::Backup::ReportPlan"; + fn properties(&self) -> &ReportPlanProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut ReportPlanProperties { + &mut self.properties + } +} + +impl ::private::Sealed for ReportPlan {} + +impl From for ReportPlan { + fn from(properties: ReportPlanProperties) -> ReportPlan { + ReportPlan { properties } + } +} + pub mod backup_plan { //! Property types for the `BackupPlan` resource. @@ -734,6 +988,11 @@ pub mod backup_selection { /// The [`AWS::Backup::BackupSelection.BackupSelectionResourceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-backupselectionresourcetype.html) property type. #[derive(Debug, Default)] pub struct BackupSelectionResourceType { + /// Property [`Conditions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-backupselectionresourcetype.html#cfn-backup-backupselection-backupselectionresourcetype-conditions). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub conditions: Option<::Value<::json::Value>>, /// Property [`IamRoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-backupselectionresourcetype.html#cfn-backup-backupselection-backupselectionresourcetype-iamrolearn). /// /// Update type: _Immutable_. @@ -744,6 +1003,11 @@ pub mod backup_selection { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub list_of_tags: Option<::ValueList>, + /// Property [`NotResources`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-backupselectionresourcetype.html#cfn-backup-backupselection-backupselectionresourcetype-notresources). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub not_resources: Option<::ValueList>, /// Property [`Resources`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupselection-backupselectionresourcetype.html#cfn-backup-backupselection-backupselectionresourcetype-resources). /// /// Update type: _Immutable_. @@ -759,10 +1023,16 @@ pub mod backup_selection { impl ::codec::SerializeValue for BackupSelectionResourceType { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref conditions) = self.conditions { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Conditions", conditions)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "IamRoleArn", &self.iam_role_arn)?; if let Some(ref list_of_tags) = self.list_of_tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ListOfTags", list_of_tags)?; } + if let Some(ref not_resources) = self.not_resources { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NotResources", not_resources)?; + } if let Some(ref resources) = self.resources { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Resources", resources)?; } @@ -783,19 +1053,27 @@ pub mod backup_selection { } fn visit_map>(self, mut map: A) -> Result { + let mut conditions: Option<::Value<::json::Value>> = None; let mut iam_role_arn: Option<::Value> = None; let mut list_of_tags: Option<::ValueList> = None; + let mut not_resources: Option<::ValueList> = None; let mut resources: Option<::ValueList> = None; let mut selection_name: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "Conditions" => { + conditions = ::serde::de::MapAccess::next_value(&mut map)?; + } "IamRoleArn" => { iam_role_arn = ::serde::de::MapAccess::next_value(&mut map)?; } "ListOfTags" => { list_of_tags = ::serde::de::MapAccess::next_value(&mut map)?; } + "NotResources" => { + not_resources = ::serde::de::MapAccess::next_value(&mut map)?; + } "Resources" => { resources = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -807,8 +1085,10 @@ pub mod backup_selection { } Ok(BackupSelectionResourceType { + conditions: conditions, iam_role_arn: iam_role_arn.ok_or(::serde::de::Error::missing_field("IamRoleArn"))?, list_of_tags: list_of_tags, + not_resources: not_resources, resources: resources, selection_name: selection_name.ok_or(::serde::de::Error::missing_field("SelectionName"))?, }) @@ -896,6 +1176,83 @@ pub mod backup_selection { pub mod backup_vault { //! Property types for the `BackupVault` resource. + /// The [`AWS::Backup::BackupVault.LockConfigurationType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupvault-lockconfigurationtype.html) property type. + #[derive(Debug, Default)] + pub struct LockConfigurationType { + /// Property [`ChangeableForDays`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupvault-lockconfigurationtype.html#cfn-backup-backupvault-lockconfigurationtype-changeablefordays). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub changeable_for_days: Option<::Value>, + /// Property [`MaxRetentionDays`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupvault-lockconfigurationtype.html#cfn-backup-backupvault-lockconfigurationtype-maxretentiondays). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub max_retention_days: Option<::Value>, + /// Property [`MinRetentionDays`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupvault-lockconfigurationtype.html#cfn-backup-backupvault-lockconfigurationtype-minretentiondays). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub min_retention_days: ::Value, + } + + impl ::codec::SerializeValue for LockConfigurationType { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref changeable_for_days) = self.changeable_for_days { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ChangeableForDays", changeable_for_days)?; + } + if let Some(ref max_retention_days) = self.max_retention_days { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxRetentionDays", max_retention_days)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MinRetentionDays", &self.min_retention_days)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for LockConfigurationType { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = LockConfigurationType; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type LockConfigurationType") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut changeable_for_days: Option<::Value> = None; + let mut max_retention_days: Option<::Value> = None; + let mut min_retention_days: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ChangeableForDays" => { + changeable_for_days = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MaxRetentionDays" => { + max_retention_days = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MinRetentionDays" => { + min_retention_days = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(LockConfigurationType { + changeable_for_days: changeable_for_days, + max_retention_days: max_retention_days, + min_retention_days: min_retention_days.ok_or(::serde::de::Error::missing_field("MinRetentionDays"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::Backup::BackupVault.NotificationObjectType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-backupvault-notificationobjecttype.html) property type. #[derive(Debug, Default)] pub struct NotificationObjectType { @@ -958,3 +1315,146 @@ pub mod backup_vault { } } } + +pub mod framework { + //! Property types for the `Framework` resource. + + /// The [`AWS::Backup::Framework.ControlInputParameter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-framework-controlinputparameter.html) property type. + #[derive(Debug, Default)] + pub struct ControlInputParameter { + /// Property [`ParameterName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-framework-controlinputparameter.html#cfn-backup-framework-controlinputparameter-parametername). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub parameter_name: ::Value, + /// Property [`ParameterValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-framework-controlinputparameter.html#cfn-backup-framework-controlinputparameter-parametervalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub parameter_value: ::Value, + } + + impl ::codec::SerializeValue for ControlInputParameter { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ParameterName", &self.parameter_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ParameterValue", &self.parameter_value)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ControlInputParameter { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ControlInputParameter; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ControlInputParameter") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut parameter_name: Option<::Value> = None; + let mut parameter_value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ParameterName" => { + parameter_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ParameterValue" => { + parameter_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ControlInputParameter { + parameter_name: parameter_name.ok_or(::serde::de::Error::missing_field("ParameterName"))?, + parameter_value: parameter_value.ok_or(::serde::de::Error::missing_field("ParameterValue"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Backup::Framework.FrameworkControl`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-framework-frameworkcontrol.html) property type. + #[derive(Debug, Default)] + pub struct FrameworkControl { + /// Property [`ControlInputParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-framework-frameworkcontrol.html#cfn-backup-framework-frameworkcontrol-controlinputparameters). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub control_input_parameters: Option<::ValueList>, + /// Property [`ControlName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-framework-frameworkcontrol.html#cfn-backup-framework-frameworkcontrol-controlname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub control_name: ::Value, + /// Property [`ControlScope`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-backup-framework-frameworkcontrol.html#cfn-backup-framework-frameworkcontrol-controlscope). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub control_scope: Option<::Value<::json::Value>>, + } + + impl ::codec::SerializeValue for FrameworkControl { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref control_input_parameters) = self.control_input_parameters { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ControlInputParameters", control_input_parameters)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ControlName", &self.control_name)?; + if let Some(ref control_scope) = self.control_scope { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ControlScope", control_scope)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for FrameworkControl { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = FrameworkControl; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type FrameworkControl") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut control_input_parameters: Option<::ValueList> = None; + let mut control_name: Option<::Value> = None; + let mut control_scope: Option<::Value<::json::Value>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ControlInputParameters" => { + control_input_parameters = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ControlName" => { + control_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ControlScope" => { + control_scope = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(FrameworkControl { + control_input_parameters: control_input_parameters, + control_name: control_name.ok_or(::serde::de::Error::missing_field("ControlName"))?, + control_scope: control_scope, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} diff --git a/src/aws/batch.rs b/src/aws/batch.rs index f19ed85..4a29dd0 100644 --- a/src/aws/batch.rs +++ b/src/aws/batch.rs @@ -19,6 +19,11 @@ pub struct ComputeEnvironmentProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub compute_resources: Option<::Value>, + /// Property [`ReplaceComputeEnvironment`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-computeenvironment.html#cfn-batch-computeenvironment-replacecomputeenvironment). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub replace_compute_environment: Option<::Value>, /// Property [`ServiceRole`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-computeenvironment.html#cfn-batch-computeenvironment-servicerole). /// /// Update type: _Mutable_. @@ -33,12 +38,22 @@ pub struct ComputeEnvironmentProperties { /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub tags: Option<::Value<::json::Value>>, + pub tags: Option<::ValueMap>, /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-computeenvironment.html#cfn-batch-computeenvironment-type). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub r#type: ::Value, + /// Property [`UnmanagedvCpus`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-computeenvironment.html#cfn-batch-computeenvironment-unmanagedvcpus). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub unmanagedv_cpus: Option<::Value>, + /// Property [`UpdatePolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-computeenvironment.html#cfn-batch-computeenvironment-updatepolicy). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub update_policy: Option<::Value>, } impl ::serde::Serialize for ComputeEnvironmentProperties { @@ -50,6 +65,9 @@ impl ::serde::Serialize for ComputeEnvironmentProperties { if let Some(ref compute_resources) = self.compute_resources { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ComputeResources", compute_resources)?; } + if let Some(ref replace_compute_environment) = self.replace_compute_environment { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReplaceComputeEnvironment", replace_compute_environment)?; + } if let Some(ref service_role) = self.service_role { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServiceRole", service_role)?; } @@ -60,6 +78,12 @@ impl ::serde::Serialize for ComputeEnvironmentProperties { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?; + if let Some(ref unmanagedv_cpus) = self.unmanagedv_cpus { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UnmanagedvCpus", unmanagedv_cpus)?; + } + if let Some(ref update_policy) = self.update_policy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UpdatePolicy", update_policy)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -78,10 +102,13 @@ impl<'de> ::serde::Deserialize<'de> for ComputeEnvironmentProperties { fn visit_map>(self, mut map: A) -> Result { let mut compute_environment_name: Option<::Value> = None; let mut compute_resources: Option<::Value> = None; + let mut replace_compute_environment: Option<::Value> = None; let mut service_role: Option<::Value> = None; let mut state: Option<::Value> = None; - let mut tags: Option<::Value<::json::Value>> = None; + let mut tags: Option<::ValueMap> = None; let mut r#type: Option<::Value> = None; + let mut unmanagedv_cpus: Option<::Value> = None; + let mut update_policy: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { @@ -91,6 +118,9 @@ impl<'de> ::serde::Deserialize<'de> for ComputeEnvironmentProperties { "ComputeResources" => { compute_resources = ::serde::de::MapAccess::next_value(&mut map)?; } + "ReplaceComputeEnvironment" => { + replace_compute_environment = ::serde::de::MapAccess::next_value(&mut map)?; + } "ServiceRole" => { service_role = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -103,6 +133,12 @@ impl<'de> ::serde::Deserialize<'de> for ComputeEnvironmentProperties { "Type" => { r#type = ::serde::de::MapAccess::next_value(&mut map)?; } + "UnmanagedvCpus" => { + unmanagedv_cpus = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UpdatePolicy" => { + update_policy = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } @@ -110,10 +146,13 @@ impl<'de> ::serde::Deserialize<'de> for ComputeEnvironmentProperties { Ok(ComputeEnvironmentProperties { compute_environment_name: compute_environment_name, compute_resources: compute_resources, + replace_compute_environment: replace_compute_environment, service_role: service_role, state: state, tags: tags, r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?, + unmanagedv_cpus: unmanagedv_cpus, + update_policy: update_policy, }) } } @@ -185,6 +224,11 @@ pub struct JobDefinitionProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub retry_strategy: Option<::Value>, + /// Property [`SchedulingPriority`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobdefinition.html#cfn-batch-jobdefinition-schedulingpriority). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub scheduling_priority: Option<::Value>, /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobdefinition.html#cfn-batch-jobdefinition-tags). /// /// Update type: _Immutable_. @@ -226,6 +270,9 @@ impl ::serde::Serialize for JobDefinitionProperties { if let Some(ref retry_strategy) = self.retry_strategy { ::serde::ser::SerializeMap::serialize_entry(&mut map, "RetryStrategy", retry_strategy)?; } + if let Some(ref scheduling_priority) = self.scheduling_priority { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SchedulingPriority", scheduling_priority)?; + } if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } @@ -256,6 +303,7 @@ impl<'de> ::serde::Deserialize<'de> for JobDefinitionProperties { let mut platform_capabilities: Option<::ValueList> = None; let mut propagate_tags: Option<::Value> = None; let mut retry_strategy: Option<::Value> = None; + let mut scheduling_priority: Option<::Value> = None; let mut tags: Option<::Value<::json::Value>> = None; let mut timeout: Option<::Value> = None; let mut r#type: Option<::Value> = None; @@ -283,6 +331,9 @@ impl<'de> ::serde::Deserialize<'de> for JobDefinitionProperties { "RetryStrategy" => { retry_strategy = ::serde::de::MapAccess::next_value(&mut map)?; } + "SchedulingPriority" => { + scheduling_priority = ::serde::de::MapAccess::next_value(&mut map)?; + } "Tags" => { tags = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -304,6 +355,7 @@ impl<'de> ::serde::Deserialize<'de> for JobDefinitionProperties { platform_capabilities: platform_capabilities, propagate_tags: propagate_tags, retry_strategy: retry_strategy, + scheduling_priority: scheduling_priority, tags: tags, timeout: timeout, r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?, @@ -358,6 +410,11 @@ pub struct JobQueueProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub priority: ::Value, + /// Property [`SchedulingPolicyArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobqueue.html#cfn-batch-jobqueue-schedulingpolicyarn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub scheduling_policy_arn: Option<::Value>, /// Property [`State`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobqueue.html#cfn-batch-jobqueue-state). /// /// Update type: _Mutable_. @@ -367,7 +424,7 @@ pub struct JobQueueProperties { /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub tags: Option<::Value<::json::Value>>, + pub tags: Option<::ValueMap>, } impl ::serde::Serialize for JobQueueProperties { @@ -378,6 +435,9 @@ impl ::serde::Serialize for JobQueueProperties { ::serde::ser::SerializeMap::serialize_entry(&mut map, "JobQueueName", job_queue_name)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "Priority", &self.priority)?; + if let Some(ref scheduling_policy_arn) = self.scheduling_policy_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SchedulingPolicyArn", scheduling_policy_arn)?; + } if let Some(ref state) = self.state { ::serde::ser::SerializeMap::serialize_entry(&mut map, "State", state)?; } @@ -403,8 +463,9 @@ impl<'de> ::serde::Deserialize<'de> for JobQueueProperties { let mut compute_environment_order: Option<::ValueList> = None; let mut job_queue_name: Option<::Value> = None; let mut priority: Option<::Value> = None; + let mut scheduling_policy_arn: Option<::Value> = None; let mut state: Option<::Value> = None; - let mut tags: Option<::Value<::json::Value>> = None; + let mut tags: Option<::ValueMap> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { @@ -417,6 +478,9 @@ impl<'de> ::serde::Deserialize<'de> for JobQueueProperties { "Priority" => { priority = ::serde::de::MapAccess::next_value(&mut map)?; } + "SchedulingPolicyArn" => { + scheduling_policy_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } "State" => { state = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -431,6 +495,7 @@ impl<'de> ::serde::Deserialize<'de> for JobQueueProperties { compute_environment_order: compute_environment_order.ok_or(::serde::de::Error::missing_field("ComputeEnvironmentOrder"))?, job_queue_name: job_queue_name, priority: priority.ok_or(::serde::de::Error::missing_field("Priority"))?, + scheduling_policy_arn: scheduling_policy_arn, state: state, tags: tags, }) @@ -460,6 +525,110 @@ impl From for JobQueue { } } +/// The [`AWS::Batch::SchedulingPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-schedulingpolicy.html) resource type. +#[derive(Debug, Default)] +pub struct SchedulingPolicy { + properties: SchedulingPolicyProperties +} + +/// Properties for the `SchedulingPolicy` resource. +#[derive(Debug, Default)] +pub struct SchedulingPolicyProperties { + /// Property [`FairsharePolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-schedulingpolicy.html#cfn-batch-schedulingpolicy-fairsharepolicy). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub fairshare_policy: Option<::Value>, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-schedulingpolicy.html#cfn-batch-schedulingpolicy-name). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub name: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-schedulingpolicy.html#cfn-batch-schedulingpolicy-tags). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub tags: Option<::ValueMap>, +} + +impl ::serde::Serialize for SchedulingPolicyProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref fairshare_policy) = self.fairshare_policy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FairsharePolicy", fairshare_policy)?; + } + if let Some(ref name) = self.name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for SchedulingPolicyProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = SchedulingPolicyProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type SchedulingPolicyProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut fairshare_policy: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut tags: Option<::ValueMap> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "FairsharePolicy" => { + fairshare_policy = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(SchedulingPolicyProperties { + fairshare_policy: fairshare_policy, + name: name, + tags: tags, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for SchedulingPolicy { + type Properties = SchedulingPolicyProperties; + const TYPE: &'static str = "AWS::Batch::SchedulingPolicy"; + fn properties(&self) -> &SchedulingPolicyProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut SchedulingPolicyProperties { + &mut self.properties + } +} + +impl ::private::Sealed for SchedulingPolicy {} + +impl From for SchedulingPolicy { + fn from(properties: SchedulingPolicyProperties) -> SchedulingPolicy { + SchedulingPolicy { properties } + } +} + pub mod compute_environment { //! Property types for the `ComputeEnvironment` resource. @@ -468,13 +637,13 @@ pub mod compute_environment { pub struct ComputeResources { /// Property [`AllocationStrategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-allocationstrategy). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub allocation_strategy: Option<::Value>, /// Property [`BidPercentage`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-bidpercentage). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub bid_percentage: Option<::Value>, /// Property [`DesiredvCpus`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-desiredvcpus). /// @@ -483,33 +652,33 @@ pub mod compute_environment { pub desiredv_cpus: Option<::Value>, /// Property [`Ec2Configuration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-ec2configuration). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub ec2_configuration: Option<::ValueList>, /// Property [`Ec2KeyPair`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-ec2keypair). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub ec2_key_pair: Option<::Value>, /// Property [`ImageId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-imageid). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub image_id: Option<::Value>, /// Property [`InstanceRole`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-instancerole). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub instance_role: Option<::Value>, /// Property [`InstanceTypes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-instancetypes). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub instance_types: Option<::ValueList>, /// Property [`LaunchTemplate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-launchtemplate). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub launch_template: Option<::Value>, /// Property [`MaxvCpus`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-maxvcpus). /// @@ -523,8 +692,8 @@ pub mod compute_environment { pub minv_cpus: Option<::Value>, /// Property [`PlacementGroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-placementgroup). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub placement_group: Option<::Value>, /// Property [`SecurityGroupIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-securitygroupids). /// @@ -543,14 +712,19 @@ pub mod compute_environment { pub subnets: ::ValueList, /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-tags). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub tags: Option<::Value<::json::Value>>, + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueMap>, /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-type). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub r#type: ::Value, + /// Property [`UpdateToLatestImageVersion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-computeresources.html#cfn-batch-computeenvironment-computeresources-updatetolatestimageversion). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub update_to_latest_image_version: Option<::Value>, } impl ::codec::SerializeValue for ComputeResources { @@ -601,6 +775,9 @@ pub mod compute_environment { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?; + if let Some(ref update_to_latest_image_version) = self.update_to_latest_image_version { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UpdateToLatestImageVersion", update_to_latest_image_version)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -632,8 +809,9 @@ pub mod compute_environment { let mut security_group_ids: Option<::ValueList> = None; let mut spot_iam_fleet_role: Option<::Value> = None; let mut subnets: Option<::ValueList> = None; - let mut tags: Option<::Value<::json::Value>> = None; + let mut tags: Option<::ValueMap> = None; let mut r#type: Option<::Value> = None; + let mut update_to_latest_image_version: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { @@ -688,6 +866,9 @@ pub mod compute_environment { "Type" => { r#type = ::serde::de::MapAccess::next_value(&mut map)?; } + "UpdateToLatestImageVersion" => { + update_to_latest_image_version = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } @@ -710,6 +891,7 @@ pub mod compute_environment { subnets: subnets.ok_or(::serde::de::Error::missing_field("Subnets"))?, tags: tags, r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?, + update_to_latest_image_version: update_to_latest_image_version, }) } } @@ -723,13 +905,13 @@ pub mod compute_environment { pub struct Ec2ConfigurationObject { /// Property [`ImageIdOverride`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-ec2configurationobject.html#cfn-batch-computeenvironment-ec2configurationobject-imageidoverride). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub image_id_override: Option<::Value>, /// Property [`ImageType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-ec2configurationobject.html#cfn-batch-computeenvironment-ec2configurationobject-imagetype). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub image_type: ::Value, } @@ -787,18 +969,18 @@ pub mod compute_environment { pub struct LaunchTemplateSpecification { /// Property [`LaunchTemplateId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-launchtemplatespecification.html#cfn-batch-computeenvironment-launchtemplatespecification-launchtemplateid). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub launch_template_id: Option<::Value>, /// Property [`LaunchTemplateName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-launchtemplatespecification.html#cfn-batch-computeenvironment-launchtemplatespecification-launchtemplatename). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub launch_template_name: Option<::Value>, /// Property [`Version`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-launchtemplatespecification.html#cfn-batch-computeenvironment-launchtemplatespecification-version). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub version: Option<::Value>, } @@ -860,6 +1042,72 @@ pub mod compute_environment { d.deserialize_map(Visitor) } } + + /// The [`AWS::Batch::ComputeEnvironment.UpdatePolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-updatepolicy.html) property type. + #[derive(Debug, Default)] + pub struct UpdatePolicy { + /// Property [`JobExecutionTimeoutMinutes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-updatepolicy.html#cfn-batch-computeenvironment-updatepolicy-jobexecutiontimeoutminutes). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub job_execution_timeout_minutes: Option<::Value>, + /// Property [`TerminateJobsOnUpdate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-computeenvironment-updatepolicy.html#cfn-batch-computeenvironment-updatepolicy-terminatejobsonupdate). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub terminate_jobs_on_update: Option<::Value>, + } + + impl ::codec::SerializeValue for UpdatePolicy { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref job_execution_timeout_minutes) = self.job_execution_timeout_minutes { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "JobExecutionTimeoutMinutes", job_execution_timeout_minutes)?; + } + if let Some(ref terminate_jobs_on_update) = self.terminate_jobs_on_update { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TerminateJobsOnUpdate", terminate_jobs_on_update)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for UpdatePolicy { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = UpdatePolicy; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type UpdatePolicy") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut job_execution_timeout_minutes: Option<::Value> = None; + let mut terminate_jobs_on_update: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "JobExecutionTimeoutMinutes" => { + job_execution_timeout_minutes = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TerminateJobsOnUpdate" => { + terminate_jobs_on_update = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(UpdatePolicy { + job_execution_timeout_minutes: job_execution_timeout_minutes, + terminate_jobs_on_update: terminate_jobs_on_update, + }) + } + } + + d.deserialize_map(Visitor) + } + } } pub mod job_definition { @@ -2677,3 +2925,152 @@ pub mod job_queue { } } } + +pub mod scheduling_policy { + //! Property types for the `SchedulingPolicy` resource. + + /// The [`AWS::Batch::SchedulingPolicy.FairsharePolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-schedulingpolicy-fairsharepolicy.html) property type. + #[derive(Debug, Default)] + pub struct FairsharePolicy { + /// Property [`ComputeReservation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-schedulingpolicy-fairsharepolicy.html#cfn-batch-schedulingpolicy-fairsharepolicy-computereservation). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub compute_reservation: Option<::Value>, + /// Property [`ShareDecaySeconds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-schedulingpolicy-fairsharepolicy.html#cfn-batch-schedulingpolicy-fairsharepolicy-sharedecayseconds). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub share_decay_seconds: Option<::Value>, + /// Property [`ShareDistribution`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-schedulingpolicy-fairsharepolicy.html#cfn-batch-schedulingpolicy-fairsharepolicy-sharedistribution). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub share_distribution: Option<::ValueList>, + } + + impl ::codec::SerializeValue for FairsharePolicy { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref compute_reservation) = self.compute_reservation { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ComputeReservation", compute_reservation)?; + } + if let Some(ref share_decay_seconds) = self.share_decay_seconds { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ShareDecaySeconds", share_decay_seconds)?; + } + if let Some(ref share_distribution) = self.share_distribution { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ShareDistribution", share_distribution)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for FairsharePolicy { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = FairsharePolicy; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type FairsharePolicy") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut compute_reservation: Option<::Value> = None; + let mut share_decay_seconds: Option<::Value> = None; + let mut share_distribution: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ComputeReservation" => { + compute_reservation = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ShareDecaySeconds" => { + share_decay_seconds = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ShareDistribution" => { + share_distribution = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(FairsharePolicy { + compute_reservation: compute_reservation, + share_decay_seconds: share_decay_seconds, + share_distribution: share_distribution, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Batch::SchedulingPolicy.ShareAttributes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-schedulingpolicy-shareattributes.html) property type. + #[derive(Debug, Default)] + pub struct ShareAttributes { + /// Property [`ShareIdentifier`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-schedulingpolicy-shareattributes.html#cfn-batch-schedulingpolicy-shareattributes-shareidentifier). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub share_identifier: Option<::Value>, + /// Property [`WeightFactor`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-batch-schedulingpolicy-shareattributes.html#cfn-batch-schedulingpolicy-shareattributes-weightfactor). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub weight_factor: Option<::Value>, + } + + impl ::codec::SerializeValue for ShareAttributes { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref share_identifier) = self.share_identifier { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ShareIdentifier", share_identifier)?; + } + if let Some(ref weight_factor) = self.weight_factor { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "WeightFactor", weight_factor)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ShareAttributes { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ShareAttributes; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ShareAttributes") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut share_identifier: Option<::Value> = None; + let mut weight_factor: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ShareIdentifier" => { + share_identifier = ::serde::de::MapAccess::next_value(&mut map)?; + } + "WeightFactor" => { + weight_factor = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ShareAttributes { + share_identifier: share_identifier, + weight_factor: weight_factor, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} diff --git a/src/aws/billingconductor.rs b/src/aws/billingconductor.rs new file mode 100644 index 0000000..fb4409f --- /dev/null +++ b/src/aws/billingconductor.rs @@ -0,0 +1,854 @@ +//! Types for the `BillingConductor` service. + +/// The [`AWS::BillingConductor::BillingGroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-billinggroup.html) resource type. +#[derive(Debug, Default)] +pub struct BillingGroup { + properties: BillingGroupProperties +} + +/// Properties for the `BillingGroup` resource. +#[derive(Debug, Default)] +pub struct BillingGroupProperties { + /// Property [`AccountGrouping`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-billinggroup.html#cfn-billingconductor-billinggroup-accountgrouping). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub account_grouping: ::Value, + /// Property [`ComputationPreference`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-billinggroup.html#cfn-billingconductor-billinggroup-computationpreference). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub computation_preference: ::Value, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-billinggroup.html#cfn-billingconductor-billinggroup-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-billinggroup.html#cfn-billingconductor-billinggroup-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: ::Value, + /// Property [`PrimaryAccountId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-billinggroup.html#cfn-billingconductor-billinggroup-primaryaccountid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub primary_account_id: ::Value, +} + +impl ::serde::Serialize for BillingGroupProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AccountGrouping", &self.account_grouping)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ComputationPreference", &self.computation_preference)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrimaryAccountId", &self.primary_account_id)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for BillingGroupProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = BillingGroupProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type BillingGroupProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut account_grouping: Option<::Value> = None; + let mut computation_preference: Option<::Value> = None; + let mut description: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut primary_account_id: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AccountGrouping" => { + account_grouping = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ComputationPreference" => { + computation_preference = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PrimaryAccountId" => { + primary_account_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(BillingGroupProperties { + account_grouping: account_grouping.ok_or(::serde::de::Error::missing_field("AccountGrouping"))?, + computation_preference: computation_preference.ok_or(::serde::de::Error::missing_field("ComputationPreference"))?, + description: description, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + primary_account_id: primary_account_id.ok_or(::serde::de::Error::missing_field("PrimaryAccountId"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for BillingGroup { + type Properties = BillingGroupProperties; + const TYPE: &'static str = "AWS::BillingConductor::BillingGroup"; + fn properties(&self) -> &BillingGroupProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut BillingGroupProperties { + &mut self.properties + } +} + +impl ::private::Sealed for BillingGroup {} + +impl From for BillingGroup { + fn from(properties: BillingGroupProperties) -> BillingGroup { + BillingGroup { properties } + } +} + +/// The [`AWS::BillingConductor::CustomLineItem`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-customlineitem.html) resource type. +#[derive(Debug, Default)] +pub struct CustomLineItem { + properties: CustomLineItemProperties +} + +/// Properties for the `CustomLineItem` resource. +#[derive(Debug, Default)] +pub struct CustomLineItemProperties { + /// Property [`BillingGroupArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-customlineitem.html#cfn-billingconductor-customlineitem-billinggrouparn). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub billing_group_arn: ::Value, + /// Property [`BillingPeriodRange`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-customlineitem.html#cfn-billingconductor-customlineitem-billingperiodrange). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub billing_period_range: Option<::Value>, + /// Property [`CustomLineItemChargeDetails`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-customlineitem.html#cfn-billingconductor-customlineitem-customlineitemchargedetails). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub custom_line_item_charge_details: Option<::Value>, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-customlineitem.html#cfn-billingconductor-customlineitem-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-customlineitem.html#cfn-billingconductor-customlineitem-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: ::Value, +} + +impl ::serde::Serialize for CustomLineItemProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BillingGroupArn", &self.billing_group_arn)?; + if let Some(ref billing_period_range) = self.billing_period_range { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BillingPeriodRange", billing_period_range)?; + } + if let Some(ref custom_line_item_charge_details) = self.custom_line_item_charge_details { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CustomLineItemChargeDetails", custom_line_item_charge_details)?; + } + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for CustomLineItemProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CustomLineItemProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CustomLineItemProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut billing_group_arn: Option<::Value> = None; + let mut billing_period_range: Option<::Value> = None; + let mut custom_line_item_charge_details: Option<::Value> = None; + let mut description: Option<::Value> = None; + let mut name: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "BillingGroupArn" => { + billing_group_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BillingPeriodRange" => { + billing_period_range = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CustomLineItemChargeDetails" => { + custom_line_item_charge_details = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CustomLineItemProperties { + billing_group_arn: billing_group_arn.ok_or(::serde::de::Error::missing_field("BillingGroupArn"))?, + billing_period_range: billing_period_range, + custom_line_item_charge_details: custom_line_item_charge_details, + description: description, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for CustomLineItem { + type Properties = CustomLineItemProperties; + const TYPE: &'static str = "AWS::BillingConductor::CustomLineItem"; + fn properties(&self) -> &CustomLineItemProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut CustomLineItemProperties { + &mut self.properties + } +} + +impl ::private::Sealed for CustomLineItem {} + +impl From for CustomLineItem { + fn from(properties: CustomLineItemProperties) -> CustomLineItem { + CustomLineItem { properties } + } +} + +/// The [`AWS::BillingConductor::PricingPlan`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingplan.html) resource type. +#[derive(Debug, Default)] +pub struct PricingPlan { + properties: PricingPlanProperties +} + +/// Properties for the `PricingPlan` resource. +#[derive(Debug, Default)] +pub struct PricingPlanProperties { + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingplan.html#cfn-billingconductor-pricingplan-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingplan.html#cfn-billingconductor-pricingplan-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: ::Value, + /// Property [`PricingRuleArns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingplan.html#cfn-billingconductor-pricingplan-pricingrulearns). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub pricing_rule_arns: Option<::ValueList>, +} + +impl ::serde::Serialize for PricingPlanProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + if let Some(ref pricing_rule_arns) = self.pricing_rule_arns { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PricingRuleArns", pricing_rule_arns)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for PricingPlanProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = PricingPlanProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type PricingPlanProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut description: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut pricing_rule_arns: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PricingRuleArns" => { + pricing_rule_arns = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(PricingPlanProperties { + description: description, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + pricing_rule_arns: pricing_rule_arns, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for PricingPlan { + type Properties = PricingPlanProperties; + const TYPE: &'static str = "AWS::BillingConductor::PricingPlan"; + fn properties(&self) -> &PricingPlanProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut PricingPlanProperties { + &mut self.properties + } +} + +impl ::private::Sealed for PricingPlan {} + +impl From for PricingPlan { + fn from(properties: PricingPlanProperties) -> PricingPlan { + PricingPlan { properties } + } +} + +/// The [`AWS::BillingConductor::PricingRule`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingrule.html) resource type. +#[derive(Debug, Default)] +pub struct PricingRule { + properties: PricingRuleProperties +} + +/// Properties for the `PricingRule` resource. +#[derive(Debug, Default)] +pub struct PricingRuleProperties { + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingrule.html#cfn-billingconductor-pricingrule-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`ModifierPercentage`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingrule.html#cfn-billingconductor-pricingrule-modifierpercentage). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub modifier_percentage: ::Value, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingrule.html#cfn-billingconductor-pricingrule-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: ::Value, + /// Property [`Scope`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingrule.html#cfn-billingconductor-pricingrule-scope). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub scope: ::Value, + /// Property [`Service`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingrule.html#cfn-billingconductor-pricingrule-service). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub service: Option<::Value>, + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-billingconductor-pricingrule.html#cfn-billingconductor-pricingrule-type). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#type: ::Value, +} + +impl ::serde::Serialize for PricingRuleProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ModifierPercentage", &self.modifier_percentage)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Scope", &self.scope)?; + if let Some(ref service) = self.service { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Service", service)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for PricingRuleProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = PricingRuleProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type PricingRuleProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut description: Option<::Value> = None; + let mut modifier_percentage: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut scope: Option<::Value> = None; + let mut service: Option<::Value> = None; + let mut r#type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ModifierPercentage" => { + modifier_percentage = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Scope" => { + scope = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Service" => { + service = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(PricingRuleProperties { + description: description, + modifier_percentage: modifier_percentage.ok_or(::serde::de::Error::missing_field("ModifierPercentage"))?, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + scope: scope.ok_or(::serde::de::Error::missing_field("Scope"))?, + service: service, + r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for PricingRule { + type Properties = PricingRuleProperties; + const TYPE: &'static str = "AWS::BillingConductor::PricingRule"; + fn properties(&self) -> &PricingRuleProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut PricingRuleProperties { + &mut self.properties + } +} + +impl ::private::Sealed for PricingRule {} + +impl From for PricingRule { + fn from(properties: PricingRuleProperties) -> PricingRule { + PricingRule { properties } + } +} + +pub mod billing_group { + //! Property types for the `BillingGroup` resource. + + /// The [`AWS::BillingConductor::BillingGroup.AccountGrouping`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-billinggroup-accountgrouping.html) property type. + #[derive(Debug, Default)] + pub struct AccountGrouping { + /// Property [`LinkedAccountIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-billinggroup-accountgrouping.html#cfn-billingconductor-billinggroup-accountgrouping-linkedaccountids). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub linked_account_ids: ::ValueList, + } + + impl ::codec::SerializeValue for AccountGrouping { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LinkedAccountIds", &self.linked_account_ids)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AccountGrouping { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AccountGrouping; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AccountGrouping") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut linked_account_ids: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "LinkedAccountIds" => { + linked_account_ids = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AccountGrouping { + linked_account_ids: linked_account_ids.ok_or(::serde::de::Error::missing_field("LinkedAccountIds"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::BillingConductor::BillingGroup.ComputationPreference`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-billinggroup-computationpreference.html) property type. + #[derive(Debug, Default)] + pub struct ComputationPreference { + /// Property [`PricingPlanArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-billinggroup-computationpreference.html#cfn-billingconductor-billinggroup-computationpreference-pricingplanarn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub pricing_plan_arn: ::Value, + } + + impl ::codec::SerializeValue for ComputationPreference { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PricingPlanArn", &self.pricing_plan_arn)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ComputationPreference { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ComputationPreference; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ComputationPreference") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut pricing_plan_arn: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "PricingPlanArn" => { + pricing_plan_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ComputationPreference { + pricing_plan_arn: pricing_plan_arn.ok_or(::serde::de::Error::missing_field("PricingPlanArn"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + +pub mod custom_line_item { + //! Property types for the `CustomLineItem` resource. + + /// The [`AWS::BillingConductor::CustomLineItem.BillingPeriodRange`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-billingperiodrange.html) property type. + #[derive(Debug, Default)] + pub struct BillingPeriodRange { + /// Property [`ExclusiveEndBillingPeriod`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-billingperiodrange.html#cfn-billingconductor-customlineitem-billingperiodrange-exclusiveendbillingperiod). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub exclusive_end_billing_period: Option<::Value>, + /// Property [`InclusiveStartBillingPeriod`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-billingperiodrange.html#cfn-billingconductor-customlineitem-billingperiodrange-inclusivestartbillingperiod). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub inclusive_start_billing_period: Option<::Value>, + } + + impl ::codec::SerializeValue for BillingPeriodRange { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref exclusive_end_billing_period) = self.exclusive_end_billing_period { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExclusiveEndBillingPeriod", exclusive_end_billing_period)?; + } + if let Some(ref inclusive_start_billing_period) = self.inclusive_start_billing_period { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InclusiveStartBillingPeriod", inclusive_start_billing_period)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for BillingPeriodRange { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = BillingPeriodRange; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type BillingPeriodRange") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut exclusive_end_billing_period: Option<::Value> = None; + let mut inclusive_start_billing_period: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ExclusiveEndBillingPeriod" => { + exclusive_end_billing_period = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InclusiveStartBillingPeriod" => { + inclusive_start_billing_period = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(BillingPeriodRange { + exclusive_end_billing_period: exclusive_end_billing_period, + inclusive_start_billing_period: inclusive_start_billing_period, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::BillingConductor::CustomLineItem.CustomLineItemChargeDetails`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-customlineitemchargedetails.html) property type. + #[derive(Debug, Default)] + pub struct CustomLineItemChargeDetails { + /// Property [`Flat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-customlineitemchargedetails.html#cfn-billingconductor-customlineitem-customlineitemchargedetails-flat). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub flat: Option<::Value>, + /// Property [`Percentage`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-customlineitemchargedetails.html#cfn-billingconductor-customlineitem-customlineitemchargedetails-percentage). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub percentage: Option<::Value>, + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-customlineitemchargedetails.html#cfn-billingconductor-customlineitem-customlineitemchargedetails-type). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub r#type: ::Value, + } + + impl ::codec::SerializeValue for CustomLineItemChargeDetails { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref flat) = self.flat { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Flat", flat)?; + } + if let Some(ref percentage) = self.percentage { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Percentage", percentage)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CustomLineItemChargeDetails { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CustomLineItemChargeDetails; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CustomLineItemChargeDetails") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut flat: Option<::Value> = None; + let mut percentage: Option<::Value> = None; + let mut r#type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Flat" => { + flat = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Percentage" => { + percentage = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CustomLineItemChargeDetails { + flat: flat, + percentage: percentage, + r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::BillingConductor::CustomLineItem.CustomLineItemFlatChargeDetails`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-customlineitemflatchargedetails.html) property type. + #[derive(Debug, Default)] + pub struct CustomLineItemFlatChargeDetails { + /// Property [`ChargeValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-customlineitemflatchargedetails.html#cfn-billingconductor-customlineitem-customlineitemflatchargedetails-chargevalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub charge_value: ::Value, + } + + impl ::codec::SerializeValue for CustomLineItemFlatChargeDetails { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ChargeValue", &self.charge_value)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CustomLineItemFlatChargeDetails { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CustomLineItemFlatChargeDetails; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CustomLineItemFlatChargeDetails") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut charge_value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ChargeValue" => { + charge_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CustomLineItemFlatChargeDetails { + charge_value: charge_value.ok_or(::serde::de::Error::missing_field("ChargeValue"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::BillingConductor::CustomLineItem.CustomLineItemPercentageChargeDetails`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-customlineitempercentagechargedetails.html) property type. + #[derive(Debug, Default)] + pub struct CustomLineItemPercentageChargeDetails { + /// Property [`ChildAssociatedResources`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-customlineitempercentagechargedetails.html#cfn-billingconductor-customlineitem-customlineitempercentagechargedetails-childassociatedresources). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub child_associated_resources: Option<::ValueList>, + /// Property [`PercentageValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-billingconductor-customlineitem-customlineitempercentagechargedetails.html#cfn-billingconductor-customlineitem-customlineitempercentagechargedetails-percentagevalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub percentage_value: ::Value, + } + + impl ::codec::SerializeValue for CustomLineItemPercentageChargeDetails { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref child_associated_resources) = self.child_associated_resources { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ChildAssociatedResources", child_associated_resources)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PercentageValue", &self.percentage_value)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CustomLineItemPercentageChargeDetails { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CustomLineItemPercentageChargeDetails; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CustomLineItemPercentageChargeDetails") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut child_associated_resources: Option<::ValueList> = None; + let mut percentage_value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ChildAssociatedResources" => { + child_associated_resources = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PercentageValue" => { + percentage_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CustomLineItemPercentageChargeDetails { + child_associated_resources: child_associated_resources, + percentage_value: percentage_value.ok_or(::serde::de::Error::missing_field("PercentageValue"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} diff --git a/src/aws/budgets.rs b/src/aws/budgets.rs index ca6274c..8f3a17d 100644 --- a/src/aws/budgets.rs +++ b/src/aws/budgets.rs @@ -137,7 +137,7 @@ pub struct BudgetsActionProperties { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub subscribers: Option<::ValueList>, + pub subscribers: ::ValueList, } impl ::serde::Serialize for BudgetsActionProperties { @@ -152,9 +152,7 @@ impl ::serde::Serialize for BudgetsActionProperties { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Definition", &self.definition)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExecutionRoleArn", &self.execution_role_arn)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "NotificationType", &self.notification_type)?; - if let Some(ref subscribers) = self.subscribers { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Subscribers", subscribers)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Subscribers", &self.subscribers)?; ::serde::ser::SerializeMap::end(map) } } @@ -218,7 +216,7 @@ impl<'de> ::serde::Deserialize<'de> for BudgetsActionProperties { definition: definition.ok_or(::serde::de::Error::missing_field("Definition"))?, execution_role_arn: execution_role_arn.ok_or(::serde::de::Error::missing_field("ExecutionRoleArn"))?, notification_type: notification_type.ok_or(::serde::de::Error::missing_field("NotificationType"))?, - subscribers: subscribers, + subscribers: subscribers.ok_or(::serde::de::Error::missing_field("Subscribers"))?, }) } } diff --git a/src/aws/cassandra.rs b/src/aws/cassandra.rs index 8f88427..ef69bae 100644 --- a/src/aws/cassandra.rs +++ b/src/aws/cassandra.rs @@ -110,6 +110,16 @@ pub struct TableProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub clustering_key_columns: Option<::ValueList>, + /// Property [`DefaultTimeToLive`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cassandra-table.html#cfn-cassandra-table-defaulttimetolive). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub default_time_to_live: Option<::Value>, + /// Property [`EncryptionSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cassandra-table.html#cfn-cassandra-table-encryptionspecification). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub encryption_specification: Option<::Value>, /// Property [`KeyspaceName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cassandra-table.html#cfn-cassandra-table-keyspacename). /// /// Update type: _Immutable_. @@ -151,6 +161,12 @@ impl ::serde::Serialize for TableProperties { if let Some(ref clustering_key_columns) = self.clustering_key_columns { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ClusteringKeyColumns", clustering_key_columns)?; } + if let Some(ref default_time_to_live) = self.default_time_to_live { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DefaultTimeToLive", default_time_to_live)?; + } + if let Some(ref encryption_specification) = self.encryption_specification { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EncryptionSpecification", encryption_specification)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "KeyspaceName", &self.keyspace_name)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "PartitionKeyColumns", &self.partition_key_columns)?; if let Some(ref point_in_time_recovery_enabled) = self.point_in_time_recovery_enabled { @@ -183,6 +199,8 @@ impl<'de> ::serde::Deserialize<'de> for TableProperties { fn visit_map>(self, mut map: A) -> Result { let mut billing_mode: Option<::Value> = None; let mut clustering_key_columns: Option<::ValueList> = None; + let mut default_time_to_live: Option<::Value> = None; + let mut encryption_specification: Option<::Value> = None; let mut keyspace_name: Option<::Value> = None; let mut partition_key_columns: Option<::ValueList> = None; let mut point_in_time_recovery_enabled: Option<::Value> = None; @@ -198,6 +216,12 @@ impl<'de> ::serde::Deserialize<'de> for TableProperties { "ClusteringKeyColumns" => { clustering_key_columns = ::serde::de::MapAccess::next_value(&mut map)?; } + "DefaultTimeToLive" => { + default_time_to_live = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EncryptionSpecification" => { + encryption_specification = ::serde::de::MapAccess::next_value(&mut map)?; + } "KeyspaceName" => { keyspace_name = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -223,6 +247,8 @@ impl<'de> ::serde::Deserialize<'de> for TableProperties { Ok(TableProperties { billing_mode: billing_mode, clustering_key_columns: clustering_key_columns, + default_time_to_live: default_time_to_live, + encryption_specification: encryption_specification, keyspace_name: keyspace_name.ok_or(::serde::de::Error::missing_field("KeyspaceName"))?, partition_key_columns: partition_key_columns.ok_or(::serde::de::Error::missing_field("PartitionKeyColumns"))?, point_in_time_recovery_enabled: point_in_time_recovery_enabled, @@ -449,6 +475,70 @@ pub mod table { } } + /// The [`AWS::Cassandra::Table.EncryptionSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cassandra-table-encryptionspecification.html) property type. + #[derive(Debug, Default)] + pub struct EncryptionSpecification { + /// Property [`EncryptionType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cassandra-table-encryptionspecification.html#cfn-cassandra-table-encryptionspecification-encryptiontype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub encryption_type: ::Value, + /// Property [`KmsKeyIdentifier`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cassandra-table-encryptionspecification.html#cfn-cassandra-table-encryptionspecification-kmskeyidentifier). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub kms_key_identifier: Option<::Value>, + } + + impl ::codec::SerializeValue for EncryptionSpecification { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EncryptionType", &self.encryption_type)?; + if let Some(ref kms_key_identifier) = self.kms_key_identifier { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "KmsKeyIdentifier", kms_key_identifier)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for EncryptionSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = EncryptionSpecification; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type EncryptionSpecification") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut encryption_type: Option<::Value> = None; + let mut kms_key_identifier: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "EncryptionType" => { + encryption_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "KmsKeyIdentifier" => { + kms_key_identifier = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(EncryptionSpecification { + encryption_type: encryption_type.ok_or(::serde::de::Error::missing_field("EncryptionType"))?, + kms_key_identifier: kms_key_identifier, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::Cassandra::Table.ProvisionedThroughput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cassandra-table-provisionedthroughput.html) property type. #[derive(Debug, Default)] pub struct ProvisionedThroughput { diff --git a/src/aws/ce.rs b/src/aws/ce.rs index c9e8339..a130995 100644 --- a/src/aws/ce.rs +++ b/src/aws/ce.rs @@ -262,6 +262,11 @@ pub struct CostCategoryProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub rules: ::Value, + /// Property [`SplitChargeRules`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ce-costcategory.html#cfn-ce-costcategory-splitchargerules). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub split_charge_rules: Option<::Value>, } impl ::serde::Serialize for CostCategoryProperties { @@ -273,6 +278,9 @@ impl ::serde::Serialize for CostCategoryProperties { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "RuleVersion", &self.rule_version)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "Rules", &self.rules)?; + if let Some(ref split_charge_rules) = self.split_charge_rules { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SplitChargeRules", split_charge_rules)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -293,6 +301,7 @@ impl<'de> ::serde::Deserialize<'de> for CostCategoryProperties { let mut name: Option<::Value> = None; let mut rule_version: Option<::Value> = None; let mut rules: Option<::Value> = None; + let mut split_charge_rules: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { @@ -308,6 +317,9 @@ impl<'de> ::serde::Deserialize<'de> for CostCategoryProperties { "Rules" => { rules = ::serde::de::MapAccess::next_value(&mut map)?; } + "SplitChargeRules" => { + split_charge_rules = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } @@ -317,6 +329,7 @@ impl<'de> ::serde::Deserialize<'de> for CostCategoryProperties { name: name.ok_or(::serde::de::Error::missing_field("Name"))?, rule_version: rule_version.ok_or(::serde::de::Error::missing_field("RuleVersion"))?, rules: rules.ok_or(::serde::de::Error::missing_field("Rules"))?, + split_charge_rules: split_charge_rules, }) } } diff --git a/src/aws/chatbot.rs b/src/aws/chatbot.rs index 2ddc54f..bd30a9b 100644 --- a/src/aws/chatbot.rs +++ b/src/aws/chatbot.rs @@ -14,6 +14,11 @@ pub struct SlackChannelConfigurationProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub configuration_name: ::Value, + /// Property [`GuardrailPolicies`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html#cfn-chatbot-slackchannelconfiguration-guardrailpolicies). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub guardrail_policies: Option<::ValueList>, /// Property [`IamRoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html#cfn-chatbot-slackchannelconfiguration-iamrolearn). /// /// Update type: _Mutable_. @@ -39,12 +44,20 @@ pub struct SlackChannelConfigurationProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub sns_topic_arns: Option<::ValueList>, + /// Property [`UserRoleRequired`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-chatbot-slackchannelconfiguration.html#cfn-chatbot-slackchannelconfiguration-userrolerequired). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub user_role_required: Option<::Value>, } impl ::serde::Serialize for SlackChannelConfigurationProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConfigurationName", &self.configuration_name)?; + if let Some(ref guardrail_policies) = self.guardrail_policies { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GuardrailPolicies", guardrail_policies)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "IamRoleArn", &self.iam_role_arn)?; if let Some(ref logging_level) = self.logging_level { ::serde::ser::SerializeMap::serialize_entry(&mut map, "LoggingLevel", logging_level)?; @@ -54,6 +67,9 @@ impl ::serde::Serialize for SlackChannelConfigurationProperties { if let Some(ref sns_topic_arns) = self.sns_topic_arns { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SnsTopicArns", sns_topic_arns)?; } + if let Some(ref user_role_required) = self.user_role_required { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UserRoleRequired", user_role_required)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -71,17 +87,22 @@ impl<'de> ::serde::Deserialize<'de> for SlackChannelConfigurationProperties { fn visit_map>(self, mut map: A) -> Result { let mut configuration_name: Option<::Value> = None; + let mut guardrail_policies: Option<::ValueList> = None; let mut iam_role_arn: Option<::Value> = None; let mut logging_level: Option<::Value> = None; let mut slack_channel_id: Option<::Value> = None; let mut slack_workspace_id: Option<::Value> = None; let mut sns_topic_arns: Option<::ValueList> = None; + let mut user_role_required: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { "ConfigurationName" => { configuration_name = ::serde::de::MapAccess::next_value(&mut map)?; } + "GuardrailPolicies" => { + guardrail_policies = ::serde::de::MapAccess::next_value(&mut map)?; + } "IamRoleArn" => { iam_role_arn = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -97,17 +118,22 @@ impl<'de> ::serde::Deserialize<'de> for SlackChannelConfigurationProperties { "SnsTopicArns" => { sns_topic_arns = ::serde::de::MapAccess::next_value(&mut map)?; } + "UserRoleRequired" => { + user_role_required = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } Ok(SlackChannelConfigurationProperties { configuration_name: configuration_name.ok_or(::serde::de::Error::missing_field("ConfigurationName"))?, + guardrail_policies: guardrail_policies, iam_role_arn: iam_role_arn.ok_or(::serde::de::Error::missing_field("IamRoleArn"))?, logging_level: logging_level, slack_channel_id: slack_channel_id.ok_or(::serde::de::Error::missing_field("SlackChannelId"))?, slack_workspace_id: slack_workspace_id.ok_or(::serde::de::Error::missing_field("SlackWorkspaceId"))?, sns_topic_arns: sns_topic_arns, + user_role_required: user_role_required, }) } } diff --git a/src/aws/cloudformation.rs b/src/aws/cloudformation.rs index 0393212..799ed0f 100644 --- a/src/aws/cloudformation.rs +++ b/src/aws/cloudformation.rs @@ -76,6 +76,338 @@ impl From for CustomResource { } } +/// The [`AWS::CloudFormation::HookDefaultVersion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hookdefaultversion.html) resource type. +#[derive(Debug, Default)] +pub struct HookDefaultVersion { + properties: HookDefaultVersionProperties +} + +/// Properties for the `HookDefaultVersion` resource. +#[derive(Debug, Default)] +pub struct HookDefaultVersionProperties { + /// Property [`TypeName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hookdefaultversion.html#cfn-cloudformation-hookdefaultversion-typename). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub type_name: Option<::Value>, + /// Property [`TypeVersionArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hookdefaultversion.html#cfn-cloudformation-hookdefaultversion-typeversionarn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub type_version_arn: Option<::Value>, + /// Property [`VersionId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hookdefaultversion.html#cfn-cloudformation-hookdefaultversion-versionid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub version_id: Option<::Value>, +} + +impl ::serde::Serialize for HookDefaultVersionProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref type_name) = self.type_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TypeName", type_name)?; + } + if let Some(ref type_version_arn) = self.type_version_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TypeVersionArn", type_version_arn)?; + } + if let Some(ref version_id) = self.version_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VersionId", version_id)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for HookDefaultVersionProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = HookDefaultVersionProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type HookDefaultVersionProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut type_name: Option<::Value> = None; + let mut type_version_arn: Option<::Value> = None; + let mut version_id: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "TypeName" => { + type_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TypeVersionArn" => { + type_version_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VersionId" => { + version_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(HookDefaultVersionProperties { + type_name: type_name, + type_version_arn: type_version_arn, + version_id: version_id, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for HookDefaultVersion { + type Properties = HookDefaultVersionProperties; + const TYPE: &'static str = "AWS::CloudFormation::HookDefaultVersion"; + fn properties(&self) -> &HookDefaultVersionProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut HookDefaultVersionProperties { + &mut self.properties + } +} + +impl ::private::Sealed for HookDefaultVersion {} + +impl From for HookDefaultVersion { + fn from(properties: HookDefaultVersionProperties) -> HookDefaultVersion { + HookDefaultVersion { properties } + } +} + +/// The [`AWS::CloudFormation::HookTypeConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hooktypeconfig.html) resource type. +#[derive(Debug, Default)] +pub struct HookTypeConfig { + properties: HookTypeConfigProperties +} + +/// Properties for the `HookTypeConfig` resource. +#[derive(Debug, Default)] +pub struct HookTypeConfigProperties { + /// Property [`Configuration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hooktypeconfig.html#cfn-cloudformation-hooktypeconfig-configuration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub configuration: ::Value, + /// Property [`ConfigurationAlias`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hooktypeconfig.html#cfn-cloudformation-hooktypeconfig-configurationalias). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub configuration_alias: Option<::Value>, + /// Property [`TypeArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hooktypeconfig.html#cfn-cloudformation-hooktypeconfig-typearn). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub type_arn: Option<::Value>, + /// Property [`TypeName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hooktypeconfig.html#cfn-cloudformation-hooktypeconfig-typename). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub type_name: Option<::Value>, +} + +impl ::serde::Serialize for HookTypeConfigProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Configuration", &self.configuration)?; + if let Some(ref configuration_alias) = self.configuration_alias { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConfigurationAlias", configuration_alias)?; + } + if let Some(ref type_arn) = self.type_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TypeArn", type_arn)?; + } + if let Some(ref type_name) = self.type_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TypeName", type_name)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for HookTypeConfigProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = HookTypeConfigProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type HookTypeConfigProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut configuration: Option<::Value> = None; + let mut configuration_alias: Option<::Value> = None; + let mut type_arn: Option<::Value> = None; + let mut type_name: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Configuration" => { + configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ConfigurationAlias" => { + configuration_alias = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TypeArn" => { + type_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TypeName" => { + type_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(HookTypeConfigProperties { + configuration: configuration.ok_or(::serde::de::Error::missing_field("Configuration"))?, + configuration_alias: configuration_alias, + type_arn: type_arn, + type_name: type_name, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for HookTypeConfig { + type Properties = HookTypeConfigProperties; + const TYPE: &'static str = "AWS::CloudFormation::HookTypeConfig"; + fn properties(&self) -> &HookTypeConfigProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut HookTypeConfigProperties { + &mut self.properties + } +} + +impl ::private::Sealed for HookTypeConfig {} + +impl From for HookTypeConfig { + fn from(properties: HookTypeConfigProperties) -> HookTypeConfig { + HookTypeConfig { properties } + } +} + +/// The [`AWS::CloudFormation::HookVersion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hookversion.html) resource type. +#[derive(Debug, Default)] +pub struct HookVersion { + properties: HookVersionProperties +} + +/// Properties for the `HookVersion` resource. +#[derive(Debug, Default)] +pub struct HookVersionProperties { + /// Property [`ExecutionRoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hookversion.html#cfn-cloudformation-hookversion-executionrolearn). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub execution_role_arn: Option<::Value>, + /// Property [`LoggingConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hookversion.html#cfn-cloudformation-hookversion-loggingconfig). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub logging_config: Option<::Value>, + /// Property [`SchemaHandlerPackage`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hookversion.html#cfn-cloudformation-hookversion-schemahandlerpackage). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub schema_handler_package: ::Value, + /// Property [`TypeName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-hookversion.html#cfn-cloudformation-hookversion-typename). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub type_name: ::Value, +} + +impl ::serde::Serialize for HookVersionProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref execution_role_arn) = self.execution_role_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExecutionRoleArn", execution_role_arn)?; + } + if let Some(ref logging_config) = self.logging_config { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LoggingConfig", logging_config)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SchemaHandlerPackage", &self.schema_handler_package)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TypeName", &self.type_name)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for HookVersionProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = HookVersionProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type HookVersionProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut execution_role_arn: Option<::Value> = None; + let mut logging_config: Option<::Value> = None; + let mut schema_handler_package: Option<::Value> = None; + let mut type_name: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ExecutionRoleArn" => { + execution_role_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LoggingConfig" => { + logging_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SchemaHandlerPackage" => { + schema_handler_package = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TypeName" => { + type_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(HookVersionProperties { + execution_role_arn: execution_role_arn, + logging_config: logging_config, + schema_handler_package: schema_handler_package.ok_or(::serde::de::Error::missing_field("SchemaHandlerPackage"))?, + type_name: type_name.ok_or(::serde::de::Error::missing_field("TypeName"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for HookVersion { + type Properties = HookVersionProperties; + const TYPE: &'static str = "AWS::CloudFormation::HookVersion"; + fn properties(&self) -> &HookVersionProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut HookVersionProperties { + &mut self.properties + } +} + +impl ::private::Sealed for HookVersion {} + +impl From for HookVersion { + fn from(properties: HookVersionProperties) -> HookVersion { + HookVersion { properties } + } +} + /// The [`AWS::CloudFormation::Macro`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-macro.html) resource type. #[derive(Debug, Default)] pub struct Macro { @@ -996,6 +1328,11 @@ pub struct StackSetProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub execution_role_name: Option<::Value>, + /// Property [`ManagedExecution`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-stackset.html#cfn-cloudformation-stackset-managedexecution). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub managed_execution: Option<::Value<::json::Value>>, /// Property [`OperationPreferences`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-stackset.html#cfn-cloudformation-stackset-operationpreferences). /// /// Update type: _Mutable_. @@ -1059,6 +1396,9 @@ impl ::serde::Serialize for StackSetProperties { if let Some(ref execution_role_name) = self.execution_role_name { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExecutionRoleName", execution_role_name)?; } + if let Some(ref managed_execution) = self.managed_execution { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ManagedExecution", managed_execution)?; + } if let Some(ref operation_preferences) = self.operation_preferences { ::serde::ser::SerializeMap::serialize_entry(&mut map, "OperationPreferences", operation_preferences)?; } @@ -1101,6 +1441,7 @@ impl<'de> ::serde::Deserialize<'de> for StackSetProperties { let mut capabilities: Option<::ValueList> = None; let mut description: Option<::Value> = None; let mut execution_role_name: Option<::Value> = None; + let mut managed_execution: Option<::Value<::json::Value>> = None; let mut operation_preferences: Option<::Value> = None; let mut parameters: Option<::ValueList> = None; let mut permission_model: Option<::Value> = None; @@ -1130,6 +1471,9 @@ impl<'de> ::serde::Deserialize<'de> for StackSetProperties { "ExecutionRoleName" => { execution_role_name = ::serde::de::MapAccess::next_value(&mut map)?; } + "ManagedExecution" => { + managed_execution = ::serde::de::MapAccess::next_value(&mut map)?; + } "OperationPreferences" => { operation_preferences = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1165,6 +1509,7 @@ impl<'de> ::serde::Deserialize<'de> for StackSetProperties { capabilities: capabilities, description: description, execution_role_name: execution_role_name, + managed_execution: managed_execution, operation_preferences: operation_preferences, parameters: parameters, permission_model: permission_model.ok_or(::serde::de::Error::missing_field("PermissionModel"))?, @@ -1556,6 +1901,76 @@ impl From for WaitConditionHandle { } } +pub mod hook_version { + //! Property types for the `HookVersion` resource. + + /// The [`AWS::CloudFormation::HookVersion.LoggingConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-hookversion-loggingconfig.html) property type. + #[derive(Debug, Default)] + pub struct LoggingConfig { + /// Property [`LogGroupName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-hookversion-loggingconfig.html#cfn-cloudformation-hookversion-loggingconfig-loggroupname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub log_group_name: Option<::Value>, + /// Property [`LogRoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudformation-hookversion-loggingconfig.html#cfn-cloudformation-hookversion-loggingconfig-logrolearn). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub log_role_arn: Option<::Value>, + } + + impl ::codec::SerializeValue for LoggingConfig { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref log_group_name) = self.log_group_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogGroupName", log_group_name)?; + } + if let Some(ref log_role_arn) = self.log_role_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogRoleArn", log_role_arn)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for LoggingConfig { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = LoggingConfig; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type LoggingConfig") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut log_group_name: Option<::Value> = None; + let mut log_role_arn: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "LogGroupName" => { + log_group_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LogRoleArn" => { + log_role_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(LoggingConfig { + log_group_name: log_group_name, + log_role_arn: log_role_arn, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + pub mod resource_version { //! Property types for the `ResourceVersion` resource. diff --git a/src/aws/cloudfront.rs b/src/aws/cloudfront.rs index 4c4465e..0a86f72 100644 --- a/src/aws/cloudfront.rs +++ b/src/aws/cloudfront.rs @@ -265,11 +265,6 @@ pub struct FunctionProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub function_config: Option<::Value>, - /// Property [`FunctionMetadata`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-function.html#cfn-cloudfront-function-functionmetadata). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub function_metadata: Option<::Value>, /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-function.html#cfn-cloudfront-function-name). /// /// Update type: _Mutable_. @@ -289,9 +284,6 @@ impl ::serde::Serialize for FunctionProperties { if let Some(ref function_config) = self.function_config { ::serde::ser::SerializeMap::serialize_entry(&mut map, "FunctionConfig", function_config)?; } - if let Some(ref function_metadata) = self.function_metadata { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "FunctionMetadata", function_metadata)?; - } ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; ::serde::ser::SerializeMap::end(map) } @@ -312,7 +304,6 @@ impl<'de> ::serde::Deserialize<'de> for FunctionProperties { let mut auto_publish: Option<::Value> = None; let mut function_code: Option<::Value> = None; let mut function_config: Option<::Value> = None; - let mut function_metadata: Option<::Value> = None; let mut name: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { @@ -326,9 +317,6 @@ impl<'de> ::serde::Deserialize<'de> for FunctionProperties { "FunctionConfig" => { function_config = ::serde::de::MapAccess::next_value(&mut map)?; } - "FunctionMetadata" => { - function_metadata = ::serde::de::MapAccess::next_value(&mut map)?; - } "Name" => { name = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -340,7 +328,6 @@ impl<'de> ::serde::Deserialize<'de> for FunctionProperties { auto_publish: auto_publish, function_code: function_code, function_config: function_config, - function_metadata: function_metadata, name: name.ok_or(::serde::de::Error::missing_field("Name"))?, }) } @@ -706,6 +693,82 @@ impl From for RealtimeLogConfig { } } +/// The [`AWS::CloudFront::ResponseHeadersPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-responseheaderspolicy.html) resource type. +#[derive(Debug, Default)] +pub struct ResponseHeadersPolicy { + properties: ResponseHeadersPolicyProperties +} + +/// Properties for the `ResponseHeadersPolicy` resource. +#[derive(Debug, Default)] +pub struct ResponseHeadersPolicyProperties { + /// Property [`ResponseHeadersPolicyConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-responseheaderspolicy.html#cfn-cloudfront-responseheaderspolicy-responseheaderspolicyconfig). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub response_headers_policy_config: ::Value, +} + +impl ::serde::Serialize for ResponseHeadersPolicyProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResponseHeadersPolicyConfig", &self.response_headers_policy_config)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for ResponseHeadersPolicyProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ResponseHeadersPolicyProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ResponseHeadersPolicyProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut response_headers_policy_config: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ResponseHeadersPolicyConfig" => { + response_headers_policy_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ResponseHeadersPolicyProperties { + response_headers_policy_config: response_headers_policy_config.ok_or(::serde::de::Error::missing_field("ResponseHeadersPolicyConfig"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for ResponseHeadersPolicy { + type Properties = ResponseHeadersPolicyProperties; + const TYPE: &'static str = "AWS::CloudFront::ResponseHeadersPolicy"; + fn properties(&self) -> &ResponseHeadersPolicyProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut ResponseHeadersPolicyProperties { + &mut self.properties + } +} + +impl ::private::Sealed for ResponseHeadersPolicy {} + +impl From for ResponseHeadersPolicy { + fn from(properties: ResponseHeadersPolicyProperties) -> ResponseHeadersPolicy { + ResponseHeadersPolicy { properties } + } +} + /// The [`AWS::CloudFront::StreamingDistribution`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-streamingdistribution.html) resource type. #[derive(Debug, Default)] pub struct StreamingDistribution { @@ -1325,6 +1388,11 @@ pub mod distribution { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub realtime_log_config_arn: Option<::Value>, + /// Property [`ResponseHeadersPolicyId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html#cfn-cloudfront-distribution-cachebehavior-responseheaderspolicyid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub response_headers_policy_id: Option<::Value>, /// Property [`SmoothStreaming`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-cachebehavior.html#cfn-cloudfront-distribution-cachebehavior-smoothstreaming). /// /// Update type: _Mutable_. @@ -1395,6 +1463,9 @@ pub mod distribution { if let Some(ref realtime_log_config_arn) = self.realtime_log_config_arn { ::serde::ser::SerializeMap::serialize_entry(&mut map, "RealtimeLogConfigArn", realtime_log_config_arn)?; } + if let Some(ref response_headers_policy_id) = self.response_headers_policy_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResponseHeadersPolicyId", response_headers_policy_id)?; + } if let Some(ref smooth_streaming) = self.smooth_streaming { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SmoothStreaming", smooth_streaming)?; } @@ -1436,6 +1507,7 @@ pub mod distribution { let mut origin_request_policy_id: Option<::Value> = None; let mut path_pattern: Option<::Value> = None; let mut realtime_log_config_arn: Option<::Value> = None; + let mut response_headers_policy_id: Option<::Value> = None; let mut smooth_streaming: Option<::Value> = None; let mut target_origin_id: Option<::Value> = None; let mut trusted_key_groups: Option<::ValueList> = None; @@ -1486,6 +1558,9 @@ pub mod distribution { "RealtimeLogConfigArn" => { realtime_log_config_arn = ::serde::de::MapAccess::next_value(&mut map)?; } + "ResponseHeadersPolicyId" => { + response_headers_policy_id = ::serde::de::MapAccess::next_value(&mut map)?; + } "SmoothStreaming" => { smooth_streaming = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1520,6 +1595,7 @@ pub mod distribution { origin_request_policy_id: origin_request_policy_id, path_pattern: path_pattern.ok_or(::serde::de::Error::missing_field("PathPattern"))?, realtime_log_config_arn: realtime_log_config_arn, + response_headers_policy_id: response_headers_policy_id, smooth_streaming: smooth_streaming, target_origin_id: target_origin_id.ok_or(::serde::de::Error::missing_field("TargetOriginId"))?, trusted_key_groups: trusted_key_groups, @@ -1871,6 +1947,11 @@ pub mod distribution { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub realtime_log_config_arn: Option<::Value>, + /// Property [`ResponseHeadersPolicyId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-defaultcachebehavior.html#cfn-cloudfront-distribution-defaultcachebehavior-responseheaderspolicyid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub response_headers_policy_id: Option<::Value>, /// Property [`SmoothStreaming`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distribution-defaultcachebehavior.html#cfn-cloudfront-distribution-defaultcachebehavior-smoothstreaming). /// /// Update type: _Mutable_. @@ -1940,6 +2021,9 @@ pub mod distribution { if let Some(ref realtime_log_config_arn) = self.realtime_log_config_arn { ::serde::ser::SerializeMap::serialize_entry(&mut map, "RealtimeLogConfigArn", realtime_log_config_arn)?; } + if let Some(ref response_headers_policy_id) = self.response_headers_policy_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResponseHeadersPolicyId", response_headers_policy_id)?; + } if let Some(ref smooth_streaming) = self.smooth_streaming { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SmoothStreaming", smooth_streaming)?; } @@ -1980,6 +2064,7 @@ pub mod distribution { let mut min_ttl: Option<::Value> = None; let mut origin_request_policy_id: Option<::Value> = None; let mut realtime_log_config_arn: Option<::Value> = None; + let mut response_headers_policy_id: Option<::Value> = None; let mut smooth_streaming: Option<::Value> = None; let mut target_origin_id: Option<::Value> = None; let mut trusted_key_groups: Option<::ValueList> = None; @@ -2027,6 +2112,9 @@ pub mod distribution { "RealtimeLogConfigArn" => { realtime_log_config_arn = ::serde::de::MapAccess::next_value(&mut map)?; } + "ResponseHeadersPolicyId" => { + response_headers_policy_id = ::serde::de::MapAccess::next_value(&mut map)?; + } "SmoothStreaming" => { smooth_streaming = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -2060,6 +2148,7 @@ pub mod distribution { min_ttl: min_ttl, origin_request_policy_id: origin_request_policy_id, realtime_log_config_arn: realtime_log_config_arn, + response_headers_policy_id: response_headers_policy_id, smooth_streaming: smooth_streaming, target_origin_id: target_origin_id.ok_or(::serde::de::Error::missing_field("TargetOriginId"))?, trusted_key_groups: trusted_key_groups, @@ -4460,6 +4549,1093 @@ pub mod realtime_log_config { } } +pub mod response_headers_policy { + //! Property types for the `ResponseHeadersPolicy` resource. + + /// The [`AWS::CloudFront::ResponseHeadersPolicy.AccessControlAllowHeaders`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-accesscontrolallowheaders.html) property type. + #[derive(Debug, Default)] + pub struct AccessControlAllowHeaders { + /// Property [`Items`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-accesscontrolallowheaders.html#cfn-cloudfront-responseheaderspolicy-accesscontrolallowheaders-items). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub items: ::ValueList, + } + + impl ::codec::SerializeValue for AccessControlAllowHeaders { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Items", &self.items)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AccessControlAllowHeaders { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AccessControlAllowHeaders; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AccessControlAllowHeaders") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut items: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Items" => { + items = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AccessControlAllowHeaders { + items: items.ok_or(::serde::de::Error::missing_field("Items"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::CloudFront::ResponseHeadersPolicy.AccessControlAllowMethods`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-accesscontrolallowmethods.html) property type. + #[derive(Debug, Default)] + pub struct AccessControlAllowMethods { + /// Property [`Items`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-accesscontrolallowmethods.html#cfn-cloudfront-responseheaderspolicy-accesscontrolallowmethods-items). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub items: ::ValueList, + } + + impl ::codec::SerializeValue for AccessControlAllowMethods { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Items", &self.items)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AccessControlAllowMethods { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AccessControlAllowMethods; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AccessControlAllowMethods") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut items: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Items" => { + items = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AccessControlAllowMethods { + items: items.ok_or(::serde::de::Error::missing_field("Items"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::CloudFront::ResponseHeadersPolicy.AccessControlAllowOrigins`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-accesscontrolalloworigins.html) property type. + #[derive(Debug, Default)] + pub struct AccessControlAllowOrigins { + /// Property [`Items`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-accesscontrolalloworigins.html#cfn-cloudfront-responseheaderspolicy-accesscontrolalloworigins-items). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub items: ::ValueList, + } + + impl ::codec::SerializeValue for AccessControlAllowOrigins { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Items", &self.items)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AccessControlAllowOrigins { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AccessControlAllowOrigins; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AccessControlAllowOrigins") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut items: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Items" => { + items = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AccessControlAllowOrigins { + items: items.ok_or(::serde::de::Error::missing_field("Items"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::CloudFront::ResponseHeadersPolicy.AccessControlExposeHeaders`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-accesscontrolexposeheaders.html) property type. + #[derive(Debug, Default)] + pub struct AccessControlExposeHeaders { + /// Property [`Items`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-accesscontrolexposeheaders.html#cfn-cloudfront-responseheaderspolicy-accesscontrolexposeheaders-items). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub items: ::ValueList, + } + + impl ::codec::SerializeValue for AccessControlExposeHeaders { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Items", &self.items)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AccessControlExposeHeaders { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AccessControlExposeHeaders; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AccessControlExposeHeaders") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut items: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Items" => { + items = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AccessControlExposeHeaders { + items: items.ok_or(::serde::de::Error::missing_field("Items"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::CloudFront::ResponseHeadersPolicy.ContentSecurityPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-contentsecuritypolicy.html) property type. + #[derive(Debug, Default)] + pub struct ContentSecurityPolicy { + /// Property [`ContentSecurityPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-contentsecuritypolicy.html#cfn-cloudfront-responseheaderspolicy-contentsecuritypolicy-contentsecuritypolicy). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub content_security_policy: ::Value, + /// Property [`Override`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-contentsecuritypolicy.html#cfn-cloudfront-responseheaderspolicy-contentsecuritypolicy-override). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#override: ::Value, + } + + impl ::codec::SerializeValue for ContentSecurityPolicy { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ContentSecurityPolicy", &self.content_security_policy)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Override", &self.r#override)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ContentSecurityPolicy { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ContentSecurityPolicy; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ContentSecurityPolicy") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut content_security_policy: Option<::Value> = None; + let mut r#override: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ContentSecurityPolicy" => { + content_security_policy = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Override" => { + r#override = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ContentSecurityPolicy { + content_security_policy: content_security_policy.ok_or(::serde::de::Error::missing_field("ContentSecurityPolicy"))?, + r#override: r#override.ok_or(::serde::de::Error::missing_field("Override"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::CloudFront::ResponseHeadersPolicy.ContentTypeOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-contenttypeoptions.html) property type. + #[derive(Debug, Default)] + pub struct ContentTypeOptions { + /// Property [`Override`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-contenttypeoptions.html#cfn-cloudfront-responseheaderspolicy-contenttypeoptions-override). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#override: ::Value, + } + + impl ::codec::SerializeValue for ContentTypeOptions { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Override", &self.r#override)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ContentTypeOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ContentTypeOptions; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ContentTypeOptions") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut r#override: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Override" => { + r#override = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ContentTypeOptions { + r#override: r#override.ok_or(::serde::de::Error::missing_field("Override"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::CloudFront::ResponseHeadersPolicy.CorsConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-corsconfig.html) property type. + #[derive(Debug, Default)] + pub struct CorsConfig { + /// Property [`AccessControlAllowCredentials`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-corsconfig.html#cfn-cloudfront-responseheaderspolicy-corsconfig-accesscontrolallowcredentials). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub access_control_allow_credentials: ::Value, + /// Property [`AccessControlAllowHeaders`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-corsconfig.html#cfn-cloudfront-responseheaderspolicy-corsconfig-accesscontrolallowheaders). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub access_control_allow_headers: ::Value, + /// Property [`AccessControlAllowMethods`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-corsconfig.html#cfn-cloudfront-responseheaderspolicy-corsconfig-accesscontrolallowmethods). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub access_control_allow_methods: ::Value, + /// Property [`AccessControlAllowOrigins`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-corsconfig.html#cfn-cloudfront-responseheaderspolicy-corsconfig-accesscontrolalloworigins). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub access_control_allow_origins: ::Value, + /// Property [`AccessControlExposeHeaders`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-corsconfig.html#cfn-cloudfront-responseheaderspolicy-corsconfig-accesscontrolexposeheaders). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub access_control_expose_headers: Option<::Value>, + /// Property [`AccessControlMaxAgeSec`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-corsconfig.html#cfn-cloudfront-responseheaderspolicy-corsconfig-accesscontrolmaxagesec). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub access_control_max_age_sec: Option<::Value>, + /// Property [`OriginOverride`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-corsconfig.html#cfn-cloudfront-responseheaderspolicy-corsconfig-originoverride). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub origin_override: ::Value, + } + + impl ::codec::SerializeValue for CorsConfig { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AccessControlAllowCredentials", &self.access_control_allow_credentials)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AccessControlAllowHeaders", &self.access_control_allow_headers)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AccessControlAllowMethods", &self.access_control_allow_methods)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AccessControlAllowOrigins", &self.access_control_allow_origins)?; + if let Some(ref access_control_expose_headers) = self.access_control_expose_headers { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AccessControlExposeHeaders", access_control_expose_headers)?; + } + if let Some(ref access_control_max_age_sec) = self.access_control_max_age_sec { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AccessControlMaxAgeSec", access_control_max_age_sec)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OriginOverride", &self.origin_override)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CorsConfig { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CorsConfig; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CorsConfig") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut access_control_allow_credentials: Option<::Value> = None; + let mut access_control_allow_headers: Option<::Value> = None; + let mut access_control_allow_methods: Option<::Value> = None; + let mut access_control_allow_origins: Option<::Value> = None; + let mut access_control_expose_headers: Option<::Value> = None; + let mut access_control_max_age_sec: Option<::Value> = None; + let mut origin_override: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AccessControlAllowCredentials" => { + access_control_allow_credentials = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AccessControlAllowHeaders" => { + access_control_allow_headers = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AccessControlAllowMethods" => { + access_control_allow_methods = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AccessControlAllowOrigins" => { + access_control_allow_origins = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AccessControlExposeHeaders" => { + access_control_expose_headers = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AccessControlMaxAgeSec" => { + access_control_max_age_sec = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OriginOverride" => { + origin_override = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CorsConfig { + access_control_allow_credentials: access_control_allow_credentials.ok_or(::serde::de::Error::missing_field("AccessControlAllowCredentials"))?, + access_control_allow_headers: access_control_allow_headers.ok_or(::serde::de::Error::missing_field("AccessControlAllowHeaders"))?, + access_control_allow_methods: access_control_allow_methods.ok_or(::serde::de::Error::missing_field("AccessControlAllowMethods"))?, + access_control_allow_origins: access_control_allow_origins.ok_or(::serde::de::Error::missing_field("AccessControlAllowOrigins"))?, + access_control_expose_headers: access_control_expose_headers, + access_control_max_age_sec: access_control_max_age_sec, + origin_override: origin_override.ok_or(::serde::de::Error::missing_field("OriginOverride"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::CloudFront::ResponseHeadersPolicy.CustomHeader`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-customheader.html) property type. + #[derive(Debug, Default)] + pub struct CustomHeader { + /// Property [`Header`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-customheader.html#cfn-cloudfront-responseheaderspolicy-customheader-header). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub header: ::Value, + /// Property [`Override`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-customheader.html#cfn-cloudfront-responseheaderspolicy-customheader-override). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#override: ::Value, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-customheader.html#cfn-cloudfront-responseheaderspolicy-customheader-value). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub value: ::Value, + } + + impl ::codec::SerializeValue for CustomHeader { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Header", &self.header)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Override", &self.r#override)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", &self.value)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CustomHeader { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CustomHeader; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CustomHeader") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut header: Option<::Value> = None; + let mut r#override: Option<::Value> = None; + let mut value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Header" => { + header = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Override" => { + r#override = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CustomHeader { + header: header.ok_or(::serde::de::Error::missing_field("Header"))?, + r#override: r#override.ok_or(::serde::de::Error::missing_field("Override"))?, + value: value.ok_or(::serde::de::Error::missing_field("Value"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::CloudFront::ResponseHeadersPolicy.CustomHeadersConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-customheadersconfig.html) property type. + #[derive(Debug, Default)] + pub struct CustomHeadersConfig { + /// Property [`Items`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-customheadersconfig.html#cfn-cloudfront-responseheaderspolicy-customheadersconfig-items). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub items: ::ValueList, + } + + impl ::codec::SerializeValue for CustomHeadersConfig { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Items", &self.items)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CustomHeadersConfig { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CustomHeadersConfig; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CustomHeadersConfig") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut items: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Items" => { + items = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CustomHeadersConfig { + items: items.ok_or(::serde::de::Error::missing_field("Items"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::CloudFront::ResponseHeadersPolicy.FrameOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-frameoptions.html) property type. + #[derive(Debug, Default)] + pub struct FrameOptions { + /// Property [`FrameOption`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-frameoptions.html#cfn-cloudfront-responseheaderspolicy-frameoptions-frameoption). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub frame_option: ::Value, + /// Property [`Override`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-frameoptions.html#cfn-cloudfront-responseheaderspolicy-frameoptions-override). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#override: ::Value, + } + + impl ::codec::SerializeValue for FrameOptions { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FrameOption", &self.frame_option)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Override", &self.r#override)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for FrameOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = FrameOptions; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type FrameOptions") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut frame_option: Option<::Value> = None; + let mut r#override: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "FrameOption" => { + frame_option = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Override" => { + r#override = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(FrameOptions { + frame_option: frame_option.ok_or(::serde::de::Error::missing_field("FrameOption"))?, + r#override: r#override.ok_or(::serde::de::Error::missing_field("Override"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::CloudFront::ResponseHeadersPolicy.ReferrerPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-referrerpolicy.html) property type. + #[derive(Debug, Default)] + pub struct ReferrerPolicy { + /// Property [`Override`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-referrerpolicy.html#cfn-cloudfront-responseheaderspolicy-referrerpolicy-override). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#override: ::Value, + /// Property [`ReferrerPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-referrerpolicy.html#cfn-cloudfront-responseheaderspolicy-referrerpolicy-referrerpolicy). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub referrer_policy: ::Value, + } + + impl ::codec::SerializeValue for ReferrerPolicy { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Override", &self.r#override)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReferrerPolicy", &self.referrer_policy)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ReferrerPolicy { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ReferrerPolicy; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ReferrerPolicy") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut r#override: Option<::Value> = None; + let mut referrer_policy: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Override" => { + r#override = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ReferrerPolicy" => { + referrer_policy = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ReferrerPolicy { + r#override: r#override.ok_or(::serde::de::Error::missing_field("Override"))?, + referrer_policy: referrer_policy.ok_or(::serde::de::Error::missing_field("ReferrerPolicy"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::CloudFront::ResponseHeadersPolicy.ResponseHeadersPolicyConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-responseheaderspolicyconfig.html) property type. + #[derive(Debug, Default)] + pub struct ResponseHeadersPolicyConfig { + /// Property [`Comment`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-responseheaderspolicyconfig.html#cfn-cloudfront-responseheaderspolicy-responseheaderspolicyconfig-comment). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub comment: Option<::Value>, + /// Property [`CorsConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-responseheaderspolicyconfig.html#cfn-cloudfront-responseheaderspolicy-responseheaderspolicyconfig-corsconfig). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub cors_config: Option<::Value>, + /// Property [`CustomHeadersConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-responseheaderspolicyconfig.html#cfn-cloudfront-responseheaderspolicy-responseheaderspolicyconfig-customheadersconfig). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub custom_headers_config: Option<::Value>, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-responseheaderspolicyconfig.html#cfn-cloudfront-responseheaderspolicy-responseheaderspolicyconfig-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: ::Value, + /// Property [`SecurityHeadersConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-responseheaderspolicyconfig.html#cfn-cloudfront-responseheaderspolicy-responseheaderspolicyconfig-securityheadersconfig). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub security_headers_config: Option<::Value>, + } + + impl ::codec::SerializeValue for ResponseHeadersPolicyConfig { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref comment) = self.comment { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Comment", comment)?; + } + if let Some(ref cors_config) = self.cors_config { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CorsConfig", cors_config)?; + } + if let Some(ref custom_headers_config) = self.custom_headers_config { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CustomHeadersConfig", custom_headers_config)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + if let Some(ref security_headers_config) = self.security_headers_config { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityHeadersConfig", security_headers_config)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ResponseHeadersPolicyConfig { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ResponseHeadersPolicyConfig; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ResponseHeadersPolicyConfig") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut comment: Option<::Value> = None; + let mut cors_config: Option<::Value> = None; + let mut custom_headers_config: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut security_headers_config: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Comment" => { + comment = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CorsConfig" => { + cors_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CustomHeadersConfig" => { + custom_headers_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SecurityHeadersConfig" => { + security_headers_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ResponseHeadersPolicyConfig { + comment: comment, + cors_config: cors_config, + custom_headers_config: custom_headers_config, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + security_headers_config: security_headers_config, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::CloudFront::ResponseHeadersPolicy.SecurityHeadersConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-securityheadersconfig.html) property type. + #[derive(Debug, Default)] + pub struct SecurityHeadersConfig { + /// Property [`ContentSecurityPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-securityheadersconfig.html#cfn-cloudfront-responseheaderspolicy-securityheadersconfig-contentsecuritypolicy). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub content_security_policy: Option<::Value>, + /// Property [`ContentTypeOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-securityheadersconfig.html#cfn-cloudfront-responseheaderspolicy-securityheadersconfig-contenttypeoptions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub content_type_options: Option<::Value>, + /// Property [`FrameOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-securityheadersconfig.html#cfn-cloudfront-responseheaderspolicy-securityheadersconfig-frameoptions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub frame_options: Option<::Value>, + /// Property [`ReferrerPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-securityheadersconfig.html#cfn-cloudfront-responseheaderspolicy-securityheadersconfig-referrerpolicy). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub referrer_policy: Option<::Value>, + /// Property [`StrictTransportSecurity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-securityheadersconfig.html#cfn-cloudfront-responseheaderspolicy-securityheadersconfig-stricttransportsecurity). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub strict_transport_security: Option<::Value>, + /// Property [`XSSProtection`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-securityheadersconfig.html#cfn-cloudfront-responseheaderspolicy-securityheadersconfig-xssprotection). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub xss_protection: Option<::Value>, + } + + impl ::codec::SerializeValue for SecurityHeadersConfig { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref content_security_policy) = self.content_security_policy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ContentSecurityPolicy", content_security_policy)?; + } + if let Some(ref content_type_options) = self.content_type_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ContentTypeOptions", content_type_options)?; + } + if let Some(ref frame_options) = self.frame_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FrameOptions", frame_options)?; + } + if let Some(ref referrer_policy) = self.referrer_policy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReferrerPolicy", referrer_policy)?; + } + if let Some(ref strict_transport_security) = self.strict_transport_security { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "StrictTransportSecurity", strict_transport_security)?; + } + if let Some(ref xss_protection) = self.xss_protection { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "XSSProtection", xss_protection)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for SecurityHeadersConfig { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = SecurityHeadersConfig; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type SecurityHeadersConfig") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut content_security_policy: Option<::Value> = None; + let mut content_type_options: Option<::Value> = None; + let mut frame_options: Option<::Value> = None; + let mut referrer_policy: Option<::Value> = None; + let mut strict_transport_security: Option<::Value> = None; + let mut xss_protection: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ContentSecurityPolicy" => { + content_security_policy = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ContentTypeOptions" => { + content_type_options = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FrameOptions" => { + frame_options = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ReferrerPolicy" => { + referrer_policy = ::serde::de::MapAccess::next_value(&mut map)?; + } + "StrictTransportSecurity" => { + strict_transport_security = ::serde::de::MapAccess::next_value(&mut map)?; + } + "XSSProtection" => { + xss_protection = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(SecurityHeadersConfig { + content_security_policy: content_security_policy, + content_type_options: content_type_options, + frame_options: frame_options, + referrer_policy: referrer_policy, + strict_transport_security: strict_transport_security, + xss_protection: xss_protection, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::CloudFront::ResponseHeadersPolicy.StrictTransportSecurity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-stricttransportsecurity.html) property type. + #[derive(Debug, Default)] + pub struct StrictTransportSecurity { + /// Property [`AccessControlMaxAgeSec`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-stricttransportsecurity.html#cfn-cloudfront-responseheaderspolicy-stricttransportsecurity-accesscontrolmaxagesec). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub access_control_max_age_sec: ::Value, + /// Property [`IncludeSubdomains`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-stricttransportsecurity.html#cfn-cloudfront-responseheaderspolicy-stricttransportsecurity-includesubdomains). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub include_subdomains: Option<::Value>, + /// Property [`Override`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-stricttransportsecurity.html#cfn-cloudfront-responseheaderspolicy-stricttransportsecurity-override). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#override: ::Value, + /// Property [`Preload`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-stricttransportsecurity.html#cfn-cloudfront-responseheaderspolicy-stricttransportsecurity-preload). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub preload: Option<::Value>, + } + + impl ::codec::SerializeValue for StrictTransportSecurity { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AccessControlMaxAgeSec", &self.access_control_max_age_sec)?; + if let Some(ref include_subdomains) = self.include_subdomains { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludeSubdomains", include_subdomains)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Override", &self.r#override)?; + if let Some(ref preload) = self.preload { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Preload", preload)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for StrictTransportSecurity { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = StrictTransportSecurity; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type StrictTransportSecurity") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut access_control_max_age_sec: Option<::Value> = None; + let mut include_subdomains: Option<::Value> = None; + let mut r#override: Option<::Value> = None; + let mut preload: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AccessControlMaxAgeSec" => { + access_control_max_age_sec = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IncludeSubdomains" => { + include_subdomains = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Override" => { + r#override = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Preload" => { + preload = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(StrictTransportSecurity { + access_control_max_age_sec: access_control_max_age_sec.ok_or(::serde::de::Error::missing_field("AccessControlMaxAgeSec"))?, + include_subdomains: include_subdomains, + r#override: r#override.ok_or(::serde::de::Error::missing_field("Override"))?, + preload: preload, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::CloudFront::ResponseHeadersPolicy.XSSProtection`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-xssprotection.html) property type. + #[derive(Debug, Default)] + pub struct XSSProtection { + /// Property [`ModeBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-xssprotection.html#cfn-cloudfront-responseheaderspolicy-xssprotection-modeblock). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub mode_block: Option<::Value>, + /// Property [`Override`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-xssprotection.html#cfn-cloudfront-responseheaderspolicy-xssprotection-override). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#override: ::Value, + /// Property [`Protection`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-xssprotection.html#cfn-cloudfront-responseheaderspolicy-xssprotection-protection). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub protection: ::Value, + /// Property [`ReportUri`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-responseheaderspolicy-xssprotection.html#cfn-cloudfront-responseheaderspolicy-xssprotection-reporturi). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub report_uri: Option<::Value>, + } + + impl ::codec::SerializeValue for XSSProtection { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref mode_block) = self.mode_block { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ModeBlock", mode_block)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Override", &self.r#override)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Protection", &self.protection)?; + if let Some(ref report_uri) = self.report_uri { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReportUri", report_uri)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for XSSProtection { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = XSSProtection; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type XSSProtection") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut mode_block: Option<::Value> = None; + let mut r#override: Option<::Value> = None; + let mut protection: Option<::Value> = None; + let mut report_uri: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ModeBlock" => { + mode_block = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Override" => { + r#override = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Protection" => { + protection = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ReportUri" => { + report_uri = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(XSSProtection { + mode_block: mode_block, + r#override: r#override.ok_or(::serde::de::Error::missing_field("Override"))?, + protection: protection.ok_or(::serde::de::Error::missing_field("Protection"))?, + report_uri: report_uri, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + pub mod streaming_distribution { //! Property types for the `StreamingDistribution` resource. diff --git a/src/aws/cloudtrail.rs b/src/aws/cloudtrail.rs index 1bb8a0e..618f579 100644 --- a/src/aws/cloudtrail.rs +++ b/src/aws/cloudtrail.rs @@ -34,6 +34,11 @@ pub struct TrailProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub include_global_service_events: Option<::Value>, + /// Property [`InsightSelectors`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html#cfn-cloudtrail-trail-insightselectors). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub insight_selectors: Option<::ValueList>, /// Property [`IsLogging`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html#cfn-cloudtrail-trail-islogging). /// /// Update type: _Mutable_. @@ -44,6 +49,11 @@ pub struct TrailProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub is_multi_region_trail: Option<::Value>, + /// Property [`IsOrganizationTrail`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html#cfn-cloudtrail-trail-isorganizationtrail). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub is_organization_trail: Option<::Value>, /// Property [`KMSKeyId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudtrail-trail.html#cfn-cloudtrail-trail-kmskeyid). /// /// Update type: _Mutable_. @@ -94,10 +104,16 @@ impl ::serde::Serialize for TrailProperties { if let Some(ref include_global_service_events) = self.include_global_service_events { ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludeGlobalServiceEvents", include_global_service_events)?; } + if let Some(ref insight_selectors) = self.insight_selectors { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InsightSelectors", insight_selectors)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "IsLogging", &self.is_logging)?; if let Some(ref is_multi_region_trail) = self.is_multi_region_trail { ::serde::ser::SerializeMap::serialize_entry(&mut map, "IsMultiRegionTrail", is_multi_region_trail)?; } + if let Some(ref is_organization_trail) = self.is_organization_trail { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IsOrganizationTrail", is_organization_trail)?; + } if let Some(ref kms_key_id) = self.kms_key_id { ::serde::ser::SerializeMap::serialize_entry(&mut map, "KMSKeyId", kms_key_id)?; } @@ -135,8 +151,10 @@ impl<'de> ::serde::Deserialize<'de> for TrailProperties { let mut enable_log_file_validation: Option<::Value> = None; let mut event_selectors: Option<::ValueList> = None; let mut include_global_service_events: Option<::Value> = None; + let mut insight_selectors: Option<::ValueList> = None; let mut is_logging: Option<::Value> = None; let mut is_multi_region_trail: Option<::Value> = None; + let mut is_organization_trail: Option<::Value> = None; let mut kms_key_id: Option<::Value> = None; let mut s3_bucket_name: Option<::Value> = None; let mut s3_key_prefix: Option<::Value> = None; @@ -161,12 +179,18 @@ impl<'de> ::serde::Deserialize<'de> for TrailProperties { "IncludeGlobalServiceEvents" => { include_global_service_events = ::serde::de::MapAccess::next_value(&mut map)?; } + "InsightSelectors" => { + insight_selectors = ::serde::de::MapAccess::next_value(&mut map)?; + } "IsLogging" => { is_logging = ::serde::de::MapAccess::next_value(&mut map)?; } "IsMultiRegionTrail" => { is_multi_region_trail = ::serde::de::MapAccess::next_value(&mut map)?; } + "IsOrganizationTrail" => { + is_organization_trail = ::serde::de::MapAccess::next_value(&mut map)?; + } "KMSKeyId" => { kms_key_id = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -195,8 +219,10 @@ impl<'de> ::serde::Deserialize<'de> for TrailProperties { enable_log_file_validation: enable_log_file_validation, event_selectors: event_selectors, include_global_service_events: include_global_service_events, + insight_selectors: insight_selectors, is_logging: is_logging.ok_or(::serde::de::Error::missing_field("IsLogging"))?, is_multi_region_trail: is_multi_region_trail, + is_organization_trail: is_organization_trail, kms_key_id: kms_key_id, s3_bucket_name: s3_bucket_name.ok_or(::serde::de::Error::missing_field("S3BucketName"))?, s3_key_prefix: s3_key_prefix, @@ -305,6 +331,11 @@ pub mod trail { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub data_resources: Option<::ValueList>, + /// Property [`ExcludeManagementEventSources`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-eventselector.html#cfn-cloudtrail-trail-eventselector-excludemanagementeventsources). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub exclude_management_event_sources: Option<::ValueList>, /// Property [`IncludeManagementEvents`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-eventselector.html#cfn-cloudtrail-trail-eventselector-includemanagementevents). /// /// Update type: _Mutable_. @@ -323,6 +354,9 @@ pub mod trail { if let Some(ref data_resources) = self.data_resources { ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataResources", data_resources)?; } + if let Some(ref exclude_management_event_sources) = self.exclude_management_event_sources { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExcludeManagementEventSources", exclude_management_event_sources)?; + } if let Some(ref include_management_events) = self.include_management_events { ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludeManagementEvents", include_management_events)?; } @@ -346,6 +380,7 @@ pub mod trail { fn visit_map>(self, mut map: A) -> Result { let mut data_resources: Option<::ValueList> = None; + let mut exclude_management_event_sources: Option<::ValueList> = None; let mut include_management_events: Option<::Value> = None; let mut read_write_type: Option<::Value> = None; @@ -354,6 +389,9 @@ pub mod trail { "DataResources" => { data_resources = ::serde::de::MapAccess::next_value(&mut map)?; } + "ExcludeManagementEventSources" => { + exclude_management_event_sources = ::serde::de::MapAccess::next_value(&mut map)?; + } "IncludeManagementEvents" => { include_management_events = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -366,6 +404,7 @@ pub mod trail { Ok(EventSelector { data_resources: data_resources, + exclude_management_event_sources: exclude_management_event_sources, include_management_events: include_management_events, read_write_type: read_write_type, }) @@ -375,4 +414,57 @@ pub mod trail { d.deserialize_map(Visitor) } } + + /// The [`AWS::CloudTrail::Trail.InsightSelector`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-insightselector.html) property type. + #[derive(Debug, Default)] + pub struct InsightSelector { + /// Property [`InsightType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudtrail-trail-insightselector.html#cfn-cloudtrail-trail-insightselector-insighttype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub insight_type: Option<::Value>, + } + + impl ::codec::SerializeValue for InsightSelector { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref insight_type) = self.insight_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InsightType", insight_type)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for InsightSelector { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = InsightSelector; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type InsightSelector") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut insight_type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "InsightType" => { + insight_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(InsightSelector { + insight_type: insight_type, + }) + } + } + + d.deserialize_map(Visitor) + } + } } diff --git a/src/aws/cloudwatch.rs b/src/aws/cloudwatch.rs index a4f0b37..6459f15 100644 --- a/src/aws/cloudwatch.rs +++ b/src/aws/cloudwatch.rs @@ -353,21 +353,31 @@ pub struct AnomalyDetectorProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub dimensions: Option<::ValueList>, + /// Property [`MetricMathAnomalyDetector`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-metricmathanomalydetector). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub metric_math_anomaly_detector: Option<::Value>, /// Property [`MetricName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-metricname). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub metric_name: ::Value, + pub metric_name: Option<::Value>, /// Property [`Namespace`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-namespace). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub namespace: ::Value, + pub namespace: Option<::Value>, + /// Property [`SingleMetricAnomalyDetector`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-singlemetricanomalydetector). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub single_metric_anomaly_detector: Option<::Value>, /// Property [`Stat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-stat). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub stat: ::Value, + pub stat: Option<::Value>, } impl ::serde::Serialize for AnomalyDetectorProperties { @@ -379,9 +389,21 @@ impl ::serde::Serialize for AnomalyDetectorProperties { if let Some(ref dimensions) = self.dimensions { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Dimensions", dimensions)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "MetricName", &self.metric_name)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Namespace", &self.namespace)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Stat", &self.stat)?; + if let Some(ref metric_math_anomaly_detector) = self.metric_math_anomaly_detector { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MetricMathAnomalyDetector", metric_math_anomaly_detector)?; + } + if let Some(ref metric_name) = self.metric_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MetricName", metric_name)?; + } + if let Some(ref namespace) = self.namespace { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Namespace", namespace)?; + } + if let Some(ref single_metric_anomaly_detector) = self.single_metric_anomaly_detector { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SingleMetricAnomalyDetector", single_metric_anomaly_detector)?; + } + if let Some(ref stat) = self.stat { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Stat", stat)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -400,8 +422,10 @@ impl<'de> ::serde::Deserialize<'de> for AnomalyDetectorProperties { fn visit_map>(self, mut map: A) -> Result { let mut configuration: Option<::Value> = None; let mut dimensions: Option<::ValueList> = None; + let mut metric_math_anomaly_detector: Option<::Value> = None; let mut metric_name: Option<::Value> = None; let mut namespace: Option<::Value> = None; + let mut single_metric_anomaly_detector: Option<::Value> = None; let mut stat: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { @@ -412,12 +436,18 @@ impl<'de> ::serde::Deserialize<'de> for AnomalyDetectorProperties { "Dimensions" => { dimensions = ::serde::de::MapAccess::next_value(&mut map)?; } + "MetricMathAnomalyDetector" => { + metric_math_anomaly_detector = ::serde::de::MapAccess::next_value(&mut map)?; + } "MetricName" => { metric_name = ::serde::de::MapAccess::next_value(&mut map)?; } "Namespace" => { namespace = ::serde::de::MapAccess::next_value(&mut map)?; } + "SingleMetricAnomalyDetector" => { + single_metric_anomaly_detector = ::serde::de::MapAccess::next_value(&mut map)?; + } "Stat" => { stat = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -428,9 +458,11 @@ impl<'de> ::serde::Deserialize<'de> for AnomalyDetectorProperties { Ok(AnomalyDetectorProperties { configuration: configuration, dimensions: dimensions, - metric_name: metric_name.ok_or(::serde::de::Error::missing_field("MetricName"))?, - namespace: namespace.ok_or(::serde::de::Error::missing_field("Namespace"))?, - stat: stat.ok_or(::serde::de::Error::missing_field("Stat"))?, + metric_math_anomaly_detector: metric_math_anomaly_detector, + metric_name: metric_name, + namespace: namespace, + single_metric_anomaly_detector: single_metric_anomaly_detector, + stat: stat, }) } } @@ -1107,6 +1139,11 @@ pub mod alarm { /// The [`AWS::CloudWatch::Alarm.MetricDataQuery`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricdataquery.html) property type. #[derive(Debug, Default)] pub struct MetricDataQuery { + /// Property [`AccountId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricdataquery.html#cfn-cloudwatch-alarm-metricdataquery-accountid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub account_id: Option<::Value>, /// Property [`Expression`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricdataquery.html#cfn-cloudwatch-alarm-metricdataquery-expression). /// /// Update type: _Mutable_. @@ -1142,6 +1179,9 @@ pub mod alarm { impl ::codec::SerializeValue for MetricDataQuery { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref account_id) = self.account_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AccountId", account_id)?; + } if let Some(ref expression) = self.expression { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Expression", expression)?; } @@ -1174,6 +1214,7 @@ pub mod alarm { } fn visit_map>(self, mut map: A) -> Result { + let mut account_id: Option<::Value> = None; let mut expression: Option<::Value> = None; let mut id: Option<::Value> = None; let mut label: Option<::Value> = None; @@ -1183,6 +1224,9 @@ pub mod alarm { while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "AccountId" => { + account_id = ::serde::de::MapAccess::next_value(&mut map)?; + } "Expression" => { expression = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1206,6 +1250,7 @@ pub mod alarm { } Ok(MetricDataQuery { + account_id: account_id, expression: expression, id: id.ok_or(::serde::de::Error::missing_field("Id"))?, label: label, @@ -1438,6 +1483,381 @@ pub mod anomaly_detector { } } + /// The [`AWS::CloudWatch::AnomalyDetector.Metric`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metric.html) property type. + #[derive(Debug, Default)] + pub struct Metric { + /// Property [`Dimensions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metric.html#cfn-cloudwatch-anomalydetector-metric-dimensions). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub dimensions: Option<::ValueList>, + /// Property [`MetricName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metric.html#cfn-cloudwatch-anomalydetector-metric-metricname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub metric_name: ::Value, + /// Property [`Namespace`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metric.html#cfn-cloudwatch-anomalydetector-metric-namespace). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub namespace: ::Value, + } + + impl ::codec::SerializeValue for Metric { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref dimensions) = self.dimensions { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Dimensions", dimensions)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MetricName", &self.metric_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Namespace", &self.namespace)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Metric { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Metric; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Metric") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut dimensions: Option<::ValueList> = None; + let mut metric_name: Option<::Value> = None; + let mut namespace: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Dimensions" => { + dimensions = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MetricName" => { + metric_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Namespace" => { + namespace = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Metric { + dimensions: dimensions, + metric_name: metric_name.ok_or(::serde::de::Error::missing_field("MetricName"))?, + namespace: namespace.ok_or(::serde::de::Error::missing_field("Namespace"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::CloudWatch::AnomalyDetector.MetricDataQueries`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataqueries.html) property type. + #[derive(Debug, Default)] + pub struct MetricDataQueries { + } + + impl ::codec::SerializeValue for MetricDataQueries { + fn serialize(&self, s: S) -> Result { + let map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for MetricDataQueries { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MetricDataQueries; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MetricDataQueries") + } + + fn visit_map>(self, _map: A) -> Result { + Ok(MetricDataQueries {}) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::CloudWatch::AnomalyDetector.MetricDataQuery`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html) property type. + #[derive(Debug, Default)] + pub struct MetricDataQuery { + /// Property [`AccountId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html#cfn-cloudwatch-anomalydetector-metricdataquery-accountid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub account_id: Option<::Value>, + /// Property [`Expression`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html#cfn-cloudwatch-anomalydetector-metricdataquery-expression). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub expression: Option<::Value>, + /// Property [`Id`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html#cfn-cloudwatch-anomalydetector-metricdataquery-id). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub id: ::Value, + /// Property [`Label`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html#cfn-cloudwatch-anomalydetector-metricdataquery-label). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub label: Option<::Value>, + /// Property [`MetricStat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html#cfn-cloudwatch-anomalydetector-metricdataquery-metricstat). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub metric_stat: Option<::Value>, + /// Property [`Period`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html#cfn-cloudwatch-anomalydetector-metricdataquery-period). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub period: Option<::Value>, + /// Property [`ReturnData`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricdataquery.html#cfn-cloudwatch-anomalydetector-metricdataquery-returndata). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub return_data: Option<::Value>, + } + + impl ::codec::SerializeValue for MetricDataQuery { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref account_id) = self.account_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AccountId", account_id)?; + } + if let Some(ref expression) = self.expression { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Expression", expression)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Id", &self.id)?; + if let Some(ref label) = self.label { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Label", label)?; + } + if let Some(ref metric_stat) = self.metric_stat { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MetricStat", metric_stat)?; + } + if let Some(ref period) = self.period { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Period", period)?; + } + if let Some(ref return_data) = self.return_data { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReturnData", return_data)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for MetricDataQuery { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MetricDataQuery; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MetricDataQuery") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut account_id: Option<::Value> = None; + let mut expression: Option<::Value> = None; + let mut id: Option<::Value> = None; + let mut label: Option<::Value> = None; + let mut metric_stat: Option<::Value> = None; + let mut period: Option<::Value> = None; + let mut return_data: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AccountId" => { + account_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Expression" => { + expression = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Id" => { + id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Label" => { + label = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MetricStat" => { + metric_stat = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Period" => { + period = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ReturnData" => { + return_data = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(MetricDataQuery { + account_id: account_id, + expression: expression, + id: id.ok_or(::serde::de::Error::missing_field("Id"))?, + label: label, + metric_stat: metric_stat, + period: period, + return_data: return_data, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::CloudWatch::AnomalyDetector.MetricMathAnomalyDetector`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricmathanomalydetector.html) property type. + #[derive(Debug, Default)] + pub struct MetricMathAnomalyDetector { + /// Property [`MetricDataQueries`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricmathanomalydetector.html#cfn-cloudwatch-anomalydetector-metricmathanomalydetector-metricdataqueries). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub metric_data_queries: Option<::ValueList>, + } + + impl ::codec::SerializeValue for MetricMathAnomalyDetector { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref metric_data_queries) = self.metric_data_queries { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MetricDataQueries", metric_data_queries)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for MetricMathAnomalyDetector { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MetricMathAnomalyDetector; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MetricMathAnomalyDetector") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut metric_data_queries: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "MetricDataQueries" => { + metric_data_queries = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(MetricMathAnomalyDetector { + metric_data_queries: metric_data_queries, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::CloudWatch::AnomalyDetector.MetricStat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricstat.html) property type. + #[derive(Debug, Default)] + pub struct MetricStat { + /// Property [`Metric`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricstat.html#cfn-cloudwatch-anomalydetector-metricstat-metric). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub metric: ::Value, + /// Property [`Period`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricstat.html#cfn-cloudwatch-anomalydetector-metricstat-period). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub period: ::Value, + /// Property [`Stat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricstat.html#cfn-cloudwatch-anomalydetector-metricstat-stat). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub stat: ::Value, + /// Property [`Unit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-metricstat.html#cfn-cloudwatch-anomalydetector-metricstat-unit). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub unit: Option<::Value>, + } + + impl ::codec::SerializeValue for MetricStat { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Metric", &self.metric)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Period", &self.period)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Stat", &self.stat)?; + if let Some(ref unit) = self.unit { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Unit", unit)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for MetricStat { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MetricStat; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MetricStat") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut metric: Option<::Value> = None; + let mut period: Option<::Value> = None; + let mut stat: Option<::Value> = None; + let mut unit: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Metric" => { + metric = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Period" => { + period = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Stat" => { + stat = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Unit" => { + unit = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(MetricStat { + metric: metric.ok_or(::serde::de::Error::missing_field("Metric"))?, + period: period.ok_or(::serde::de::Error::missing_field("Period"))?, + stat: stat.ok_or(::serde::de::Error::missing_field("Stat"))?, + unit: unit, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::CloudWatch::AnomalyDetector.Range`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-range.html) property type. #[derive(Debug, Default)] pub struct Range { @@ -1499,6 +1919,98 @@ pub mod anomaly_detector { d.deserialize_map(Visitor) } } + + /// The [`AWS::CloudWatch::AnomalyDetector.SingleMetricAnomalyDetector`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-singlemetricanomalydetector.html) property type. + #[derive(Debug, Default)] + pub struct SingleMetricAnomalyDetector { + /// Property [`Dimensions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-singlemetricanomalydetector.html#cfn-cloudwatch-anomalydetector-singlemetricanomalydetector-dimensions). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub dimensions: Option<::ValueList>, + /// Property [`MetricName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-singlemetricanomalydetector.html#cfn-cloudwatch-anomalydetector-singlemetricanomalydetector-metricname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub metric_name: Option<::Value>, + /// Property [`Namespace`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-singlemetricanomalydetector.html#cfn-cloudwatch-anomalydetector-singlemetricanomalydetector-namespace). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub namespace: Option<::Value>, + /// Property [`Stat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-anomalydetector-singlemetricanomalydetector.html#cfn-cloudwatch-anomalydetector-singlemetricanomalydetector-stat). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub stat: Option<::Value>, + } + + impl ::codec::SerializeValue for SingleMetricAnomalyDetector { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref dimensions) = self.dimensions { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Dimensions", dimensions)?; + } + if let Some(ref metric_name) = self.metric_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MetricName", metric_name)?; + } + if let Some(ref namespace) = self.namespace { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Namespace", namespace)?; + } + if let Some(ref stat) = self.stat { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Stat", stat)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for SingleMetricAnomalyDetector { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = SingleMetricAnomalyDetector; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type SingleMetricAnomalyDetector") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut dimensions: Option<::ValueList> = None; + let mut metric_name: Option<::Value> = None; + let mut namespace: Option<::Value> = None; + let mut stat: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Dimensions" => { + dimensions = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MetricName" => { + metric_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Namespace" => { + namespace = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Stat" => { + stat = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(SingleMetricAnomalyDetector { + dimensions: dimensions, + metric_name: metric_name, + namespace: namespace, + stat: stat, + }) + } + } + + d.deserialize_map(Visitor) + } + } } pub mod insight_rule { diff --git a/src/aws/codebuild.rs b/src/aws/codebuild.rs index 83d2313..a2991fe 100644 --- a/src/aws/codebuild.rs +++ b/src/aws/codebuild.rs @@ -69,6 +69,11 @@ pub struct ProjectProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub queued_timeout_in_minutes: Option<::Value>, + /// Property [`ResourceAccessRole`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-resourceaccessrole). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub resource_access_role: Option<::Value>, /// Property [`SecondaryArtifacts`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-secondaryartifacts). /// /// Update type: _Mutable_. @@ -114,6 +119,11 @@ pub struct ProjectProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub triggers: Option<::Value>, + /// Property [`Visibility`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-visibility). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub visibility: Option<::Value>, /// Property [`VpcConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codebuild-project.html#cfn-codebuild-project-vpcconfig). /// /// Update type: _Mutable_. @@ -156,6 +166,9 @@ impl ::serde::Serialize for ProjectProperties { if let Some(ref queued_timeout_in_minutes) = self.queued_timeout_in_minutes { ::serde::ser::SerializeMap::serialize_entry(&mut map, "QueuedTimeoutInMinutes", queued_timeout_in_minutes)?; } + if let Some(ref resource_access_role) = self.resource_access_role { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceAccessRole", resource_access_role)?; + } if let Some(ref secondary_artifacts) = self.secondary_artifacts { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecondaryArtifacts", secondary_artifacts)?; } @@ -179,6 +192,9 @@ impl ::serde::Serialize for ProjectProperties { if let Some(ref triggers) = self.triggers { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Triggers", triggers)?; } + if let Some(ref visibility) = self.visibility { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Visibility", visibility)?; + } if let Some(ref vpc_config) = self.vpc_config { ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcConfig", vpc_config)?; } @@ -210,6 +226,7 @@ impl<'de> ::serde::Deserialize<'de> for ProjectProperties { let mut logs_config: Option<::Value> = None; let mut name: Option<::Value> = None; let mut queued_timeout_in_minutes: Option<::Value> = None; + let mut resource_access_role: Option<::Value> = None; let mut secondary_artifacts: Option<::ValueList> = None; let mut secondary_source_versions: Option<::ValueList> = None; let mut secondary_sources: Option<::ValueList> = None; @@ -219,6 +236,7 @@ impl<'de> ::serde::Deserialize<'de> for ProjectProperties { let mut tags: Option<::ValueList<::Tag>> = None; let mut timeout_in_minutes: Option<::Value> = None; let mut triggers: Option<::Value> = None; + let mut visibility: Option<::Value> = None; let mut vpc_config: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { @@ -259,6 +277,9 @@ impl<'de> ::serde::Deserialize<'de> for ProjectProperties { "QueuedTimeoutInMinutes" => { queued_timeout_in_minutes = ::serde::de::MapAccess::next_value(&mut map)?; } + "ResourceAccessRole" => { + resource_access_role = ::serde::de::MapAccess::next_value(&mut map)?; + } "SecondaryArtifacts" => { secondary_artifacts = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -286,6 +307,9 @@ impl<'de> ::serde::Deserialize<'de> for ProjectProperties { "Triggers" => { triggers = ::serde::de::MapAccess::next_value(&mut map)?; } + "Visibility" => { + visibility = ::serde::de::MapAccess::next_value(&mut map)?; + } "VpcConfig" => { vpc_config = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -306,6 +330,7 @@ impl<'de> ::serde::Deserialize<'de> for ProjectProperties { logs_config: logs_config, name: name, queued_timeout_in_minutes: queued_timeout_in_minutes, + resource_access_role: resource_access_role, secondary_artifacts: secondary_artifacts, secondary_source_versions: secondary_source_versions, secondary_sources: secondary_sources, @@ -315,6 +340,7 @@ impl<'de> ::serde::Deserialize<'de> for ProjectProperties { tags: tags, timeout_in_minutes: timeout_in_minutes, triggers: triggers, + visibility: visibility, vpc_config: vpc_config, }) } @@ -1312,6 +1338,11 @@ pub mod project { /// The [`AWS::CodeBuild::Project.ProjectBuildBatchConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projectbuildbatchconfig.html) property type. #[derive(Debug, Default)] pub struct ProjectBuildBatchConfig { + /// Property [`BatchReportMode`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projectbuildbatchconfig.html#cfn-codebuild-project-projectbuildbatchconfig-batchreportmode). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub batch_report_mode: Option<::Value>, /// Property [`CombineArtifacts`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codebuild-project-projectbuildbatchconfig.html#cfn-codebuild-project-projectbuildbatchconfig-combineartifacts). /// /// Update type: _Mutable_. @@ -1337,6 +1368,9 @@ pub mod project { impl ::codec::SerializeValue for ProjectBuildBatchConfig { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref batch_report_mode) = self.batch_report_mode { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BatchReportMode", batch_report_mode)?; + } if let Some(ref combine_artifacts) = self.combine_artifacts { ::serde::ser::SerializeMap::serialize_entry(&mut map, "CombineArtifacts", combine_artifacts)?; } @@ -1365,6 +1399,7 @@ pub mod project { } fn visit_map>(self, mut map: A) -> Result { + let mut batch_report_mode: Option<::Value> = None; let mut combine_artifacts: Option<::Value> = None; let mut restrictions: Option<::Value> = None; let mut service_role: Option<::Value> = None; @@ -1372,6 +1407,9 @@ pub mod project { while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "BatchReportMode" => { + batch_report_mode = ::serde::de::MapAccess::next_value(&mut map)?; + } "CombineArtifacts" => { combine_artifacts = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1389,6 +1427,7 @@ pub mod project { } Ok(ProjectBuildBatchConfig { + batch_report_mode: batch_report_mode, combine_artifacts: combine_artifacts, restrictions: restrictions, service_role: service_role, diff --git a/src/aws/codedeploy.rs b/src/aws/codedeploy.rs index bbda6dd..3ca97e9 100644 --- a/src/aws/codedeploy.rs +++ b/src/aws/codedeploy.rs @@ -305,11 +305,21 @@ pub struct DeploymentGroupProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub on_premises_tag_set: Option<::Value>, + /// Property [`OutdatedInstancesStrategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html#cfn-codedeploy-deploymentgroup-outdatedinstancesstrategy). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub outdated_instances_strategy: Option<::Value>, /// Property [`ServiceRoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html#cfn-codedeploy-deploymentgroup-servicerolearn). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub service_role_arn: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html#cfn-codedeploy-deploymentgroup-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, /// Property [`TriggerConfigurations`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codedeploy-deploymentgroup.html#cfn-codedeploy-deploymentgroup-triggerconfigurations). /// /// Update type: _Mutable_. @@ -363,7 +373,13 @@ impl ::serde::Serialize for DeploymentGroupProperties { if let Some(ref on_premises_tag_set) = self.on_premises_tag_set { ::serde::ser::SerializeMap::serialize_entry(&mut map, "OnPremisesTagSet", on_premises_tag_set)?; } + if let Some(ref outdated_instances_strategy) = self.outdated_instances_strategy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OutdatedInstancesStrategy", outdated_instances_strategy)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServiceRoleArn", &self.service_role_arn)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } if let Some(ref trigger_configurations) = self.trigger_configurations { ::serde::ser::SerializeMap::serialize_entry(&mut map, "TriggerConfigurations", trigger_configurations)?; } @@ -398,7 +414,9 @@ impl<'de> ::serde::Deserialize<'de> for DeploymentGroupProperties { let mut load_balancer_info: Option<::Value> = None; let mut on_premises_instance_tag_filters: Option<::ValueList> = None; let mut on_premises_tag_set: Option<::Value> = None; + let mut outdated_instances_strategy: Option<::Value> = None; let mut service_role_arn: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; let mut trigger_configurations: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { @@ -448,9 +466,15 @@ impl<'de> ::serde::Deserialize<'de> for DeploymentGroupProperties { "OnPremisesTagSet" => { on_premises_tag_set = ::serde::de::MapAccess::next_value(&mut map)?; } + "OutdatedInstancesStrategy" => { + outdated_instances_strategy = ::serde::de::MapAccess::next_value(&mut map)?; + } "ServiceRoleArn" => { service_role_arn = ::serde::de::MapAccess::next_value(&mut map)?; } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } "TriggerConfigurations" => { trigger_configurations = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -474,7 +498,9 @@ impl<'de> ::serde::Deserialize<'de> for DeploymentGroupProperties { load_balancer_info: load_balancer_info, on_premises_instance_tag_filters: on_premises_instance_tag_filters, on_premises_tag_set: on_premises_tag_set, + outdated_instances_strategy: outdated_instances_strategy, service_role_arn: service_role_arn.ok_or(::serde::de::Error::missing_field("ServiceRoleArn"))?, + tags: tags, trigger_configurations: trigger_configurations, }) } @@ -1753,6 +1779,11 @@ pub mod deployment_group { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub target_group_info_list: Option<::ValueList>, + /// Property [`TargetGroupPairInfoList`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-loadbalancerinfo.html#cfn-codedeploy-deploymentgroup-loadbalancerinfo-targetgrouppairinfolist). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub target_group_pair_info_list: Option<::ValueList>, } impl ::codec::SerializeValue for LoadBalancerInfo { @@ -1764,6 +1795,9 @@ pub mod deployment_group { if let Some(ref target_group_info_list) = self.target_group_info_list { ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetGroupInfoList", target_group_info_list)?; } + if let Some(ref target_group_pair_info_list) = self.target_group_pair_info_list { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetGroupPairInfoList", target_group_pair_info_list)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -1782,6 +1816,7 @@ pub mod deployment_group { fn visit_map>(self, mut map: A) -> Result { let mut elb_info_list: Option<::ValueList> = None; let mut target_group_info_list: Option<::ValueList> = None; + let mut target_group_pair_info_list: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { @@ -1791,6 +1826,9 @@ pub mod deployment_group { "TargetGroupInfoList" => { target_group_info_list = ::serde::de::MapAccess::next_value(&mut map)?; } + "TargetGroupPairInfoList" => { + target_group_pair_info_list = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } @@ -1798,6 +1836,7 @@ pub mod deployment_group { Ok(LoadBalancerInfo { elb_info_list: elb_info_list, target_group_info_list: target_group_info_list, + target_group_pair_info_list: target_group_pair_info_list, }) } } @@ -2224,6 +2263,138 @@ pub mod deployment_group { } } + /// The [`AWS::CodeDeploy::DeploymentGroup.TargetGroupPairInfo`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-targetgrouppairinfo.html) property type. + #[derive(Debug, Default)] + pub struct TargetGroupPairInfo { + /// Property [`ProdTrafficRoute`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-targetgrouppairinfo.html#cfn-codedeploy-deploymentgroup-targetgrouppairinfo-prodtrafficroute). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub prod_traffic_route: Option<::Value>, + /// Property [`TargetGroups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-targetgrouppairinfo.html#cfn-codedeploy-deploymentgroup-targetgrouppairinfo-targetgroups). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub target_groups: Option<::ValueList>, + /// Property [`TestTrafficRoute`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-targetgrouppairinfo.html#cfn-codedeploy-deploymentgroup-targetgrouppairinfo-testtrafficroute). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub test_traffic_route: Option<::Value>, + } + + impl ::codec::SerializeValue for TargetGroupPairInfo { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref prod_traffic_route) = self.prod_traffic_route { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ProdTrafficRoute", prod_traffic_route)?; + } + if let Some(ref target_groups) = self.target_groups { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetGroups", target_groups)?; + } + if let Some(ref test_traffic_route) = self.test_traffic_route { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TestTrafficRoute", test_traffic_route)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for TargetGroupPairInfo { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = TargetGroupPairInfo; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type TargetGroupPairInfo") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut prod_traffic_route: Option<::Value> = None; + let mut target_groups: Option<::ValueList> = None; + let mut test_traffic_route: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ProdTrafficRoute" => { + prod_traffic_route = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TargetGroups" => { + target_groups = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TestTrafficRoute" => { + test_traffic_route = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(TargetGroupPairInfo { + prod_traffic_route: prod_traffic_route, + target_groups: target_groups, + test_traffic_route: test_traffic_route, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::CodeDeploy::DeploymentGroup.TrafficRoute`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-trafficroute.html) property type. + #[derive(Debug, Default)] + pub struct TrafficRoute { + /// Property [`ListenerArns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-trafficroute.html#cfn-codedeploy-deploymentgroup-trafficroute-listenerarns). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub listener_arns: Option<::ValueList>, + } + + impl ::codec::SerializeValue for TrafficRoute { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref listener_arns) = self.listener_arns { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ListenerArns", listener_arns)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for TrafficRoute { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = TrafficRoute; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type TrafficRoute") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut listener_arns: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ListenerArns" => { + listener_arns = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(TrafficRoute { + listener_arns: listener_arns, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::CodeDeploy::DeploymentGroup.TriggerConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codedeploy-deploymentgroup-triggerconfig.html) property type. #[derive(Debug, Default)] pub struct TriggerConfig { diff --git a/src/aws/codestarnotifications.rs b/src/aws/codestarnotifications.rs index e7e97bc..46c3c06 100644 --- a/src/aws/codestarnotifications.rs +++ b/src/aws/codestarnotifications.rs @@ -9,11 +9,21 @@ pub struct NotificationRule { /// Properties for the `NotificationRule` resource. #[derive(Debug, Default)] pub struct NotificationRuleProperties { + /// Property [`CreatedBy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestarnotifications-notificationrule.html#cfn-codestarnotifications-notificationrule-createdby). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub created_by: Option<::Value>, /// Property [`DetailType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestarnotifications-notificationrule.html#cfn-codestarnotifications-notificationrule-detailtype). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub detail_type: ::Value, + /// Property [`EventTypeId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestarnotifications-notificationrule.html#cfn-codestarnotifications-notificationrule-eventtypeid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub event_type_id: Option<::Value>, /// Property [`EventTypeIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestarnotifications-notificationrule.html#cfn-codestarnotifications-notificationrule-eventtypeids). /// /// Update type: _Mutable_. @@ -39,6 +49,11 @@ pub struct NotificationRuleProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub tags: Option<::Value<::json::Value>>, + /// Property [`TargetAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestarnotifications-notificationrule.html#cfn-codestarnotifications-notificationrule-targetaddress). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub target_address: Option<::Value>, /// Property [`Targets`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codestarnotifications-notificationrule.html#cfn-codestarnotifications-notificationrule-targets). /// /// Update type: _Mutable_. @@ -49,7 +64,13 @@ pub struct NotificationRuleProperties { impl ::serde::Serialize for NotificationRuleProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref created_by) = self.created_by { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CreatedBy", created_by)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "DetailType", &self.detail_type)?; + if let Some(ref event_type_id) = self.event_type_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EventTypeId", event_type_id)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "EventTypeIds", &self.event_type_ids)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "Resource", &self.resource)?; @@ -59,6 +80,9 @@ impl ::serde::Serialize for NotificationRuleProperties { if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } + if let Some(ref target_address) = self.target_address { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetAddress", target_address)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "Targets", &self.targets)?; ::serde::ser::SerializeMap::end(map) } @@ -76,19 +100,28 @@ impl<'de> ::serde::Deserialize<'de> for NotificationRuleProperties { } fn visit_map>(self, mut map: A) -> Result { + let mut created_by: Option<::Value> = None; let mut detail_type: Option<::Value> = None; + let mut event_type_id: Option<::Value> = None; let mut event_type_ids: Option<::ValueList> = None; let mut name: Option<::Value> = None; let mut resource: Option<::Value> = None; let mut status: Option<::Value> = None; let mut tags: Option<::Value<::json::Value>> = None; + let mut target_address: Option<::Value> = None; let mut targets: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "CreatedBy" => { + created_by = ::serde::de::MapAccess::next_value(&mut map)?; + } "DetailType" => { detail_type = ::serde::de::MapAccess::next_value(&mut map)?; } + "EventTypeId" => { + event_type_id = ::serde::de::MapAccess::next_value(&mut map)?; + } "EventTypeIds" => { event_type_ids = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -104,6 +137,9 @@ impl<'de> ::serde::Deserialize<'de> for NotificationRuleProperties { "Tags" => { tags = ::serde::de::MapAccess::next_value(&mut map)?; } + "TargetAddress" => { + target_address = ::serde::de::MapAccess::next_value(&mut map)?; + } "Targets" => { targets = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -112,12 +148,15 @@ impl<'de> ::serde::Deserialize<'de> for NotificationRuleProperties { } Ok(NotificationRuleProperties { + created_by: created_by, detail_type: detail_type.ok_or(::serde::de::Error::missing_field("DetailType"))?, + event_type_id: event_type_id, event_type_ids: event_type_ids.ok_or(::serde::de::Error::missing_field("EventTypeIds"))?, name: name.ok_or(::serde::de::Error::missing_field("Name"))?, resource: resource.ok_or(::serde::de::Error::missing_field("Resource"))?, status: status, tags: tags, + target_address: target_address, targets: targets.ok_or(::serde::de::Error::missing_field("Targets"))?, }) } @@ -156,23 +195,19 @@ pub mod notification_rule { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub target_address: Option<::Value>, + pub target_address: ::Value, /// Property [`TargetType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codestarnotifications-notificationrule-target.html#cfn-codestarnotifications-notificationrule-target-targettype). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub target_type: Option<::Value>, + pub target_type: ::Value, } impl ::codec::SerializeValue for Target { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref target_address) = self.target_address { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetAddress", target_address)?; - } - if let Some(ref target_type) = self.target_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetType", target_type)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetAddress", &self.target_address)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetType", &self.target_type)?; ::serde::ser::SerializeMap::end(map) } } @@ -205,8 +240,8 @@ pub mod notification_rule { } Ok(Target { - target_address: target_address, - target_type: target_type, + target_address: target_address.ok_or(::serde::de::Error::missing_field("TargetAddress"))?, + target_type: target_type.ok_or(::serde::de::Error::missing_field("TargetType"))?, }) } } diff --git a/src/aws/cognito.rs b/src/aws/cognito.rs index ec2c55c..8258865 100644 --- a/src/aws/cognito.rs +++ b/src/aws/cognito.rs @@ -3579,6 +3579,11 @@ pub mod user_pool { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub sns_caller_arn: Option<::Value>, + /// Property [`SnsRegion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cognito-userpool-smsconfiguration.html#cfn-cognito-userpool-smsconfiguration-snsregion). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub sns_region: Option<::Value>, } impl ::codec::SerializeValue for SmsConfiguration { @@ -3590,6 +3595,9 @@ pub mod user_pool { if let Some(ref sns_caller_arn) = self.sns_caller_arn { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SnsCallerArn", sns_caller_arn)?; } + if let Some(ref sns_region) = self.sns_region { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SnsRegion", sns_region)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -3608,6 +3616,7 @@ pub mod user_pool { fn visit_map>(self, mut map: A) -> Result { let mut external_id: Option<::Value> = None; let mut sns_caller_arn: Option<::Value> = None; + let mut sns_region: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { @@ -3617,6 +3626,9 @@ pub mod user_pool { "SnsCallerArn" => { sns_caller_arn = ::serde::de::MapAccess::next_value(&mut map)?; } + "SnsRegion" => { + sns_region = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } @@ -3624,6 +3636,7 @@ pub mod user_pool { Ok(SmsConfiguration { external_id: external_id, sns_caller_arn: sns_caller_arn, + sns_region: sns_region, }) } } diff --git a/src/aws/config.rs b/src/aws/config.rs index 6731d8d..d9a3994 100644 --- a/src/aws/config.rs +++ b/src/aws/config.rs @@ -761,6 +761,11 @@ pub struct OrganizationConfigRuleProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub organization_config_rule_name: ::Value, + /// Property [`OrganizationCustomCodeRuleMetadata`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-organizationconfigrule.html#cfn-config-organizationconfigrule-organizationcustomcoderulemetadata). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub organization_custom_code_rule_metadata: Option<::Value>, /// Property [`OrganizationCustomRuleMetadata`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-config-organizationconfigrule.html#cfn-config-organizationconfigrule-organizationcustomrulemetadata). /// /// Update type: _Mutable_. @@ -780,6 +785,9 @@ impl ::serde::Serialize for OrganizationConfigRuleProperties { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExcludedAccounts", excluded_accounts)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "OrganizationConfigRuleName", &self.organization_config_rule_name)?; + if let Some(ref organization_custom_code_rule_metadata) = self.organization_custom_code_rule_metadata { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OrganizationCustomCodeRuleMetadata", organization_custom_code_rule_metadata)?; + } if let Some(ref organization_custom_rule_metadata) = self.organization_custom_rule_metadata { ::serde::ser::SerializeMap::serialize_entry(&mut map, "OrganizationCustomRuleMetadata", organization_custom_rule_metadata)?; } @@ -804,6 +812,7 @@ impl<'de> ::serde::Deserialize<'de> for OrganizationConfigRuleProperties { fn visit_map>(self, mut map: A) -> Result { let mut excluded_accounts: Option<::ValueList> = None; let mut organization_config_rule_name: Option<::Value> = None; + let mut organization_custom_code_rule_metadata: Option<::Value> = None; let mut organization_custom_rule_metadata: Option<::Value> = None; let mut organization_managed_rule_metadata: Option<::Value> = None; @@ -815,6 +824,9 @@ impl<'de> ::serde::Deserialize<'de> for OrganizationConfigRuleProperties { "OrganizationConfigRuleName" => { organization_config_rule_name = ::serde::de::MapAccess::next_value(&mut map)?; } + "OrganizationCustomCodeRuleMetadata" => { + organization_custom_code_rule_metadata = ::serde::de::MapAccess::next_value(&mut map)?; + } "OrganizationCustomRuleMetadata" => { organization_custom_rule_metadata = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -828,6 +840,7 @@ impl<'de> ::serde::Deserialize<'de> for OrganizationConfigRuleProperties { Ok(OrganizationConfigRuleProperties { excluded_accounts: excluded_accounts, organization_config_rule_name: organization_config_rule_name.ok_or(::serde::de::Error::missing_field("OrganizationConfigRuleName"))?, + organization_custom_code_rule_metadata: organization_custom_code_rule_metadata, organization_custom_rule_metadata: organization_custom_rule_metadata, organization_managed_rule_metadata: organization_managed_rule_metadata, }) @@ -1926,6 +1939,185 @@ pub mod delivery_channel { pub mod organization_config_rule { //! Property types for the `OrganizationConfigRule` resource. + /// The [`AWS::Config::OrganizationConfigRule.OrganizationCustomCodeRuleMetadata`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustomcoderulemetadata.html) property type. + #[derive(Debug, Default)] + pub struct OrganizationCustomCodeRuleMetadata { + /// Property [`CodeText`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustomcoderulemetadata.html#cfn-config-organizationconfigrule-organizationcustomcoderulemetadata-codetext). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub code_text: ::Value, + /// Property [`DebugLogDeliveryAccounts`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustomcoderulemetadata.html#cfn-config-organizationconfigrule-organizationcustomcoderulemetadata-debuglogdeliveryaccounts). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub debug_log_delivery_accounts: Option<::ValueList>, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustomcoderulemetadata.html#cfn-config-organizationconfigrule-organizationcustomcoderulemetadata-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`InputParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustomcoderulemetadata.html#cfn-config-organizationconfigrule-organizationcustomcoderulemetadata-inputparameters). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub input_parameters: Option<::Value>, + /// Property [`MaximumExecutionFrequency`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustomcoderulemetadata.html#cfn-config-organizationconfigrule-organizationcustomcoderulemetadata-maximumexecutionfrequency). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub maximum_execution_frequency: Option<::Value>, + /// Property [`OrganizationConfigRuleTriggerTypes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustomcoderulemetadata.html#cfn-config-organizationconfigrule-organizationcustomcoderulemetadata-organizationconfigruletriggertypes). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub organization_config_rule_trigger_types: Option<::ValueList>, + /// Property [`ResourceIdScope`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustomcoderulemetadata.html#cfn-config-organizationconfigrule-organizationcustomcoderulemetadata-resourceidscope). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub resource_id_scope: Option<::Value>, + /// Property [`ResourceTypesScope`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustomcoderulemetadata.html#cfn-config-organizationconfigrule-organizationcustomcoderulemetadata-resourcetypesscope). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub resource_types_scope: Option<::ValueList>, + /// Property [`Runtime`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustomcoderulemetadata.html#cfn-config-organizationconfigrule-organizationcustomcoderulemetadata-runtime). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub runtime: ::Value, + /// Property [`TagKeyScope`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustomcoderulemetadata.html#cfn-config-organizationconfigrule-organizationcustomcoderulemetadata-tagkeyscope). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tag_key_scope: Option<::Value>, + /// Property [`TagValueScope`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustomcoderulemetadata.html#cfn-config-organizationconfigrule-organizationcustomcoderulemetadata-tagvaluescope). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tag_value_scope: Option<::Value>, + } + + impl ::codec::SerializeValue for OrganizationCustomCodeRuleMetadata { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CodeText", &self.code_text)?; + if let Some(ref debug_log_delivery_accounts) = self.debug_log_delivery_accounts { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DebugLogDeliveryAccounts", debug_log_delivery_accounts)?; + } + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + if let Some(ref input_parameters) = self.input_parameters { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InputParameters", input_parameters)?; + } + if let Some(ref maximum_execution_frequency) = self.maximum_execution_frequency { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaximumExecutionFrequency", maximum_execution_frequency)?; + } + if let Some(ref organization_config_rule_trigger_types) = self.organization_config_rule_trigger_types { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OrganizationConfigRuleTriggerTypes", organization_config_rule_trigger_types)?; + } + if let Some(ref resource_id_scope) = self.resource_id_scope { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceIdScope", resource_id_scope)?; + } + if let Some(ref resource_types_scope) = self.resource_types_scope { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceTypesScope", resource_types_scope)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Runtime", &self.runtime)?; + if let Some(ref tag_key_scope) = self.tag_key_scope { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TagKeyScope", tag_key_scope)?; + } + if let Some(ref tag_value_scope) = self.tag_value_scope { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TagValueScope", tag_value_scope)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for OrganizationCustomCodeRuleMetadata { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = OrganizationCustomCodeRuleMetadata; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type OrganizationCustomCodeRuleMetadata") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut code_text: Option<::Value> = None; + let mut debug_log_delivery_accounts: Option<::ValueList> = None; + let mut description: Option<::Value> = None; + let mut input_parameters: Option<::Value> = None; + let mut maximum_execution_frequency: Option<::Value> = None; + let mut organization_config_rule_trigger_types: Option<::ValueList> = None; + let mut resource_id_scope: Option<::Value> = None; + let mut resource_types_scope: Option<::ValueList> = None; + let mut runtime: Option<::Value> = None; + let mut tag_key_scope: Option<::Value> = None; + let mut tag_value_scope: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CodeText" => { + code_text = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DebugLogDeliveryAccounts" => { + debug_log_delivery_accounts = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InputParameters" => { + input_parameters = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MaximumExecutionFrequency" => { + maximum_execution_frequency = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OrganizationConfigRuleTriggerTypes" => { + organization_config_rule_trigger_types = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ResourceIdScope" => { + resource_id_scope = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ResourceTypesScope" => { + resource_types_scope = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Runtime" => { + runtime = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TagKeyScope" => { + tag_key_scope = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TagValueScope" => { + tag_value_scope = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(OrganizationCustomCodeRuleMetadata { + code_text: code_text.ok_or(::serde::de::Error::missing_field("CodeText"))?, + debug_log_delivery_accounts: debug_log_delivery_accounts, + description: description, + input_parameters: input_parameters, + maximum_execution_frequency: maximum_execution_frequency, + organization_config_rule_trigger_types: organization_config_rule_trigger_types, + resource_id_scope: resource_id_scope, + resource_types_scope: resource_types_scope, + runtime: runtime.ok_or(::serde::de::Error::missing_field("Runtime"))?, + tag_key_scope: tag_key_scope, + tag_value_scope: tag_value_scope, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::Config::OrganizationConfigRule.OrganizationCustomRuleMetadata`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-config-organizationconfigrule-organizationcustomrulemetadata.html) property type. #[derive(Debug, Default)] pub struct OrganizationCustomRuleMetadata { diff --git a/src/aws/connect.rs b/src/aws/connect.rs index 071895b..9b50d60 100644 --- a/src/aws/connect.rs +++ b/src/aws/connect.rs @@ -1,102 +1,809 @@ //! Types for the `Connect` service. +/// The [`AWS::Connect::ContactFlow`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflow.html) resource type. +#[derive(Debug, Default)] +pub struct ContactFlow { + properties: ContactFlowProperties +} + +/// Properties for the `ContactFlow` resource. +#[derive(Debug, Default)] +pub struct ContactFlowProperties { + /// Property [`Content`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflow.html#cfn-connect-contactflow-content). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub content: ::Value, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflow.html#cfn-connect-contactflow-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`InstanceArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflow.html#cfn-connect-contactflow-instancearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub instance_arn: ::Value, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflow.html#cfn-connect-contactflow-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: ::Value, + /// Property [`State`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflow.html#cfn-connect-contactflow-state). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub state: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflow.html#cfn-connect-contactflow-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflow.html#cfn-connect-contactflow-type). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub r#type: Option<::Value>, +} + +impl ::serde::Serialize for ContactFlowProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Content", &self.content)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceArn", &self.instance_arn)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + if let Some(ref state) = self.state { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "State", state)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + if let Some(ref r#type) = self.r#type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", r#type)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for ContactFlowProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ContactFlowProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ContactFlowProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut content: Option<::Value> = None; + let mut description: Option<::Value> = None; + let mut instance_arn: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut state: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut r#type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Content" => { + content = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceArn" => { + instance_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "State" => { + state = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ContactFlowProperties { + content: content.ok_or(::serde::de::Error::missing_field("Content"))?, + description: description, + instance_arn: instance_arn.ok_or(::serde::de::Error::missing_field("InstanceArn"))?, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + state: state, + tags: tags, + r#type: r#type, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for ContactFlow { + type Properties = ContactFlowProperties; + const TYPE: &'static str = "AWS::Connect::ContactFlow"; + fn properties(&self) -> &ContactFlowProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut ContactFlowProperties { + &mut self.properties + } +} + +impl ::private::Sealed for ContactFlow {} + +impl From for ContactFlow { + fn from(properties: ContactFlowProperties) -> ContactFlow { + ContactFlow { properties } + } +} + +/// The [`AWS::Connect::ContactFlowModule`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflowmodule.html) resource type. +#[derive(Debug, Default)] +pub struct ContactFlowModule { + properties: ContactFlowModuleProperties +} + +/// Properties for the `ContactFlowModule` resource. +#[derive(Debug, Default)] +pub struct ContactFlowModuleProperties { + /// Property [`Content`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflowmodule.html#cfn-connect-contactflowmodule-content). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub content: ::Value, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflowmodule.html#cfn-connect-contactflowmodule-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`InstanceArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflowmodule.html#cfn-connect-contactflowmodule-instancearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub instance_arn: ::Value, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflowmodule.html#cfn-connect-contactflowmodule-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: ::Value, + /// Property [`State`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflowmodule.html#cfn-connect-contactflowmodule-state). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub state: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-contactflowmodule.html#cfn-connect-contactflowmodule-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, +} + +impl ::serde::Serialize for ContactFlowModuleProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Content", &self.content)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceArn", &self.instance_arn)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + if let Some(ref state) = self.state { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "State", state)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for ContactFlowModuleProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ContactFlowModuleProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ContactFlowModuleProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut content: Option<::Value> = None; + let mut description: Option<::Value> = None; + let mut instance_arn: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut state: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Content" => { + content = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceArn" => { + instance_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "State" => { + state = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ContactFlowModuleProperties { + content: content.ok_or(::serde::de::Error::missing_field("Content"))?, + description: description, + instance_arn: instance_arn.ok_or(::serde::de::Error::missing_field("InstanceArn"))?, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + state: state, + tags: tags, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for ContactFlowModule { + type Properties = ContactFlowModuleProperties; + const TYPE: &'static str = "AWS::Connect::ContactFlowModule"; + fn properties(&self) -> &ContactFlowModuleProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut ContactFlowModuleProperties { + &mut self.properties + } +} + +impl ::private::Sealed for ContactFlowModule {} + +impl From for ContactFlowModule { + fn from(properties: ContactFlowModuleProperties) -> ContactFlowModule { + ContactFlowModule { properties } + } +} + +/// The [`AWS::Connect::HoursOfOperation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-hoursofoperation.html) resource type. +#[derive(Debug, Default)] +pub struct HoursOfOperation { + properties: HoursOfOperationProperties +} + +/// Properties for the `HoursOfOperation` resource. +#[derive(Debug, Default)] +pub struct HoursOfOperationProperties { + /// Property [`Config`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-hoursofoperation.html#cfn-connect-hoursofoperation-config). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub config: ::ValueList, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-hoursofoperation.html#cfn-connect-hoursofoperation-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`InstanceArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-hoursofoperation.html#cfn-connect-hoursofoperation-instancearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub instance_arn: ::Value, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-hoursofoperation.html#cfn-connect-hoursofoperation-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-hoursofoperation.html#cfn-connect-hoursofoperation-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`TimeZone`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-hoursofoperation.html#cfn-connect-hoursofoperation-timezone). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub time_zone: ::Value, +} + +impl ::serde::Serialize for HoursOfOperationProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Config", &self.config)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceArn", &self.instance_arn)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TimeZone", &self.time_zone)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for HoursOfOperationProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = HoursOfOperationProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type HoursOfOperationProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut config: Option<::ValueList> = None; + let mut description: Option<::Value> = None; + let mut instance_arn: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut time_zone: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Config" => { + config = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceArn" => { + instance_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TimeZone" => { + time_zone = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(HoursOfOperationProperties { + config: config.ok_or(::serde::de::Error::missing_field("Config"))?, + description: description, + instance_arn: instance_arn.ok_or(::serde::de::Error::missing_field("InstanceArn"))?, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + tags: tags, + time_zone: time_zone.ok_or(::serde::de::Error::missing_field("TimeZone"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for HoursOfOperation { + type Properties = HoursOfOperationProperties; + const TYPE: &'static str = "AWS::Connect::HoursOfOperation"; + fn properties(&self) -> &HoursOfOperationProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut HoursOfOperationProperties { + &mut self.properties + } +} + +impl ::private::Sealed for HoursOfOperation {} + +impl From for HoursOfOperation { + fn from(properties: HoursOfOperationProperties) -> HoursOfOperation { + HoursOfOperation { properties } + } +} + /// The [`AWS::Connect::QuickConnect`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-quickconnect.html) resource type. #[derive(Debug, Default)] -pub struct QuickConnect { - properties: QuickConnectProperties +pub struct QuickConnect { + properties: QuickConnectProperties +} + +/// Properties for the `QuickConnect` resource. +#[derive(Debug, Default)] +pub struct QuickConnectProperties { + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-quickconnect.html#cfn-connect-quickconnect-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`InstanceArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-quickconnect.html#cfn-connect-quickconnect-instancearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub instance_arn: ::Value, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-quickconnect.html#cfn-connect-quickconnect-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: ::Value, + /// Property [`QuickConnectConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-quickconnect.html#cfn-connect-quickconnect-quickconnectconfig). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub quick_connect_config: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-quickconnect.html#cfn-connect-quickconnect-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, +} + +impl ::serde::Serialize for QuickConnectProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceArn", &self.instance_arn)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "QuickConnectConfig", &self.quick_connect_config)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for QuickConnectProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = QuickConnectProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type QuickConnectProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut description: Option<::Value> = None; + let mut instance_arn: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut quick_connect_config: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceArn" => { + instance_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "QuickConnectConfig" => { + quick_connect_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(QuickConnectProperties { + description: description, + instance_arn: instance_arn.ok_or(::serde::de::Error::missing_field("InstanceArn"))?, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + quick_connect_config: quick_connect_config.ok_or(::serde::de::Error::missing_field("QuickConnectConfig"))?, + tags: tags, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for QuickConnect { + type Properties = QuickConnectProperties; + const TYPE: &'static str = "AWS::Connect::QuickConnect"; + fn properties(&self) -> &QuickConnectProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut QuickConnectProperties { + &mut self.properties + } +} + +impl ::private::Sealed for QuickConnect {} + +impl From for QuickConnect { + fn from(properties: QuickConnectProperties) -> QuickConnect { + QuickConnect { properties } + } +} + +/// The [`AWS::Connect::User`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-user.html) resource type. +#[derive(Debug, Default)] +pub struct User { + properties: UserProperties +} + +/// Properties for the `User` resource. +#[derive(Debug, Default)] +pub struct UserProperties { + /// Property [`DirectoryUserId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-user.html#cfn-connect-user-directoryuserid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub directory_user_id: Option<::Value>, + /// Property [`HierarchyGroupArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-user.html#cfn-connect-user-hierarchygrouparn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub hierarchy_group_arn: Option<::Value>, + /// Property [`IdentityInfo`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-user.html#cfn-connect-user-identityinfo). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub identity_info: Option<::Value>, + /// Property [`InstanceArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-user.html#cfn-connect-user-instancearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub instance_arn: ::Value, + /// Property [`Password`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-user.html#cfn-connect-user-password). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub password: Option<::Value>, + /// Property [`PhoneConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-user.html#cfn-connect-user-phoneconfig). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub phone_config: ::Value, + /// Property [`RoutingProfileArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-user.html#cfn-connect-user-routingprofilearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub routing_profile_arn: ::Value, + /// Property [`SecurityProfileArns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-user.html#cfn-connect-user-securityprofilearns). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub security_profile_arns: ::ValueList, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-user.html#cfn-connect-user-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`Username`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-user.html#cfn-connect-user-username). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub username: ::Value, +} + +impl ::serde::Serialize for UserProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref directory_user_id) = self.directory_user_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DirectoryUserId", directory_user_id)?; + } + if let Some(ref hierarchy_group_arn) = self.hierarchy_group_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HierarchyGroupArn", hierarchy_group_arn)?; + } + if let Some(ref identity_info) = self.identity_info { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IdentityInfo", identity_info)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceArn", &self.instance_arn)?; + if let Some(ref password) = self.password { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Password", password)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PhoneConfig", &self.phone_config)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RoutingProfileArn", &self.routing_profile_arn)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityProfileArns", &self.security_profile_arns)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Username", &self.username)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for UserProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = UserProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type UserProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut directory_user_id: Option<::Value> = None; + let mut hierarchy_group_arn: Option<::Value> = None; + let mut identity_info: Option<::Value> = None; + let mut instance_arn: Option<::Value> = None; + let mut password: Option<::Value> = None; + let mut phone_config: Option<::Value> = None; + let mut routing_profile_arn: Option<::Value> = None; + let mut security_profile_arns: Option<::ValueList> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut username: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DirectoryUserId" => { + directory_user_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HierarchyGroupArn" => { + hierarchy_group_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IdentityInfo" => { + identity_info = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceArn" => { + instance_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Password" => { + password = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PhoneConfig" => { + phone_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RoutingProfileArn" => { + routing_profile_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SecurityProfileArns" => { + security_profile_arns = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Username" => { + username = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(UserProperties { + directory_user_id: directory_user_id, + hierarchy_group_arn: hierarchy_group_arn, + identity_info: identity_info, + instance_arn: instance_arn.ok_or(::serde::de::Error::missing_field("InstanceArn"))?, + password: password, + phone_config: phone_config.ok_or(::serde::de::Error::missing_field("PhoneConfig"))?, + routing_profile_arn: routing_profile_arn.ok_or(::serde::de::Error::missing_field("RoutingProfileArn"))?, + security_profile_arns: security_profile_arns.ok_or(::serde::de::Error::missing_field("SecurityProfileArns"))?, + tags: tags, + username: username.ok_or(::serde::de::Error::missing_field("Username"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for User { + type Properties = UserProperties; + const TYPE: &'static str = "AWS::Connect::User"; + fn properties(&self) -> &UserProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut UserProperties { + &mut self.properties + } +} + +impl ::private::Sealed for User {} + +impl From for User { + fn from(properties: UserProperties) -> User { + User { properties } + } +} + +/// The [`AWS::Connect::UserHierarchyGroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-userhierarchygroup.html) resource type. +#[derive(Debug, Default)] +pub struct UserHierarchyGroup { + properties: UserHierarchyGroupProperties } -/// Properties for the `QuickConnect` resource. +/// Properties for the `UserHierarchyGroup` resource. #[derive(Debug, Default)] -pub struct QuickConnectProperties { - /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-quickconnect.html#cfn-connect-quickconnect-description). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub description: Option<::Value>, - /// Property [`InstanceArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-quickconnect.html#cfn-connect-quickconnect-instancearn). +pub struct UserHierarchyGroupProperties { + /// Property [`InstanceArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-userhierarchygroup.html#cfn-connect-userhierarchygroup-instancearn). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub instance_arn: ::Value, - /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-quickconnect.html#cfn-connect-quickconnect-name). + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-userhierarchygroup.html#cfn-connect-userhierarchygroup-name). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub name: ::Value, - /// Property [`QuickConnectConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-quickconnect.html#cfn-connect-quickconnect-quickconnectconfig). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub quick_connect_config: ::Value, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-quickconnect.html#cfn-connect-quickconnect-tags). + /// Property [`ParentGroupArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-connect-userhierarchygroup.html#cfn-connect-userhierarchygroup-parentgrouparn). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub tags: Option<::ValueList<::Tag>>, + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub parent_group_arn: Option<::Value>, } -impl ::serde::Serialize for QuickConnectProperties { +impl ::serde::Serialize for UserHierarchyGroupProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref description) = self.description { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; - } ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceArn", &self.instance_arn)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "QuickConnectConfig", &self.quick_connect_config)?; - if let Some(ref tags) = self.tags { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + if let Some(ref parent_group_arn) = self.parent_group_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ParentGroupArn", parent_group_arn)?; } ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for QuickConnectProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for UserHierarchyGroupProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = QuickConnectProperties; + type Value = UserHierarchyGroupProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type QuickConnectProperties") + write!(f, "a struct of type UserHierarchyGroupProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut description: Option<::Value> = None; let mut instance_arn: Option<::Value> = None; let mut name: Option<::Value> = None; - let mut quick_connect_config: Option<::Value> = None; - let mut tags: Option<::ValueList<::Tag>> = None; + let mut parent_group_arn: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Description" => { - description = ::serde::de::MapAccess::next_value(&mut map)?; - } "InstanceArn" => { instance_arn = ::serde::de::MapAccess::next_value(&mut map)?; } "Name" => { name = ::serde::de::MapAccess::next_value(&mut map)?; } - "QuickConnectConfig" => { - quick_connect_config = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Tags" => { - tags = ::serde::de::MapAccess::next_value(&mut map)?; + "ParentGroupArn" => { + parent_group_arn = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(QuickConnectProperties { - description: description, + Ok(UserHierarchyGroupProperties { instance_arn: instance_arn.ok_or(::serde::de::Error::missing_field("InstanceArn"))?, name: name.ok_or(::serde::de::Error::missing_field("Name"))?, - quick_connect_config: quick_connect_config.ok_or(::serde::de::Error::missing_field("QuickConnectConfig"))?, - tags: tags, + parent_group_arn: parent_group_arn, }) } } @@ -105,22 +812,161 @@ impl<'de> ::serde::Deserialize<'de> for QuickConnectProperties { } } -impl ::Resource for QuickConnect { - type Properties = QuickConnectProperties; - const TYPE: &'static str = "AWS::Connect::QuickConnect"; - fn properties(&self) -> &QuickConnectProperties { +impl ::Resource for UserHierarchyGroup { + type Properties = UserHierarchyGroupProperties; + const TYPE: &'static str = "AWS::Connect::UserHierarchyGroup"; + fn properties(&self) -> &UserHierarchyGroupProperties { &self.properties } - fn properties_mut(&mut self) -> &mut QuickConnectProperties { + fn properties_mut(&mut self) -> &mut UserHierarchyGroupProperties { &mut self.properties } } -impl ::private::Sealed for QuickConnect {} +impl ::private::Sealed for UserHierarchyGroup {} -impl From for QuickConnect { - fn from(properties: QuickConnectProperties) -> QuickConnect { - QuickConnect { properties } +impl From for UserHierarchyGroup { + fn from(properties: UserHierarchyGroupProperties) -> UserHierarchyGroup { + UserHierarchyGroup { properties } + } +} + +pub mod hours_of_operation { + //! Property types for the `HoursOfOperation` resource. + + /// The [`AWS::Connect::HoursOfOperation.HoursOfOperationConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-hoursofoperation-hoursofoperationconfig.html) property type. + #[derive(Debug, Default)] + pub struct HoursOfOperationConfig { + /// Property [`Day`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-hoursofoperation-hoursofoperationconfig.html#cfn-connect-hoursofoperation-hoursofoperationconfig-day). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub day: ::Value, + /// Property [`EndTime`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-hoursofoperation-hoursofoperationconfig.html#cfn-connect-hoursofoperation-hoursofoperationconfig-endtime). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub end_time: ::Value, + /// Property [`StartTime`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-hoursofoperation-hoursofoperationconfig.html#cfn-connect-hoursofoperation-hoursofoperationconfig-starttime). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub start_time: ::Value, + } + + impl ::codec::SerializeValue for HoursOfOperationConfig { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Day", &self.day)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EndTime", &self.end_time)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "StartTime", &self.start_time)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for HoursOfOperationConfig { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = HoursOfOperationConfig; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type HoursOfOperationConfig") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut day: Option<::Value> = None; + let mut end_time: Option<::Value> = None; + let mut start_time: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Day" => { + day = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EndTime" => { + end_time = ::serde::de::MapAccess::next_value(&mut map)?; + } + "StartTime" => { + start_time = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(HoursOfOperationConfig { + day: day.ok_or(::serde::de::Error::missing_field("Day"))?, + end_time: end_time.ok_or(::serde::de::Error::missing_field("EndTime"))?, + start_time: start_time.ok_or(::serde::de::Error::missing_field("StartTime"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Connect::HoursOfOperation.HoursOfOperationTimeSlice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-hoursofoperation-hoursofoperationtimeslice.html) property type. + #[derive(Debug, Default)] + pub struct HoursOfOperationTimeSlice { + /// Property [`Hours`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-hoursofoperation-hoursofoperationtimeslice.html#cfn-connect-hoursofoperation-hoursofoperationtimeslice-hours). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub hours: ::Value, + /// Property [`Minutes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-hoursofoperation-hoursofoperationtimeslice.html#cfn-connect-hoursofoperation-hoursofoperationtimeslice-minutes). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub minutes: ::Value, + } + + impl ::codec::SerializeValue for HoursOfOperationTimeSlice { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Hours", &self.hours)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Minutes", &self.minutes)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for HoursOfOperationTimeSlice { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = HoursOfOperationTimeSlice; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type HoursOfOperationTimeSlice") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut hours: Option<::Value> = None; + let mut minutes: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Hours" => { + hours = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Minutes" => { + minutes = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(HoursOfOperationTimeSlice { + hours: hours.ok_or(::serde::de::Error::missing_field("Hours"))?, + minutes: minutes.ok_or(::serde::de::Error::missing_field("Minutes"))?, + }) + } + } + + d.deserialize_map(Visitor) + } } } @@ -392,3 +1238,176 @@ pub mod quick_connect { } } } + +pub mod user { + //! Property types for the `User` resource. + + /// The [`AWS::Connect::User.UserIdentityInfo`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-user-useridentityinfo.html) property type. + #[derive(Debug, Default)] + pub struct UserIdentityInfo { + /// Property [`Email`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-user-useridentityinfo.html#cfn-connect-user-useridentityinfo-email). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub email: Option<::Value>, + /// Property [`FirstName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-user-useridentityinfo.html#cfn-connect-user-useridentityinfo-firstname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub first_name: Option<::Value>, + /// Property [`LastName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-user-useridentityinfo.html#cfn-connect-user-useridentityinfo-lastname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub last_name: Option<::Value>, + } + + impl ::codec::SerializeValue for UserIdentityInfo { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref email) = self.email { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Email", email)?; + } + if let Some(ref first_name) = self.first_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FirstName", first_name)?; + } + if let Some(ref last_name) = self.last_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LastName", last_name)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for UserIdentityInfo { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = UserIdentityInfo; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type UserIdentityInfo") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut email: Option<::Value> = None; + let mut first_name: Option<::Value> = None; + let mut last_name: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Email" => { + email = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FirstName" => { + first_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LastName" => { + last_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(UserIdentityInfo { + email: email, + first_name: first_name, + last_name: last_name, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Connect::User.UserPhoneConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-user-userphoneconfig.html) property type. + #[derive(Debug, Default)] + pub struct UserPhoneConfig { + /// Property [`AfterContactWorkTimeLimit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-user-userphoneconfig.html#cfn-connect-user-userphoneconfig-aftercontactworktimelimit). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub after_contact_work_time_limit: Option<::Value>, + /// Property [`AutoAccept`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-user-userphoneconfig.html#cfn-connect-user-userphoneconfig-autoaccept). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub auto_accept: Option<::Value>, + /// Property [`DeskPhoneNumber`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-user-userphoneconfig.html#cfn-connect-user-userphoneconfig-deskphonenumber). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub desk_phone_number: Option<::Value>, + /// Property [`PhoneType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-connect-user-userphoneconfig.html#cfn-connect-user-userphoneconfig-phonetype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub phone_type: ::Value, + } + + impl ::codec::SerializeValue for UserPhoneConfig { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref after_contact_work_time_limit) = self.after_contact_work_time_limit { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AfterContactWorkTimeLimit", after_contact_work_time_limit)?; + } + if let Some(ref auto_accept) = self.auto_accept { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AutoAccept", auto_accept)?; + } + if let Some(ref desk_phone_number) = self.desk_phone_number { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeskPhoneNumber", desk_phone_number)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PhoneType", &self.phone_type)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for UserPhoneConfig { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = UserPhoneConfig; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type UserPhoneConfig") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut after_contact_work_time_limit: Option<::Value> = None; + let mut auto_accept: Option<::Value> = None; + let mut desk_phone_number: Option<::Value> = None; + let mut phone_type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AfterContactWorkTimeLimit" => { + after_contact_work_time_limit = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AutoAccept" => { + auto_accept = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DeskPhoneNumber" => { + desk_phone_number = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PhoneType" => { + phone_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(UserPhoneConfig { + after_contact_work_time_limit: after_contact_work_time_limit, + auto_accept: auto_accept, + desk_phone_number: desk_phone_number, + phone_type: phone_type.ok_or(::serde::de::Error::missing_field("PhoneType"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} diff --git a/src/aws/customerprofiles.rs b/src/aws/customerprofiles.rs index 9e63e32..e177221 100644 --- a/src/aws/customerprofiles.rs +++ b/src/aws/customerprofiles.rs @@ -151,7 +151,12 @@ pub struct IntegrationProperties { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub object_type_name: ::Value, + pub object_type_name: Option<::Value>, + /// Property [`ObjectTypeNames`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-integration.html#cfn-customerprofiles-integration-objecttypenames). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub object_type_names: Option<::ValueList>, /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-customerprofiles-integration.html#cfn-customerprofiles-integration-tags). /// /// Update type: _Mutable_. @@ -171,7 +176,12 @@ impl ::serde::Serialize for IntegrationProperties { if let Some(ref flow_definition) = self.flow_definition { ::serde::ser::SerializeMap::serialize_entry(&mut map, "FlowDefinition", flow_definition)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ObjectTypeName", &self.object_type_name)?; + if let Some(ref object_type_name) = self.object_type_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ObjectTypeName", object_type_name)?; + } + if let Some(ref object_type_names) = self.object_type_names { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ObjectTypeNames", object_type_names)?; + } if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } @@ -197,6 +207,7 @@ impl<'de> ::serde::Deserialize<'de> for IntegrationProperties { let mut domain_name: Option<::Value> = None; let mut flow_definition: Option<::Value> = None; let mut object_type_name: Option<::Value> = None; + let mut object_type_names: Option<::ValueList> = None; let mut tags: Option<::ValueList<::Tag>> = None; let mut uri: Option<::Value> = None; @@ -211,6 +222,9 @@ impl<'de> ::serde::Deserialize<'de> for IntegrationProperties { "ObjectTypeName" => { object_type_name = ::serde::de::MapAccess::next_value(&mut map)?; } + "ObjectTypeNames" => { + object_type_names = ::serde::de::MapAccess::next_value(&mut map)?; + } "Tags" => { tags = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -224,7 +238,8 @@ impl<'de> ::serde::Deserialize<'de> for IntegrationProperties { Ok(IntegrationProperties { domain_name: domain_name.ok_or(::serde::de::Error::missing_field("DomainName"))?, flow_definition: flow_definition, - object_type_name: object_type_name.ok_or(::serde::de::Error::missing_field("ObjectTypeName"))?, + object_type_name: object_type_name, + object_type_names: object_type_names, tags: tags, uri: uri, }) @@ -767,6 +782,68 @@ pub mod integration { } } + /// The [`AWS::CustomerProfiles::Integration.ObjectTypeMapping`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-objecttypemapping.html) property type. + #[derive(Debug, Default)] + pub struct ObjectTypeMapping { + /// Property [`Key`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-objecttypemapping.html#cfn-customerprofiles-integration-objecttypemapping-key). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub key: ::Value, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-objecttypemapping.html#cfn-customerprofiles-integration-objecttypemapping-value). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub value: ::Value, + } + + impl ::codec::SerializeValue for ObjectTypeMapping { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Key", &self.key)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", &self.value)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ObjectTypeMapping { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ObjectTypeMapping; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ObjectTypeMapping") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut key: Option<::Value> = None; + let mut value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Key" => { + key = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ObjectTypeMapping { + key: key.ok_or(::serde::de::Error::missing_field("Key"))?, + value: value.ok_or(::serde::de::Error::missing_field("Value"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::CustomerProfiles::Integration.S3SourceProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-customerprofiles-integration-s3sourceproperties.html) property type. #[derive(Debug, Default)] pub struct S3SourceProperties { diff --git a/src/aws/databrew.rs b/src/aws/databrew.rs index e16169e..bbfc734 100644 --- a/src/aws/databrew.rs +++ b/src/aws/databrew.rs @@ -153,6 +153,11 @@ pub struct JobProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub data_catalog_outputs: Option<::ValueList>, + /// Property [`DatabaseOutputs`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-databaseoutputs). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub database_outputs: Option<::ValueList>, /// Property [`DatasetName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-datasetname). /// /// Update type: _Mutable_. @@ -203,6 +208,11 @@ pub struct JobProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub outputs: Option<::ValueList>, + /// Property [`ProfileConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-profileconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub profile_configuration: Option<::Value>, /// Property [`ProjectName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-projectname). /// /// Update type: _Mutable_. @@ -233,6 +243,11 @@ pub struct JobProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub r#type: ::Value, + /// Property [`ValidationConfigurations`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-job.html#cfn-databrew-job-validationconfigurations). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub validation_configurations: Option<::ValueList>, } impl ::serde::Serialize for JobProperties { @@ -241,6 +256,9 @@ impl ::serde::Serialize for JobProperties { if let Some(ref data_catalog_outputs) = self.data_catalog_outputs { ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataCatalogOutputs", data_catalog_outputs)?; } + if let Some(ref database_outputs) = self.database_outputs { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatabaseOutputs", database_outputs)?; + } if let Some(ref dataset_name) = self.dataset_name { ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatasetName", dataset_name)?; } @@ -269,6 +287,9 @@ impl ::serde::Serialize for JobProperties { if let Some(ref outputs) = self.outputs { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Outputs", outputs)?; } + if let Some(ref profile_configuration) = self.profile_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ProfileConfiguration", profile_configuration)?; + } if let Some(ref project_name) = self.project_name { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ProjectName", project_name)?; } @@ -283,6 +304,9 @@ impl ::serde::Serialize for JobProperties { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Timeout", timeout)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?; + if let Some(ref validation_configurations) = self.validation_configurations { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ValidationConfigurations", validation_configurations)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -300,6 +324,7 @@ impl<'de> ::serde::Deserialize<'de> for JobProperties { fn visit_map>(self, mut map: A) -> Result { let mut data_catalog_outputs: Option<::ValueList> = None; + let mut database_outputs: Option<::ValueList> = None; let mut dataset_name: Option<::Value> = None; let mut encryption_key_arn: Option<::Value> = None; let mut encryption_mode: Option<::Value> = None; @@ -310,18 +335,23 @@ impl<'de> ::serde::Deserialize<'de> for JobProperties { let mut name: Option<::Value> = None; let mut output_location: Option<::Value> = None; let mut outputs: Option<::ValueList> = None; + let mut profile_configuration: Option<::Value> = None; let mut project_name: Option<::Value> = None; let mut recipe: Option<::Value> = None; let mut role_arn: Option<::Value> = None; let mut tags: Option<::ValueList<::Tag>> = None; let mut timeout: Option<::Value> = None; let mut r#type: Option<::Value> = None; + let mut validation_configurations: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { "DataCatalogOutputs" => { data_catalog_outputs = ::serde::de::MapAccess::next_value(&mut map)?; } + "DatabaseOutputs" => { + database_outputs = ::serde::de::MapAccess::next_value(&mut map)?; + } "DatasetName" => { dataset_name = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -352,6 +382,9 @@ impl<'de> ::serde::Deserialize<'de> for JobProperties { "Outputs" => { outputs = ::serde::de::MapAccess::next_value(&mut map)?; } + "ProfileConfiguration" => { + profile_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } "ProjectName" => { project_name = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -370,12 +403,16 @@ impl<'de> ::serde::Deserialize<'de> for JobProperties { "Type" => { r#type = ::serde::de::MapAccess::next_value(&mut map)?; } + "ValidationConfigurations" => { + validation_configurations = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } Ok(JobProperties { data_catalog_outputs: data_catalog_outputs, + database_outputs: database_outputs, dataset_name: dataset_name, encryption_key_arn: encryption_key_arn, encryption_mode: encryption_mode, @@ -386,12 +423,14 @@ impl<'de> ::serde::Deserialize<'de> for JobProperties { name: name.ok_or(::serde::de::Error::missing_field("Name"))?, output_location: output_location, outputs: outputs, + profile_configuration: profile_configuration, project_name: project_name, recipe: recipe, role_arn: role_arn.ok_or(::serde::de::Error::missing_field("RoleArn"))?, tags: tags, timeout: timeout, r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?, + validation_configurations: validation_configurations, }) } } @@ -667,6 +706,130 @@ impl From for Recipe { } } +/// The [`AWS::DataBrew::Ruleset`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-ruleset.html) resource type. +#[derive(Debug, Default)] +pub struct Ruleset { + properties: RulesetProperties +} + +/// Properties for the `Ruleset` resource. +#[derive(Debug, Default)] +pub struct RulesetProperties { + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-ruleset.html#cfn-databrew-ruleset-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-ruleset.html#cfn-databrew-ruleset-name). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub name: ::Value, + /// Property [`Rules`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-ruleset.html#cfn-databrew-ruleset-rules). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub rules: ::ValueList, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-ruleset.html#cfn-databrew-ruleset-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`TargetArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-ruleset.html#cfn-databrew-ruleset-targetarn). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub target_arn: ::Value, +} + +impl ::serde::Serialize for RulesetProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Rules", &self.rules)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetArn", &self.target_arn)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for RulesetProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = RulesetProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type RulesetProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut description: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut rules: Option<::ValueList> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut target_arn: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Rules" => { + rules = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TargetArn" => { + target_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(RulesetProperties { + description: description, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + rules: rules.ok_or(::serde::de::Error::missing_field("Rules"))?, + tags: tags, + target_arn: target_arn.ok_or(::serde::de::Error::missing_field("TargetArn"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for Ruleset { + type Properties = RulesetProperties; + const TYPE: &'static str = "AWS::DataBrew::Ruleset"; + fn properties(&self) -> &RulesetProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut RulesetProperties { + &mut self.properties + } +} + +impl ::private::Sealed for Ruleset {} + +impl From for Ruleset { + fn from(properties: RulesetProperties) -> Ruleset { + Ruleset { properties } + } +} + /// The [`AWS::DataBrew::Schedule`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-databrew-schedule.html) resource type. #[derive(Debug, Default)] pub struct Schedule { @@ -953,7 +1116,12 @@ pub mod dataset { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub glue_connection_name: Option<::Value>, + pub glue_connection_name: ::Value, + /// Property [`QueryString`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-databaseinputdefinition.html#cfn-databrew-dataset-databaseinputdefinition-querystring). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub query_string: Option<::Value>, /// Property [`TempDirectory`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-databaseinputdefinition.html#cfn-databrew-dataset-databaseinputdefinition-tempdirectory). /// /// Update type: _Mutable_. @@ -967,8 +1135,9 @@ pub mod dataset { if let Some(ref database_table_name) = self.database_table_name { ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatabaseTableName", database_table_name)?; } - if let Some(ref glue_connection_name) = self.glue_connection_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "GlueConnectionName", glue_connection_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GlueConnectionName", &self.glue_connection_name)?; + if let Some(ref query_string) = self.query_string { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "QueryString", query_string)?; } if let Some(ref temp_directory) = self.temp_directory { ::serde::ser::SerializeMap::serialize_entry(&mut map, "TempDirectory", temp_directory)?; @@ -991,6 +1160,7 @@ pub mod dataset { fn visit_map>(self, mut map: A) -> Result { let mut database_table_name: Option<::Value> = None; let mut glue_connection_name: Option<::Value> = None; + let mut query_string: Option<::Value> = None; let mut temp_directory: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { @@ -1001,6 +1171,9 @@ pub mod dataset { "GlueConnectionName" => { glue_connection_name = ::serde::de::MapAccess::next_value(&mut map)?; } + "QueryString" => { + query_string = ::serde::de::MapAccess::next_value(&mut map)?; + } "TempDirectory" => { temp_directory = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1010,7 +1183,8 @@ pub mod dataset { Ok(DatabaseInputDefinition { database_table_name: database_table_name, - glue_connection_name: glue_connection_name, + glue_connection_name: glue_connection_name.ok_or(::serde::de::Error::missing_field("GlueConnectionName"))?, + query_string: query_string, temp_directory: temp_directory, }) } @@ -1570,6 +1744,11 @@ pub mod dataset { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub database_input_definition: Option<::Value>, + /// Property [`Metadata`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-input.html#cfn-databrew-dataset-input-metadata). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub metadata: Option<::Value>, /// Property [`S3InputDefinition`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-input.html#cfn-databrew-dataset-input-s3inputdefinition). /// /// Update type: _Mutable_. @@ -1586,6 +1765,9 @@ pub mod dataset { if let Some(ref database_input_definition) = self.database_input_definition { ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatabaseInputDefinition", database_input_definition)?; } + if let Some(ref metadata) = self.metadata { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Metadata", metadata)?; + } if let Some(ref s3_input_definition) = self.s3_input_definition { ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3InputDefinition", s3_input_definition)?; } @@ -1607,6 +1789,7 @@ pub mod dataset { fn visit_map>(self, mut map: A) -> Result { let mut data_catalog_input_definition: Option<::Value> = None; let mut database_input_definition: Option<::Value> = None; + let mut metadata: Option<::Value> = None; let mut s3_input_definition: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { @@ -1617,6 +1800,9 @@ pub mod dataset { "DatabaseInputDefinition" => { database_input_definition = ::serde::de::MapAccess::next_value(&mut map)?; } + "Metadata" => { + metadata = ::serde::de::MapAccess::next_value(&mut map)?; + } "S3InputDefinition" => { s3_input_definition = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1627,6 +1813,7 @@ pub mod dataset { Ok(Input { data_catalog_input_definition: data_catalog_input_definition, database_input_definition: database_input_definition, + metadata: metadata, s3_input_definition: s3_input_definition, }) } @@ -1689,6 +1876,59 @@ pub mod dataset { } } + /// The [`AWS::DataBrew::Dataset.Metadata`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-metadata.html) property type. + #[derive(Debug, Default)] + pub struct Metadata { + /// Property [`SourceArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-metadata.html#cfn-databrew-dataset-metadata-sourcearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub source_arn: Option<::Value>, + } + + impl ::codec::SerializeValue for Metadata { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref source_arn) = self.source_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourceArn", source_arn)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Metadata { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Metadata; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Metadata") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut source_arn: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "SourceArn" => { + source_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Metadata { + source_arn: source_arn, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::DataBrew::Dataset.PathOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-dataset-pathoptions.html) property type. #[derive(Debug, Default)] pub struct PathOptions { @@ -1898,51 +2138,49 @@ pub mod dataset { pub mod job { //! Property types for the `Job` resource. - /// The [`AWS::DataBrew::Job.CsvOutputOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-csvoutputoptions.html) property type. + /// The [`AWS::DataBrew::Job.AllowedStatistics`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-allowedstatistics.html) property type. #[derive(Debug, Default)] - pub struct CsvOutputOptions { - /// Property [`Delimiter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-csvoutputoptions.html#cfn-databrew-job-csvoutputoptions-delimiter). + pub struct AllowedStatistics { + /// Property [`Statistics`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-allowedstatistics.html#cfn-databrew-job-allowedstatistics-statistics). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub delimiter: Option<::Value>, + pub statistics: ::ValueList, } - impl ::codec::SerializeValue for CsvOutputOptions { + impl ::codec::SerializeValue for AllowedStatistics { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref delimiter) = self.delimiter { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Delimiter", delimiter)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Statistics", &self.statistics)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for CsvOutputOptions { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for AllowedStatistics { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = CsvOutputOptions; + type Value = AllowedStatistics; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type CsvOutputOptions") + write!(f, "a struct of type AllowedStatistics") } fn visit_map>(self, mut map: A) -> Result { - let mut delimiter: Option<::Value> = None; + let mut statistics: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Delimiter" => { - delimiter = ::serde::de::MapAccess::next_value(&mut map)?; + "Statistics" => { + statistics = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(CsvOutputOptions { - delimiter: delimiter, + Ok(AllowedStatistics { + statistics: statistics.ok_or(::serde::de::Error::missing_field("Statistics"))?, }) } } @@ -1951,112 +2189,64 @@ pub mod job { } } - /// The [`AWS::DataBrew::Job.DataCatalogOutput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-datacatalogoutput.html) property type. + /// The [`AWS::DataBrew::Job.ColumnSelector`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-columnselector.html) property type. #[derive(Debug, Default)] - pub struct DataCatalogOutput { - /// Property [`CatalogId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-datacatalogoutput.html#cfn-databrew-job-datacatalogoutput-catalogid). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub catalog_id: Option<::Value>, - /// Property [`DatabaseName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-datacatalogoutput.html#cfn-databrew-job-datacatalogoutput-databasename). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub database_name: ::Value, - /// Property [`DatabaseOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-datacatalogoutput.html#cfn-databrew-job-datacatalogoutput-databaseoptions). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub database_options: Option<::Value>, - /// Property [`Overwrite`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-datacatalogoutput.html#cfn-databrew-job-datacatalogoutput-overwrite). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub overwrite: Option<::Value>, - /// Property [`S3Options`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-datacatalogoutput.html#cfn-databrew-job-datacatalogoutput-s3options). + pub struct ColumnSelector { + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-columnselector.html#cfn-databrew-job-columnselector-name). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub s3_options: Option<::Value>, - /// Property [`TableName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-datacatalogoutput.html#cfn-databrew-job-datacatalogoutput-tablename). + pub name: Option<::Value>, + /// Property [`Regex`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-columnselector.html#cfn-databrew-job-columnselector-regex). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub table_name: ::Value, + pub regex: Option<::Value>, } - impl ::codec::SerializeValue for DataCatalogOutput { + impl ::codec::SerializeValue for ColumnSelector { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref catalog_id) = self.catalog_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CatalogId", catalog_id)?; - } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatabaseName", &self.database_name)?; - if let Some(ref database_options) = self.database_options { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatabaseOptions", database_options)?; - } - if let Some(ref overwrite) = self.overwrite { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Overwrite", overwrite)?; + if let Some(ref name) = self.name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; } - if let Some(ref s3_options) = self.s3_options { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3Options", s3_options)?; + if let Some(ref regex) = self.regex { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Regex", regex)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TableName", &self.table_name)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for DataCatalogOutput { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for ColumnSelector { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = DataCatalogOutput; + type Value = ColumnSelector; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type DataCatalogOutput") + write!(f, "a struct of type ColumnSelector") } fn visit_map>(self, mut map: A) -> Result { - let mut catalog_id: Option<::Value> = None; - let mut database_name: Option<::Value> = None; - let mut database_options: Option<::Value> = None; - let mut overwrite: Option<::Value> = None; - let mut s3_options: Option<::Value> = None; - let mut table_name: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut regex: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "CatalogId" => { - catalog_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DatabaseName" => { - database_name = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DatabaseOptions" => { - database_options = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Overwrite" => { - overwrite = ::serde::de::MapAccess::next_value(&mut map)?; - } - "S3Options" => { - s3_options = ::serde::de::MapAccess::next_value(&mut map)?; + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; } - "TableName" => { - table_name = ::serde::de::MapAccess::next_value(&mut map)?; + "Regex" => { + regex = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(DataCatalogOutput { - catalog_id: catalog_id, - database_name: database_name.ok_or(::serde::de::Error::missing_field("DatabaseName"))?, - database_options: database_options, - overwrite: overwrite, - s3_options: s3_options, - table_name: table_name.ok_or(::serde::de::Error::missing_field("TableName"))?, + Ok(ColumnSelector { + name: name, + regex: regex, }) } } @@ -2065,62 +2255,432 @@ pub mod job { } } - /// The [`AWS::DataBrew::Job.DatabaseTableOutputOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-databasetableoutputoptions.html) property type. + /// The [`AWS::DataBrew::Job.ColumnStatisticsConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-columnstatisticsconfiguration.html) property type. #[derive(Debug, Default)] - pub struct DatabaseTableOutputOptions { - /// Property [`TableName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-databasetableoutputoptions.html#cfn-databrew-job-databasetableoutputoptions-tablename). + pub struct ColumnStatisticsConfiguration { + /// Property [`Selectors`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-columnstatisticsconfiguration.html#cfn-databrew-job-columnstatisticsconfiguration-selectors). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub table_name: ::Value, - /// Property [`TempDirectory`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-databasetableoutputoptions.html#cfn-databrew-job-databasetableoutputoptions-tempdirectory). + pub selectors: Option<::ValueList>, + /// Property [`Statistics`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-columnstatisticsconfiguration.html#cfn-databrew-job-columnstatisticsconfiguration-statistics). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub temp_directory: Option<::Value>, + pub statistics: ::Value, } - impl ::codec::SerializeValue for DatabaseTableOutputOptions { + impl ::codec::SerializeValue for ColumnStatisticsConfiguration { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TableName", &self.table_name)?; - if let Some(ref temp_directory) = self.temp_directory { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TempDirectory", temp_directory)?; + if let Some(ref selectors) = self.selectors { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Selectors", selectors)?; } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Statistics", &self.statistics)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for DatabaseTableOutputOptions { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for ColumnStatisticsConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = DatabaseTableOutputOptions; + type Value = ColumnStatisticsConfiguration; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type DatabaseTableOutputOptions") + write!(f, "a struct of type ColumnStatisticsConfiguration") } fn visit_map>(self, mut map: A) -> Result { - let mut table_name: Option<::Value> = None; - let mut temp_directory: Option<::Value> = None; + let mut selectors: Option<::ValueList> = None; + let mut statistics: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Selectors" => { + selectors = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Statistics" => { + statistics = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ColumnStatisticsConfiguration { + selectors: selectors, + statistics: statistics.ok_or(::serde::de::Error::missing_field("Statistics"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::DataBrew::Job.CsvOutputOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-csvoutputoptions.html) property type. + #[derive(Debug, Default)] + pub struct CsvOutputOptions { + /// Property [`Delimiter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-csvoutputoptions.html#cfn-databrew-job-csvoutputoptions-delimiter). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub delimiter: Option<::Value>, + } + + impl ::codec::SerializeValue for CsvOutputOptions { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref delimiter) = self.delimiter { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Delimiter", delimiter)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CsvOutputOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CsvOutputOptions; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CsvOutputOptions") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut delimiter: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Delimiter" => { + delimiter = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CsvOutputOptions { + delimiter: delimiter, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::DataBrew::Job.DataCatalogOutput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-datacatalogoutput.html) property type. + #[derive(Debug, Default)] + pub struct DataCatalogOutput { + /// Property [`CatalogId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-datacatalogoutput.html#cfn-databrew-job-datacatalogoutput-catalogid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub catalog_id: Option<::Value>, + /// Property [`DatabaseName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-datacatalogoutput.html#cfn-databrew-job-datacatalogoutput-databasename). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub database_name: ::Value, + /// Property [`DatabaseOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-datacatalogoutput.html#cfn-databrew-job-datacatalogoutput-databaseoptions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub database_options: Option<::Value>, + /// Property [`Overwrite`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-datacatalogoutput.html#cfn-databrew-job-datacatalogoutput-overwrite). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub overwrite: Option<::Value>, + /// Property [`S3Options`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-datacatalogoutput.html#cfn-databrew-job-datacatalogoutput-s3options). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub s3_options: Option<::Value>, + /// Property [`TableName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-datacatalogoutput.html#cfn-databrew-job-datacatalogoutput-tablename). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub table_name: ::Value, + } + + impl ::codec::SerializeValue for DataCatalogOutput { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref catalog_id) = self.catalog_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CatalogId", catalog_id)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatabaseName", &self.database_name)?; + if let Some(ref database_options) = self.database_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatabaseOptions", database_options)?; + } + if let Some(ref overwrite) = self.overwrite { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Overwrite", overwrite)?; + } + if let Some(ref s3_options) = self.s3_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3Options", s3_options)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TableName", &self.table_name)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for DataCatalogOutput { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = DataCatalogOutput; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type DataCatalogOutput") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut catalog_id: Option<::Value> = None; + let mut database_name: Option<::Value> = None; + let mut database_options: Option<::Value> = None; + let mut overwrite: Option<::Value> = None; + let mut s3_options: Option<::Value> = None; + let mut table_name: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CatalogId" => { + catalog_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DatabaseName" => { + database_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DatabaseOptions" => { + database_options = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Overwrite" => { + overwrite = ::serde::de::MapAccess::next_value(&mut map)?; + } + "S3Options" => { + s3_options = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TableName" => { + table_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(DataCatalogOutput { + catalog_id: catalog_id, + database_name: database_name.ok_or(::serde::de::Error::missing_field("DatabaseName"))?, + database_options: database_options, + overwrite: overwrite, + s3_options: s3_options, + table_name: table_name.ok_or(::serde::de::Error::missing_field("TableName"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::DataBrew::Job.DatabaseOutput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-databaseoutput.html) property type. + #[derive(Debug, Default)] + pub struct DatabaseOutput { + /// Property [`DatabaseOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-databaseoutput.html#cfn-databrew-job-databaseoutput-databaseoptions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub database_options: ::Value, + /// Property [`DatabaseOutputMode`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-databaseoutput.html#cfn-databrew-job-databaseoutput-databaseoutputmode). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub database_output_mode: Option<::Value>, + /// Property [`GlueConnectionName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-databaseoutput.html#cfn-databrew-job-databaseoutput-glueconnectionname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub glue_connection_name: ::Value, + } + + impl ::codec::SerializeValue for DatabaseOutput { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatabaseOptions", &self.database_options)?; + if let Some(ref database_output_mode) = self.database_output_mode { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatabaseOutputMode", database_output_mode)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GlueConnectionName", &self.glue_connection_name)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for DatabaseOutput { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = DatabaseOutput; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type DatabaseOutput") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut database_options: Option<::Value> = None; + let mut database_output_mode: Option<::Value> = None; + let mut glue_connection_name: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DatabaseOptions" => { + database_options = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DatabaseOutputMode" => { + database_output_mode = ::serde::de::MapAccess::next_value(&mut map)?; + } + "GlueConnectionName" => { + glue_connection_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(DatabaseOutput { + database_options: database_options.ok_or(::serde::de::Error::missing_field("DatabaseOptions"))?, + database_output_mode: database_output_mode, + glue_connection_name: glue_connection_name.ok_or(::serde::de::Error::missing_field("GlueConnectionName"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::DataBrew::Job.DatabaseTableOutputOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-databasetableoutputoptions.html) property type. + #[derive(Debug, Default)] + pub struct DatabaseTableOutputOptions { + /// Property [`TableName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-databasetableoutputoptions.html#cfn-databrew-job-databasetableoutputoptions-tablename). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub table_name: ::Value, + /// Property [`TempDirectory`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-databasetableoutputoptions.html#cfn-databrew-job-databasetableoutputoptions-tempdirectory). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub temp_directory: Option<::Value>, + } + + impl ::codec::SerializeValue for DatabaseTableOutputOptions { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TableName", &self.table_name)?; + if let Some(ref temp_directory) = self.temp_directory { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TempDirectory", temp_directory)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for DatabaseTableOutputOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = DatabaseTableOutputOptions; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type DatabaseTableOutputOptions") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut table_name: Option<::Value> = None; + let mut temp_directory: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { "TableName" => { table_name = ::serde::de::MapAccess::next_value(&mut map)?; } - "TempDirectory" => { - temp_directory = ::serde::de::MapAccess::next_value(&mut map)?; + "TempDirectory" => { + temp_directory = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(DatabaseTableOutputOptions { + table_name: table_name.ok_or(::serde::de::Error::missing_field("TableName"))?, + temp_directory: temp_directory, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::DataBrew::Job.EntityDetectorConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-entitydetectorconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct EntityDetectorConfiguration { + /// Property [`AllowedStatistics`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-entitydetectorconfiguration.html#cfn-databrew-job-entitydetectorconfiguration-allowedstatistics). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub allowed_statistics: Option<::Value>, + /// Property [`EntityTypes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-entitydetectorconfiguration.html#cfn-databrew-job-entitydetectorconfiguration-entitytypes). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub entity_types: ::ValueList, + } + + impl ::codec::SerializeValue for EntityDetectorConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref allowed_statistics) = self.allowed_statistics { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AllowedStatistics", allowed_statistics)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EntityTypes", &self.entity_types)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for EntityDetectorConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = EntityDetectorConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type EntityDetectorConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut allowed_statistics: Option<::Value> = None; + let mut entity_types: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AllowedStatistics" => { + allowed_statistics = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EntityTypes" => { + entity_types = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(DatabaseTableOutputOptions { - table_name: table_name.ok_or(::serde::de::Error::missing_field("TableName"))?, - temp_directory: temp_directory, + Ok(EntityDetectorConfiguration { + allowed_statistics: allowed_statistics, + entity_types: entity_types.ok_or(::serde::de::Error::missing_field("EntityTypes"))?, }) } } @@ -2218,6 +2778,11 @@ pub mod job { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub location: ::Value, + /// Property [`MaxOutputFiles`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-output.html#cfn-databrew-job-output-maxoutputfiles). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub max_output_files: Option<::Value>, /// Property [`Overwrite`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-output.html#cfn-databrew-job-output-overwrite). /// /// Update type: _Mutable_. @@ -2243,6 +2808,9 @@ pub mod job { ::serde::ser::SerializeMap::serialize_entry(&mut map, "FormatOptions", format_options)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "Location", &self.location)?; + if let Some(ref max_output_files) = self.max_output_files { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxOutputFiles", max_output_files)?; + } if let Some(ref overwrite) = self.overwrite { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Overwrite", overwrite)?; } @@ -2269,6 +2837,7 @@ pub mod job { let mut format: Option<::Value> = None; let mut format_options: Option<::Value> = None; let mut location: Option<::Value> = None; + let mut max_output_files: Option<::Value> = None; let mut overwrite: Option<::Value> = None; let mut partition_columns: Option<::ValueList> = None; @@ -2286,6 +2855,9 @@ pub mod job { "Location" => { location = ::serde::de::MapAccess::next_value(&mut map)?; } + "MaxOutputFiles" => { + max_output_files = ::serde::de::MapAccess::next_value(&mut map)?; + } "Overwrite" => { overwrite = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -2301,6 +2873,7 @@ pub mod job { format: format, format_options: format_options, location: location.ok_or(::serde::de::Error::missing_field("Location"))?, + max_output_files: max_output_files, overwrite: overwrite, partition_columns: partition_columns, }) @@ -2372,6 +2945,11 @@ pub mod job { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub bucket: ::Value, + /// Property [`BucketOwner`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-outputlocation.html#cfn-databrew-job-outputlocation-bucketowner). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub bucket_owner: Option<::Value>, /// Property [`Key`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-outputlocation.html#cfn-databrew-job-outputlocation-key). /// /// Update type: _Mutable_. @@ -2383,6 +2961,9 @@ pub mod job { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "Bucket", &self.bucket)?; + if let Some(ref bucket_owner) = self.bucket_owner { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BucketOwner", bucket_owner)?; + } if let Some(ref key) = self.key { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Key", key)?; } @@ -2403,6 +2984,7 @@ pub mod job { fn visit_map>(self, mut map: A) -> Result { let mut bucket: Option<::Value> = None; + let mut bucket_owner: Option<::Value> = None; let mut key: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { @@ -2410,6 +2992,9 @@ pub mod job { "Bucket" => { bucket = ::serde::de::MapAccess::next_value(&mut map)?; } + "BucketOwner" => { + bucket_owner = ::serde::de::MapAccess::next_value(&mut map)?; + } "Key" => { key = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -2419,6 +3004,7 @@ pub mod job { Ok(OutputLocation { bucket: bucket.ok_or(::serde::de::Error::missing_field("Bucket"))?, + bucket_owner: bucket_owner, key: key, }) } @@ -2428,6 +3014,130 @@ pub mod job { } } + /// The [`AWS::DataBrew::Job.ParameterMap`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-parametermap.html) property type. + #[derive(Debug, Default)] + pub struct ParameterMap { + } + + impl ::codec::SerializeValue for ParameterMap { + fn serialize(&self, s: S) -> Result { + let map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ParameterMap { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ParameterMap; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ParameterMap") + } + + fn visit_map>(self, _map: A) -> Result { + Ok(ParameterMap {}) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::DataBrew::Job.ProfileConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-profileconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct ProfileConfiguration { + /// Property [`ColumnStatisticsConfigurations`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-profileconfiguration.html#cfn-databrew-job-profileconfiguration-columnstatisticsconfigurations). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub column_statistics_configurations: Option<::ValueList>, + /// Property [`DatasetStatisticsConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-profileconfiguration.html#cfn-databrew-job-profileconfiguration-datasetstatisticsconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub dataset_statistics_configuration: Option<::Value>, + /// Property [`EntityDetectorConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-profileconfiguration.html#cfn-databrew-job-profileconfiguration-entitydetectorconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub entity_detector_configuration: Option<::Value>, + /// Property [`ProfileColumns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-profileconfiguration.html#cfn-databrew-job-profileconfiguration-profilecolumns). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub profile_columns: Option<::ValueList>, + } + + impl ::codec::SerializeValue for ProfileConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref column_statistics_configurations) = self.column_statistics_configurations { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ColumnStatisticsConfigurations", column_statistics_configurations)?; + } + if let Some(ref dataset_statistics_configuration) = self.dataset_statistics_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatasetStatisticsConfiguration", dataset_statistics_configuration)?; + } + if let Some(ref entity_detector_configuration) = self.entity_detector_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EntityDetectorConfiguration", entity_detector_configuration)?; + } + if let Some(ref profile_columns) = self.profile_columns { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ProfileColumns", profile_columns)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ProfileConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ProfileConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ProfileConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut column_statistics_configurations: Option<::ValueList> = None; + let mut dataset_statistics_configuration: Option<::Value> = None; + let mut entity_detector_configuration: Option<::Value> = None; + let mut profile_columns: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ColumnStatisticsConfigurations" => { + column_statistics_configurations = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DatasetStatisticsConfiguration" => { + dataset_statistics_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EntityDetectorConfiguration" => { + entity_detector_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ProfileColumns" => { + profile_columns = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ProfileConfiguration { + column_statistics_configurations: column_statistics_configurations, + dataset_statistics_configuration: dataset_statistics_configuration, + entity_detector_configuration: entity_detector_configuration, + profile_columns: profile_columns, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::DataBrew::Job.Recipe`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-recipe.html) property type. #[derive(Debug, Default)] pub struct Recipe { @@ -2500,6 +3210,11 @@ pub mod job { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub bucket: ::Value, + /// Property [`BucketOwner`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-s3location.html#cfn-databrew-job-s3location-bucketowner). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub bucket_owner: Option<::Value>, /// Property [`Key`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-s3location.html#cfn-databrew-job-s3location-key). /// /// Update type: _Mutable_. @@ -2507,47 +3222,234 @@ pub mod job { pub key: Option<::Value>, } - impl ::codec::SerializeValue for S3Location { + impl ::codec::SerializeValue for S3Location { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Bucket", &self.bucket)?; + if let Some(ref bucket_owner) = self.bucket_owner { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BucketOwner", bucket_owner)?; + } + if let Some(ref key) = self.key { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Key", key)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for S3Location { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = S3Location; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type S3Location") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut bucket: Option<::Value> = None; + let mut bucket_owner: Option<::Value> = None; + let mut key: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Bucket" => { + bucket = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BucketOwner" => { + bucket_owner = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Key" => { + key = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(S3Location { + bucket: bucket.ok_or(::serde::de::Error::missing_field("Bucket"))?, + bucket_owner: bucket_owner, + key: key, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::DataBrew::Job.S3TableOutputOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-s3tableoutputoptions.html) property type. + #[derive(Debug, Default)] + pub struct S3TableOutputOptions { + /// Property [`Location`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-s3tableoutputoptions.html#cfn-databrew-job-s3tableoutputoptions-location). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub location: ::Value, + } + + impl ::codec::SerializeValue for S3TableOutputOptions { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Location", &self.location)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for S3TableOutputOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = S3TableOutputOptions; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type S3TableOutputOptions") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut location: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Location" => { + location = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(S3TableOutputOptions { + location: location.ok_or(::serde::de::Error::missing_field("Location"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::DataBrew::Job.StatisticOverride`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-statisticoverride.html) property type. + #[derive(Debug, Default)] + pub struct StatisticOverride { + /// Property [`Parameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-statisticoverride.html#cfn-databrew-job-statisticoverride-parameters). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub parameters: ::Value, + /// Property [`Statistic`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-statisticoverride.html#cfn-databrew-job-statisticoverride-statistic). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub statistic: ::Value, + } + + impl ::codec::SerializeValue for StatisticOverride { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Parameters", &self.parameters)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Statistic", &self.statistic)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for StatisticOverride { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = StatisticOverride; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type StatisticOverride") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut parameters: Option<::Value> = None; + let mut statistic: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Parameters" => { + parameters = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Statistic" => { + statistic = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(StatisticOverride { + parameters: parameters.ok_or(::serde::de::Error::missing_field("Parameters"))?, + statistic: statistic.ok_or(::serde::de::Error::missing_field("Statistic"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::DataBrew::Job.StatisticsConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-statisticsconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct StatisticsConfiguration { + /// Property [`IncludedStatistics`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-statisticsconfiguration.html#cfn-databrew-job-statisticsconfiguration-includedstatistics). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub included_statistics: Option<::ValueList>, + /// Property [`Overrides`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-statisticsconfiguration.html#cfn-databrew-job-statisticsconfiguration-overrides). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub overrides: Option<::ValueList>, + } + + impl ::codec::SerializeValue for StatisticsConfiguration { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Bucket", &self.bucket)?; - if let Some(ref key) = self.key { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Key", key)?; + if let Some(ref included_statistics) = self.included_statistics { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludedStatistics", included_statistics)?; + } + if let Some(ref overrides) = self.overrides { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Overrides", overrides)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for S3Location { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for StatisticsConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = S3Location; + type Value = StatisticsConfiguration; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type S3Location") + write!(f, "a struct of type StatisticsConfiguration") } fn visit_map>(self, mut map: A) -> Result { - let mut bucket: Option<::Value> = None; - let mut key: Option<::Value> = None; + let mut included_statistics: Option<::ValueList> = None; + let mut overrides: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Bucket" => { - bucket = ::serde::de::MapAccess::next_value(&mut map)?; + "IncludedStatistics" => { + included_statistics = ::serde::de::MapAccess::next_value(&mut map)?; } - "Key" => { - key = ::serde::de::MapAccess::next_value(&mut map)?; + "Overrides" => { + overrides = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(S3Location { - bucket: bucket.ok_or(::serde::de::Error::missing_field("Bucket"))?, - key: key, + Ok(StatisticsConfiguration { + included_statistics: included_statistics, + overrides: overrides, }) } } @@ -2556,49 +3458,62 @@ pub mod job { } } - /// The [`AWS::DataBrew::Job.S3TableOutputOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-s3tableoutputoptions.html) property type. + /// The [`AWS::DataBrew::Job.ValidationConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-validationconfiguration.html) property type. #[derive(Debug, Default)] - pub struct S3TableOutputOptions { - /// Property [`Location`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-s3tableoutputoptions.html#cfn-databrew-job-s3tableoutputoptions-location). + pub struct ValidationConfiguration { + /// Property [`RulesetArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-validationconfiguration.html#cfn-databrew-job-validationconfiguration-rulesetarn). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub location: ::Value, + pub ruleset_arn: ::Value, + /// Property [`ValidationMode`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-job-validationconfiguration.html#cfn-databrew-job-validationconfiguration-validationmode). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub validation_mode: Option<::Value>, } - impl ::codec::SerializeValue for S3TableOutputOptions { + impl ::codec::SerializeValue for ValidationConfiguration { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Location", &self.location)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RulesetArn", &self.ruleset_arn)?; + if let Some(ref validation_mode) = self.validation_mode { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ValidationMode", validation_mode)?; + } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for S3TableOutputOptions { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for ValidationConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = S3TableOutputOptions; + type Value = ValidationConfiguration; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type S3TableOutputOptions") + write!(f, "a struct of type ValidationConfiguration") } fn visit_map>(self, mut map: A) -> Result { - let mut location: Option<::Value> = None; + let mut ruleset_arn: Option<::Value> = None; + let mut validation_mode: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Location" => { - location = ::serde::de::MapAccess::next_value(&mut map)?; + "RulesetArn" => { + ruleset_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ValidationMode" => { + validation_mode = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(S3TableOutputOptions { - location: location.ok_or(::serde::de::Error::missing_field("Location"))?, + Ok(ValidationConfiguration { + ruleset_arn: ruleset_arn.ok_or(::serde::de::Error::missing_field("RulesetArn"))?, + validation_mode: validation_mode, }) } } @@ -4489,3 +5404,326 @@ pub mod recipe { } } } + +pub mod ruleset { + //! Property types for the `Ruleset` resource. + + /// The [`AWS::DataBrew::Ruleset.ColumnSelector`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-columnselector.html) property type. + #[derive(Debug, Default)] + pub struct ColumnSelector { + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-columnselector.html#cfn-databrew-ruleset-columnselector-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: Option<::Value>, + /// Property [`Regex`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-columnselector.html#cfn-databrew-ruleset-columnselector-regex). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub regex: Option<::Value>, + } + + impl ::codec::SerializeValue for ColumnSelector { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref name) = self.name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; + } + if let Some(ref regex) = self.regex { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Regex", regex)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ColumnSelector { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ColumnSelector; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ColumnSelector") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut name: Option<::Value> = None; + let mut regex: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Regex" => { + regex = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ColumnSelector { + name: name, + regex: regex, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::DataBrew::Ruleset.Rule`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-rule.html) property type. + #[derive(Debug, Default)] + pub struct Rule { + /// Property [`CheckExpression`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-rule.html#cfn-databrew-ruleset-rule-checkexpression). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub check_expression: ::Value, + /// Property [`ColumnSelectors`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-rule.html#cfn-databrew-ruleset-rule-columnselectors). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub column_selectors: Option<::ValueList>, + /// Property [`Disabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-rule.html#cfn-databrew-ruleset-rule-disabled). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub disabled: Option<::Value>, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-rule.html#cfn-databrew-ruleset-rule-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: ::Value, + /// Property [`SubstitutionMap`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-rule.html#cfn-databrew-ruleset-rule-substitutionmap). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub substitution_map: Option<::ValueList>, + /// Property [`Threshold`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-rule.html#cfn-databrew-ruleset-rule-threshold). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub threshold: Option<::Value>, + } + + impl ::codec::SerializeValue for Rule { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CheckExpression", &self.check_expression)?; + if let Some(ref column_selectors) = self.column_selectors { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ColumnSelectors", column_selectors)?; + } + if let Some(ref disabled) = self.disabled { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Disabled", disabled)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + if let Some(ref substitution_map) = self.substitution_map { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubstitutionMap", substitution_map)?; + } + if let Some(ref threshold) = self.threshold { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Threshold", threshold)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Rule { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Rule; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Rule") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut check_expression: Option<::Value> = None; + let mut column_selectors: Option<::ValueList> = None; + let mut disabled: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut substitution_map: Option<::ValueList> = None; + let mut threshold: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CheckExpression" => { + check_expression = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ColumnSelectors" => { + column_selectors = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Disabled" => { + disabled = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SubstitutionMap" => { + substitution_map = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Threshold" => { + threshold = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Rule { + check_expression: check_expression.ok_or(::serde::de::Error::missing_field("CheckExpression"))?, + column_selectors: column_selectors, + disabled: disabled, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + substitution_map: substitution_map, + threshold: threshold, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::DataBrew::Ruleset.SubstitutionValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-substitutionvalue.html) property type. + #[derive(Debug, Default)] + pub struct SubstitutionValue { + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-substitutionvalue.html#cfn-databrew-ruleset-substitutionvalue-value). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub value: ::Value, + /// Property [`ValueReference`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-substitutionvalue.html#cfn-databrew-ruleset-substitutionvalue-valuereference). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub value_reference: ::Value, + } + + impl ::codec::SerializeValue for SubstitutionValue { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", &self.value)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ValueReference", &self.value_reference)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for SubstitutionValue { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = SubstitutionValue; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type SubstitutionValue") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut value: Option<::Value> = None; + let mut value_reference: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ValueReference" => { + value_reference = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(SubstitutionValue { + value: value.ok_or(::serde::de::Error::missing_field("Value"))?, + value_reference: value_reference.ok_or(::serde::de::Error::missing_field("ValueReference"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::DataBrew::Ruleset.Threshold`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-threshold.html) property type. + #[derive(Debug, Default)] + pub struct Threshold { + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-threshold.html#cfn-databrew-ruleset-threshold-type). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#type: Option<::Value>, + /// Property [`Unit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-threshold.html#cfn-databrew-ruleset-threshold-unit). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub unit: Option<::Value>, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-databrew-ruleset-threshold.html#cfn-databrew-ruleset-threshold-value). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub value: ::Value, + } + + impl ::codec::SerializeValue for Threshold { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref r#type) = self.r#type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", r#type)?; + } + if let Some(ref unit) = self.unit { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Unit", unit)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", &self.value)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Threshold { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Threshold; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Threshold") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut r#type: Option<::Value> = None; + let mut unit: Option<::Value> = None; + let mut value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Unit" => { + unit = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Threshold { + r#type: r#type, + unit: unit, + value: value.ok_or(::serde::de::Error::missing_field("Value"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} diff --git a/src/aws/datasync.rs b/src/aws/datasync.rs index 2e6efa9..c8f4396 100644 --- a/src/aws/datasync.rs +++ b/src/aws/datasync.rs @@ -254,6 +254,243 @@ impl From for LocationEFS { } } +/// The [`AWS::DataSync::LocationFSxLustre`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxlustre.html) resource type. +#[derive(Debug, Default)] +pub struct LocationFSxLustre { + properties: LocationFSxLustreProperties +} + +/// Properties for the `LocationFSxLustre` resource. +#[derive(Debug, Default)] +pub struct LocationFSxLustreProperties { + /// Property [`FsxFilesystemArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxlustre.html#cfn-datasync-locationfsxlustre-fsxfilesystemarn). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub fsx_filesystem_arn: ::Value, + /// Property [`SecurityGroupArns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxlustre.html#cfn-datasync-locationfsxlustre-securitygrouparns). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub security_group_arns: ::ValueList, + /// Property [`Subdirectory`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxlustre.html#cfn-datasync-locationfsxlustre-subdirectory). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub subdirectory: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxlustre.html#cfn-datasync-locationfsxlustre-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, +} + +impl ::serde::Serialize for LocationFSxLustreProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FsxFilesystemArn", &self.fsx_filesystem_arn)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityGroupArns", &self.security_group_arns)?; + if let Some(ref subdirectory) = self.subdirectory { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Subdirectory", subdirectory)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for LocationFSxLustreProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = LocationFSxLustreProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type LocationFSxLustreProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut fsx_filesystem_arn: Option<::Value> = None; + let mut security_group_arns: Option<::ValueList> = None; + let mut subdirectory: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "FsxFilesystemArn" => { + fsx_filesystem_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SecurityGroupArns" => { + security_group_arns = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Subdirectory" => { + subdirectory = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(LocationFSxLustreProperties { + fsx_filesystem_arn: fsx_filesystem_arn.ok_or(::serde::de::Error::missing_field("FsxFilesystemArn"))?, + security_group_arns: security_group_arns.ok_or(::serde::de::Error::missing_field("SecurityGroupArns"))?, + subdirectory: subdirectory, + tags: tags, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for LocationFSxLustre { + type Properties = LocationFSxLustreProperties; + const TYPE: &'static str = "AWS::DataSync::LocationFSxLustre"; + fn properties(&self) -> &LocationFSxLustreProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut LocationFSxLustreProperties { + &mut self.properties + } +} + +impl ::private::Sealed for LocationFSxLustre {} + +impl From for LocationFSxLustre { + fn from(properties: LocationFSxLustreProperties) -> LocationFSxLustre { + LocationFSxLustre { properties } + } +} + +/// The [`AWS::DataSync::LocationFSxOpenZFS`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxopenzfs.html) resource type. +#[derive(Debug, Default)] +pub struct LocationFSxOpenZFS { + properties: LocationFSxOpenZFSProperties +} + +/// Properties for the `LocationFSxOpenZFS` resource. +#[derive(Debug, Default)] +pub struct LocationFSxOpenZFSProperties { + /// Property [`FsxFilesystemArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxopenzfs.html#cfn-datasync-locationfsxopenzfs-fsxfilesystemarn). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub fsx_filesystem_arn: ::Value, + /// Property [`Protocol`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxopenzfs.html#cfn-datasync-locationfsxopenzfs-protocol). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub protocol: ::Value, + /// Property [`SecurityGroupArns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxopenzfs.html#cfn-datasync-locationfsxopenzfs-securitygrouparns). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub security_group_arns: ::ValueList, + /// Property [`Subdirectory`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxopenzfs.html#cfn-datasync-locationfsxopenzfs-subdirectory). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub subdirectory: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxopenzfs.html#cfn-datasync-locationfsxopenzfs-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, +} + +impl ::serde::Serialize for LocationFSxOpenZFSProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FsxFilesystemArn", &self.fsx_filesystem_arn)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Protocol", &self.protocol)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityGroupArns", &self.security_group_arns)?; + if let Some(ref subdirectory) = self.subdirectory { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Subdirectory", subdirectory)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for LocationFSxOpenZFSProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = LocationFSxOpenZFSProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type LocationFSxOpenZFSProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut fsx_filesystem_arn: Option<::Value> = None; + let mut protocol: Option<::Value> = None; + let mut security_group_arns: Option<::ValueList> = None; + let mut subdirectory: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "FsxFilesystemArn" => { + fsx_filesystem_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Protocol" => { + protocol = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SecurityGroupArns" => { + security_group_arns = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Subdirectory" => { + subdirectory = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(LocationFSxOpenZFSProperties { + fsx_filesystem_arn: fsx_filesystem_arn.ok_or(::serde::de::Error::missing_field("FsxFilesystemArn"))?, + protocol: protocol.ok_or(::serde::de::Error::missing_field("Protocol"))?, + security_group_arns: security_group_arns.ok_or(::serde::de::Error::missing_field("SecurityGroupArns"))?, + subdirectory: subdirectory, + tags: tags, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for LocationFSxOpenZFS { + type Properties = LocationFSxOpenZFSProperties; + const TYPE: &'static str = "AWS::DataSync::LocationFSxOpenZFS"; + fn properties(&self) -> &LocationFSxOpenZFSProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut LocationFSxOpenZFSProperties { + &mut self.properties + } +} + +impl ::private::Sealed for LocationFSxOpenZFS {} + +impl From for LocationFSxOpenZFS { + fn from(properties: LocationFSxOpenZFSProperties) -> LocationFSxOpenZFS { + LocationFSxOpenZFS { properties } + } +} + /// The [`AWS::DataSync::LocationFSxWindows`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationfsxwindows.html) resource type. #[derive(Debug, Default)] pub struct LocationFSxWindows { @@ -402,6 +639,234 @@ impl From for LocationFSxWindows { } } +/// The [`AWS::DataSync::LocationHDFS`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html) resource type. +#[derive(Debug, Default)] +pub struct LocationHDFS { + properties: LocationHDFSProperties +} + +/// Properties for the `LocationHDFS` resource. +#[derive(Debug, Default)] +pub struct LocationHDFSProperties { + /// Property [`AgentArns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-agentarns). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub agent_arns: ::ValueList, + /// Property [`AuthenticationType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-authenticationtype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub authentication_type: ::Value, + /// Property [`BlockSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-blocksize). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub block_size: Option<::Value>, + /// Property [`KerberosKeytab`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-kerberoskeytab). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub kerberos_keytab: Option<::Value>, + /// Property [`KerberosKrb5Conf`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-kerberoskrb5conf). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub kerberos_krb5_conf: Option<::Value>, + /// Property [`KerberosPrincipal`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-kerberosprincipal). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub kerberos_principal: Option<::Value>, + /// Property [`KmsKeyProviderUri`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-kmskeyprovideruri). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub kms_key_provider_uri: Option<::Value>, + /// Property [`NameNodes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-namenodes). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name_nodes: ::ValueList, + /// Property [`QopConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-qopconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub qop_configuration: Option<::Value>, + /// Property [`ReplicationFactor`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-replicationfactor). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub replication_factor: Option<::Value>, + /// Property [`SimpleUser`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-simpleuser). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub simple_user: Option<::Value>, + /// Property [`Subdirectory`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-subdirectory). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub subdirectory: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationhdfs.html#cfn-datasync-locationhdfs-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, +} + +impl ::serde::Serialize for LocationHDFSProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AgentArns", &self.agent_arns)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AuthenticationType", &self.authentication_type)?; + if let Some(ref block_size) = self.block_size { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BlockSize", block_size)?; + } + if let Some(ref kerberos_keytab) = self.kerberos_keytab { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "KerberosKeytab", kerberos_keytab)?; + } + if let Some(ref kerberos_krb5_conf) = self.kerberos_krb5_conf { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "KerberosKrb5Conf", kerberos_krb5_conf)?; + } + if let Some(ref kerberos_principal) = self.kerberos_principal { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "KerberosPrincipal", kerberos_principal)?; + } + if let Some(ref kms_key_provider_uri) = self.kms_key_provider_uri { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "KmsKeyProviderUri", kms_key_provider_uri)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NameNodes", &self.name_nodes)?; + if let Some(ref qop_configuration) = self.qop_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "QopConfiguration", qop_configuration)?; + } + if let Some(ref replication_factor) = self.replication_factor { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReplicationFactor", replication_factor)?; + } + if let Some(ref simple_user) = self.simple_user { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SimpleUser", simple_user)?; + } + if let Some(ref subdirectory) = self.subdirectory { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Subdirectory", subdirectory)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for LocationHDFSProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = LocationHDFSProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type LocationHDFSProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut agent_arns: Option<::ValueList> = None; + let mut authentication_type: Option<::Value> = None; + let mut block_size: Option<::Value> = None; + let mut kerberos_keytab: Option<::Value> = None; + let mut kerberos_krb5_conf: Option<::Value> = None; + let mut kerberos_principal: Option<::Value> = None; + let mut kms_key_provider_uri: Option<::Value> = None; + let mut name_nodes: Option<::ValueList> = None; + let mut qop_configuration: Option<::Value> = None; + let mut replication_factor: Option<::Value> = None; + let mut simple_user: Option<::Value> = None; + let mut subdirectory: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AgentArns" => { + agent_arns = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AuthenticationType" => { + authentication_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BlockSize" => { + block_size = ::serde::de::MapAccess::next_value(&mut map)?; + } + "KerberosKeytab" => { + kerberos_keytab = ::serde::de::MapAccess::next_value(&mut map)?; + } + "KerberosKrb5Conf" => { + kerberos_krb5_conf = ::serde::de::MapAccess::next_value(&mut map)?; + } + "KerberosPrincipal" => { + kerberos_principal = ::serde::de::MapAccess::next_value(&mut map)?; + } + "KmsKeyProviderUri" => { + kms_key_provider_uri = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NameNodes" => { + name_nodes = ::serde::de::MapAccess::next_value(&mut map)?; + } + "QopConfiguration" => { + qop_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ReplicationFactor" => { + replication_factor = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SimpleUser" => { + simple_user = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Subdirectory" => { + subdirectory = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(LocationHDFSProperties { + agent_arns: agent_arns.ok_or(::serde::de::Error::missing_field("AgentArns"))?, + authentication_type: authentication_type.ok_or(::serde::de::Error::missing_field("AuthenticationType"))?, + block_size: block_size, + kerberos_keytab: kerberos_keytab, + kerberos_krb5_conf: kerberos_krb5_conf, + kerberos_principal: kerberos_principal, + kms_key_provider_uri: kms_key_provider_uri, + name_nodes: name_nodes.ok_or(::serde::de::Error::missing_field("NameNodes"))?, + qop_configuration: qop_configuration, + replication_factor: replication_factor, + simple_user: simple_user, + subdirectory: subdirectory, + tags: tags, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for LocationHDFS { + type Properties = LocationHDFSProperties; + const TYPE: &'static str = "AWS::DataSync::LocationHDFS"; + fn properties(&self) -> &LocationHDFSProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut LocationHDFSProperties { + &mut self.properties + } +} + +impl ::private::Sealed for LocationHDFS {} + +impl From for LocationHDFS { + fn from(properties: LocationHDFSProperties) -> LocationHDFS { + LocationHDFS { properties } + } +} + /// The [`AWS::DataSync::LocationNFS`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationnfs.html) resource type. #[derive(Debug, Default)] pub struct LocationNFS { @@ -413,13 +878,13 @@ pub struct LocationNFS { pub struct LocationNFSProperties { /// Property [`MountOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationnfs.html#cfn-datasync-locationnfs-mountoptions). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub mount_options: Option<::Value>, /// Property [`OnPremConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationnfs.html#cfn-datasync-locationnfs-onpremconfig). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub on_prem_config: ::Value, /// Property [`ServerHostname`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationnfs.html#cfn-datasync-locationnfs-serverhostname). /// @@ -428,8 +893,8 @@ pub struct LocationNFSProperties { pub server_hostname: ::Value, /// Property [`Subdirectory`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationnfs.html#cfn-datasync-locationnfs-subdirectory). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub subdirectory: ::Value, /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationnfs.html#cfn-datasync-locationnfs-tags). /// @@ -537,13 +1002,13 @@ pub struct LocationObjectStorage { pub struct LocationObjectStorageProperties { /// Property [`AccessKey`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationobjectstorage.html#cfn-datasync-locationobjectstorage-accesskey). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub access_key: Option<::Value>, /// Property [`AgentArns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationobjectstorage.html#cfn-datasync-locationobjectstorage-agentarns). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub agent_arns: ::ValueList, /// Property [`BucketName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationobjectstorage.html#cfn-datasync-locationobjectstorage-bucketname). /// @@ -552,8 +1017,8 @@ pub struct LocationObjectStorageProperties { pub bucket_name: ::Value, /// Property [`SecretKey`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationobjectstorage.html#cfn-datasync-locationobjectstorage-secretkey). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub secret_key: Option<::Value>, /// Property [`ServerHostname`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationobjectstorage.html#cfn-datasync-locationobjectstorage-serverhostname). /// @@ -562,18 +1027,18 @@ pub struct LocationObjectStorageProperties { pub server_hostname: ::Value, /// Property [`ServerPort`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationobjectstorage.html#cfn-datasync-locationobjectstorage-serverport). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub server_port: Option<::Value>, /// Property [`ServerProtocol`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationobjectstorage.html#cfn-datasync-locationobjectstorage-serverprotocol). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub server_protocol: Option<::Value>, /// Property [`Subdirectory`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationobjectstorage.html#cfn-datasync-locationobjectstorage-subdirectory). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub subdirectory: Option<::Value>, /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationobjectstorage.html#cfn-datasync-locationobjectstorage-tags). /// @@ -839,23 +1304,23 @@ pub struct LocationSMB { pub struct LocationSMBProperties { /// Property [`AgentArns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationsmb.html#cfn-datasync-locationsmb-agentarns). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub agent_arns: ::ValueList, /// Property [`Domain`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationsmb.html#cfn-datasync-locationsmb-domain). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub domain: Option<::Value>, /// Property [`MountOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationsmb.html#cfn-datasync-locationsmb-mountoptions). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub mount_options: Option<::Value>, /// Property [`Password`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationsmb.html#cfn-datasync-locationsmb-password). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub password: ::Value, /// Property [`ServerHostname`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationsmb.html#cfn-datasync-locationsmb-serverhostname). /// @@ -864,8 +1329,8 @@ pub struct LocationSMBProperties { pub server_hostname: ::Value, /// Property [`Subdirectory`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationsmb.html#cfn-datasync-locationsmb-subdirectory). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub subdirectory: ::Value, /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationsmb.html#cfn-datasync-locationsmb-tags). /// @@ -874,8 +1339,8 @@ pub struct LocationSMBProperties { pub tags: Option<::ValueList<::Tag>>, /// Property [`User`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-locationsmb.html#cfn-datasync-locationsmb-user). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub user: ::Value, } @@ -1011,6 +1476,11 @@ pub struct TaskProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub excludes: Option<::ValueList>, + /// Property [`Includes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-task.html#cfn-datasync-task-includes). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub includes: Option<::ValueList>, /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-datasync-task.html#cfn-datasync-task-name). /// /// Update type: _Mutable_. @@ -1048,6 +1518,9 @@ impl ::serde::Serialize for TaskProperties { if let Some(ref excludes) = self.excludes { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Excludes", excludes)?; } + if let Some(ref includes) = self.includes { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Includes", includes)?; + } if let Some(ref name) = self.name { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; } @@ -1080,6 +1553,7 @@ impl<'de> ::serde::Deserialize<'de> for TaskProperties { let mut cloud_watch_log_group_arn: Option<::Value> = None; let mut destination_location_arn: Option<::Value> = None; let mut excludes: Option<::ValueList> = None; + let mut includes: Option<::ValueList> = None; let mut name: Option<::Value> = None; let mut options: Option<::Value> = None; let mut schedule: Option<::Value> = None; @@ -1097,6 +1571,9 @@ impl<'de> ::serde::Deserialize<'de> for TaskProperties { "Excludes" => { excludes = ::serde::de::MapAccess::next_value(&mut map)?; } + "Includes" => { + includes = ::serde::de::MapAccess::next_value(&mut map)?; + } "Name" => { name = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1120,6 +1597,7 @@ impl<'de> ::serde::Deserialize<'de> for TaskProperties { cloud_watch_log_group_arn: cloud_watch_log_group_arn, destination_location_arn: destination_location_arn.ok_or(::serde::de::Error::missing_field("DestinationLocationArn"))?, excludes: excludes, + includes: includes, name: name, options: options, schedule: schedule, @@ -1218,6 +1696,299 @@ pub mod location_efs { } } +pub mod location_f_sx_open_zfs { + //! Property types for the `LocationFSxOpenZFS` resource. + + /// The [`AWS::DataSync::LocationFSxOpenZFS.MountOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxopenzfs-mountoptions.html) property type. + #[derive(Debug, Default)] + pub struct MountOptions { + /// Property [`Version`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxopenzfs-mountoptions.html#cfn-datasync-locationfsxopenzfs-mountoptions-version). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub version: Option<::Value>, + } + + impl ::codec::SerializeValue for MountOptions { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref version) = self.version { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Version", version)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for MountOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MountOptions; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MountOptions") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut version: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Version" => { + version = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(MountOptions { + version: version, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::DataSync::LocationFSxOpenZFS.NFS`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxopenzfs-nfs.html) property type. + #[derive(Debug, Default)] + pub struct NFS { + /// Property [`MountOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxopenzfs-nfs.html#cfn-datasync-locationfsxopenzfs-nfs-mountoptions). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub mount_options: ::Value, + } + + impl ::codec::SerializeValue for NFS { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MountOptions", &self.mount_options)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for NFS { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = NFS; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type NFS") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut mount_options: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "MountOptions" => { + mount_options = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(NFS { + mount_options: mount_options.ok_or(::serde::de::Error::missing_field("MountOptions"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::DataSync::LocationFSxOpenZFS.Protocol`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxopenzfs-protocol.html) property type. + #[derive(Debug, Default)] + pub struct Protocol { + /// Property [`NFS`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationfsxopenzfs-protocol.html#cfn-datasync-locationfsxopenzfs-protocol-nfs). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub nfs: Option<::Value>, + } + + impl ::codec::SerializeValue for Protocol { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref nfs) = self.nfs { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NFS", nfs)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Protocol { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Protocol; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Protocol") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut nfs: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "NFS" => { + nfs = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Protocol { + nfs: nfs, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + +pub mod location_hdfs { + //! Property types for the `LocationHDFS` resource. + + /// The [`AWS::DataSync::LocationHDFS.NameNode`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationhdfs-namenode.html) property type. + #[derive(Debug, Default)] + pub struct NameNode { + /// Property [`Hostname`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationhdfs-namenode.html#cfn-datasync-locationhdfs-namenode-hostname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub hostname: ::Value, + /// Property [`Port`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationhdfs-namenode.html#cfn-datasync-locationhdfs-namenode-port). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub port: ::Value, + } + + impl ::codec::SerializeValue for NameNode { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Hostname", &self.hostname)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Port", &self.port)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for NameNode { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = NameNode; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type NameNode") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut hostname: Option<::Value> = None; + let mut port: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Hostname" => { + hostname = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Port" => { + port = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(NameNode { + hostname: hostname.ok_or(::serde::de::Error::missing_field("Hostname"))?, + port: port.ok_or(::serde::de::Error::missing_field("Port"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::DataSync::LocationHDFS.QopConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationhdfs-qopconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct QopConfiguration { + /// Property [`DataTransferProtection`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationhdfs-qopconfiguration.html#cfn-datasync-locationhdfs-qopconfiguration-datatransferprotection). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub data_transfer_protection: Option<::Value>, + /// Property [`RpcProtection`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationhdfs-qopconfiguration.html#cfn-datasync-locationhdfs-qopconfiguration-rpcprotection). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub rpc_protection: Option<::Value>, + } + + impl ::codec::SerializeValue for QopConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref data_transfer_protection) = self.data_transfer_protection { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataTransferProtection", data_transfer_protection)?; + } + if let Some(ref rpc_protection) = self.rpc_protection { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RpcProtection", rpc_protection)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for QopConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = QopConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type QopConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut data_transfer_protection: Option<::Value> = None; + let mut rpc_protection: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DataTransferProtection" => { + data_transfer_protection = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RpcProtection" => { + rpc_protection = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(QopConfiguration { + data_transfer_protection: data_transfer_protection, + rpc_protection: rpc_protection, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + pub mod location_nfs { //! Property types for the `LocationNFS` resource. @@ -1226,8 +1997,8 @@ pub mod location_nfs { pub struct MountOptions { /// Property [`Version`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationnfs-mountoptions.html#cfn-datasync-locationnfs-mountoptions-version). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub version: Option<::Value>, } @@ -1279,8 +2050,8 @@ pub mod location_nfs { pub struct OnPremConfig { /// Property [`AgentArns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationnfs-onpremconfig.html#cfn-datasync-locationnfs-onpremconfig-agentarns). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub agent_arns: ::ValueList, } @@ -1389,8 +2160,8 @@ pub mod location_smb { pub struct MountOptions { /// Property [`Version`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-locationsmb-mountoptions.html#cfn-datasync-locationsmb-mountoptions-version). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub version: Option<::Value>, } @@ -1555,6 +2326,11 @@ pub mod task { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub preserve_devices: Option<::Value>, + /// Property [`SecurityDescriptorCopyFlags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-options.html#cfn-datasync-task-options-securitydescriptorcopyflags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub security_descriptor_copy_flags: Option<::Value>, /// Property [`TaskQueueing`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-datasync-task-options.html#cfn-datasync-task-options-taskqueueing). /// /// Update type: _Mutable_. @@ -1607,6 +2383,9 @@ pub mod task { if let Some(ref preserve_devices) = self.preserve_devices { ::serde::ser::SerializeMap::serialize_entry(&mut map, "PreserveDevices", preserve_devices)?; } + if let Some(ref security_descriptor_copy_flags) = self.security_descriptor_copy_flags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityDescriptorCopyFlags", security_descriptor_copy_flags)?; + } if let Some(ref task_queueing) = self.task_queueing { ::serde::ser::SerializeMap::serialize_entry(&mut map, "TaskQueueing", task_queueing)?; } @@ -1644,6 +2423,7 @@ pub mod task { let mut posix_permissions: Option<::Value> = None; let mut preserve_deleted_files: Option<::Value> = None; let mut preserve_devices: Option<::Value> = None; + let mut security_descriptor_copy_flags: Option<::Value> = None; let mut task_queueing: Option<::Value> = None; let mut transfer_mode: Option<::Value> = None; let mut uid: Option<::Value> = None; @@ -1678,6 +2458,9 @@ pub mod task { "PreserveDevices" => { preserve_devices = ::serde::de::MapAccess::next_value(&mut map)?; } + "SecurityDescriptorCopyFlags" => { + security_descriptor_copy_flags = ::serde::de::MapAccess::next_value(&mut map)?; + } "TaskQueueing" => { task_queueing = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1704,6 +2487,7 @@ pub mod task { posix_permissions: posix_permissions, preserve_deleted_files: preserve_deleted_files, preserve_devices: preserve_devices, + security_descriptor_copy_flags: security_descriptor_copy_flags, task_queueing: task_queueing, transfer_mode: transfer_mode, uid: uid, diff --git a/src/aws/devopsguru.rs b/src/aws/devopsguru.rs index 1d9c962..ff624e3 100644 --- a/src/aws/devopsguru.rs +++ b/src/aws/devopsguru.rs @@ -326,6 +326,11 @@ pub mod resource_collection { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub cloud_formation: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devopsguru-resourcecollection-resourcecollectionfilter.html#cfn-devopsguru-resourcecollection-resourcecollectionfilter-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList>, } impl ::codec::SerializeValue for ResourceCollectionFilter { @@ -334,6 +339,9 @@ pub mod resource_collection { if let Some(ref cloud_formation) = self.cloud_formation { ::serde::ser::SerializeMap::serialize_entry(&mut map, "CloudFormation", cloud_formation)?; } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -351,18 +359,89 @@ pub mod resource_collection { fn visit_map>(self, mut map: A) -> Result { let mut cloud_formation: Option<::Value> = None; + let mut tags: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { "CloudFormation" => { cloud_formation = ::serde::de::MapAccess::next_value(&mut map)?; } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } Ok(ResourceCollectionFilter { cloud_formation: cloud_formation, + tags: tags, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::DevOpsGuru::ResourceCollection.TagCollection`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devopsguru-resourcecollection-tagcollection.html) property type. + #[derive(Debug, Default)] + pub struct TagCollection { + /// Property [`AppBoundaryKey`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devopsguru-resourcecollection-tagcollection.html#cfn-devopsguru-resourcecollection-tagcollection-appboundarykey). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub app_boundary_key: Option<::Value>, + /// Property [`TagValues`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-devopsguru-resourcecollection-tagcollection.html#cfn-devopsguru-resourcecollection-tagcollection-tagvalues). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tag_values: Option<::ValueList>, + } + + impl ::codec::SerializeValue for TagCollection { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref app_boundary_key) = self.app_boundary_key { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AppBoundaryKey", app_boundary_key)?; + } + if let Some(ref tag_values) = self.tag_values { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TagValues", tag_values)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for TagCollection { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = TagCollection; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type TagCollection") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut app_boundary_key: Option<::Value> = None; + let mut tag_values: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AppBoundaryKey" => { + app_boundary_key = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TagValues" => { + tag_values = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(TagCollection { + app_boundary_key: app_boundary_key, + tag_values: tag_values, }) } } diff --git a/src/aws/dlm.rs b/src/aws/dlm.rs index 764b82b..ec3ef2e 100644 --- a/src/aws/dlm.rs +++ b/src/aws/dlm.rs @@ -375,6 +375,68 @@ pub mod lifecycle_policy { } } + /// The [`AWS::DLM::LifecyclePolicy.CrossRegionCopyDeprecateRule`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopydeprecaterule.html) property type. + #[derive(Debug, Default)] + pub struct CrossRegionCopyDeprecateRule { + /// Property [`Interval`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopydeprecaterule.html#cfn-dlm-lifecyclepolicy-crossregioncopydeprecaterule-interval). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub interval: ::Value, + /// Property [`IntervalUnit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopydeprecaterule.html#cfn-dlm-lifecyclepolicy-crossregioncopydeprecaterule-intervalunit). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub interval_unit: ::Value, + } + + impl ::codec::SerializeValue for CrossRegionCopyDeprecateRule { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Interval", &self.interval)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IntervalUnit", &self.interval_unit)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CrossRegionCopyDeprecateRule { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CrossRegionCopyDeprecateRule; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CrossRegionCopyDeprecateRule") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut interval: Option<::Value> = None; + let mut interval_unit: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Interval" => { + interval = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IntervalUnit" => { + interval_unit = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CrossRegionCopyDeprecateRule { + interval: interval.ok_or(::serde::de::Error::missing_field("Interval"))?, + interval_unit: interval_unit.ok_or(::serde::de::Error::missing_field("IntervalUnit"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::DLM::LifecyclePolicy.CrossRegionCopyRetainRule`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopyretainrule.html) property type. #[derive(Debug, Default)] pub struct CrossRegionCopyRetainRule { @@ -450,6 +512,11 @@ pub mod lifecycle_policy { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub copy_tags: Option<::Value>, + /// Property [`DeprecateRule`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopyrule.html#cfn-dlm-lifecyclepolicy-crossregioncopyrule-deprecaterule). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub deprecate_rule: Option<::Value>, /// Property [`Encrypted`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-crossregioncopyrule.html#cfn-dlm-lifecyclepolicy-crossregioncopyrule-encrypted). /// /// Update type: _Mutable_. @@ -481,6 +548,9 @@ pub mod lifecycle_policy { if let Some(ref copy_tags) = self.copy_tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "CopyTags", copy_tags)?; } + if let Some(ref deprecate_rule) = self.deprecate_rule { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeprecateRule", deprecate_rule)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "Encrypted", &self.encrypted)?; if let Some(ref retain_rule) = self.retain_rule { ::serde::ser::SerializeMap::serialize_entry(&mut map, "RetainRule", retain_rule)?; @@ -509,6 +579,7 @@ pub mod lifecycle_policy { fn visit_map>(self, mut map: A) -> Result { let mut cmk_arn: Option<::Value> = None; let mut copy_tags: Option<::Value> = None; + let mut deprecate_rule: Option<::Value> = None; let mut encrypted: Option<::Value> = None; let mut retain_rule: Option<::Value> = None; let mut target: Option<::Value> = None; @@ -522,6 +593,9 @@ pub mod lifecycle_policy { "CopyTags" => { copy_tags = ::serde::de::MapAccess::next_value(&mut map)?; } + "DeprecateRule" => { + deprecate_rule = ::serde::de::MapAccess::next_value(&mut map)?; + } "Encrypted" => { encrypted = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -541,6 +615,7 @@ pub mod lifecycle_policy { Ok(CrossRegionCopyRule { cmk_arn: cmk_arn, copy_tags: copy_tags, + deprecate_rule: deprecate_rule, encrypted: encrypted.ok_or(::serde::de::Error::missing_field("Encrypted"))?, retain_rule: retain_rule, target: target, @@ -553,6 +628,85 @@ pub mod lifecycle_policy { } } + /// The [`AWS::DLM::LifecyclePolicy.DeprecateRule`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-deprecaterule.html) property type. + #[derive(Debug, Default)] + pub struct DeprecateRule { + /// Property [`Count`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-deprecaterule.html#cfn-dlm-lifecyclepolicy-deprecaterule-count). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub count: Option<::Value>, + /// Property [`Interval`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-deprecaterule.html#cfn-dlm-lifecyclepolicy-deprecaterule-interval). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub interval: Option<::Value>, + /// Property [`IntervalUnit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-deprecaterule.html#cfn-dlm-lifecyclepolicy-deprecaterule-intervalunit). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub interval_unit: Option<::Value>, + } + + impl ::codec::SerializeValue for DeprecateRule { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref count) = self.count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Count", count)?; + } + if let Some(ref interval) = self.interval { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Interval", interval)?; + } + if let Some(ref interval_unit) = self.interval_unit { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IntervalUnit", interval_unit)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for DeprecateRule { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = DeprecateRule; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type DeprecateRule") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut count: Option<::Value> = None; + let mut interval: Option<::Value> = None; + let mut interval_unit: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Count" => { + count = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Interval" => { + interval = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IntervalUnit" => { + interval_unit = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(DeprecateRule { + count: count, + interval: interval, + interval_unit: interval_unit, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::DLM::LifecyclePolicy.EncryptionConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-encryptionconfiguration.html) property type. #[derive(Debug, Default)] pub struct EncryptionConfiguration { @@ -1155,6 +1309,11 @@ pub mod lifecycle_policy { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub cross_region_copy_rules: Option<::ValueList>, + /// Property [`DeprecateRule`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-schedule.html#cfn-dlm-lifecyclepolicy-schedule-deprecaterule). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub deprecate_rule: Option<::Value>, /// Property [`FastRestoreRule`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dlm-lifecyclepolicy-schedule.html#cfn-dlm-lifecyclepolicy-schedule-fastrestorerule). /// /// Update type: _Mutable_. @@ -1199,6 +1358,9 @@ pub mod lifecycle_policy { if let Some(ref cross_region_copy_rules) = self.cross_region_copy_rules { ::serde::ser::SerializeMap::serialize_entry(&mut map, "CrossRegionCopyRules", cross_region_copy_rules)?; } + if let Some(ref deprecate_rule) = self.deprecate_rule { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeprecateRule", deprecate_rule)?; + } if let Some(ref fast_restore_rule) = self.fast_restore_rule { ::serde::ser::SerializeMap::serialize_entry(&mut map, "FastRestoreRule", fast_restore_rule)?; } @@ -1236,6 +1398,7 @@ pub mod lifecycle_policy { let mut copy_tags: Option<::Value> = None; let mut create_rule: Option<::Value> = None; let mut cross_region_copy_rules: Option<::ValueList> = None; + let mut deprecate_rule: Option<::Value> = None; let mut fast_restore_rule: Option<::Value> = None; let mut name: Option<::Value> = None; let mut retain_rule: Option<::Value> = None; @@ -1254,6 +1417,9 @@ pub mod lifecycle_policy { "CrossRegionCopyRules" => { cross_region_copy_rules = ::serde::de::MapAccess::next_value(&mut map)?; } + "DeprecateRule" => { + deprecate_rule = ::serde::de::MapAccess::next_value(&mut map)?; + } "FastRestoreRule" => { fast_restore_rule = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1280,6 +1446,7 @@ pub mod lifecycle_policy { copy_tags: copy_tags, create_rule: create_rule, cross_region_copy_rules: cross_region_copy_rules, + deprecate_rule: deprecate_rule, fast_restore_rule: fast_restore_rule, name: name, retain_rule: retain_rule, diff --git a/src/aws/dms.rs b/src/aws/dms.rs index 40b2993..0479f5a 100644 --- a/src/aws/dms.rs +++ b/src/aws/dms.rs @@ -158,6 +158,11 @@ pub struct EndpointProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub extra_connection_attributes: Option<::Value>, + /// Property [`GcpMySQLSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-gcpmysqlsettings). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub gcp_my_sql_settings: Option<::Value>, /// Property [`IbmDb2Settings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-ibmdb2settings). /// /// Update type: _Mutable_. @@ -218,6 +223,11 @@ pub struct EndpointProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub postgre_sql_settings: Option<::Value>, + /// Property [`RedisSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-redissettings). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub redis_settings: Option<::Value>, /// Property [`RedshiftSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-redshiftsettings). /// /// Update type: _Mutable_. @@ -250,8 +260,8 @@ pub struct EndpointProperties { pub sybase_settings: Option<::Value>, /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-tags). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub tags: Option<::ValueList<::Tag>>, /// Property [`Username`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-endpoint.html#cfn-dms-endpoint-username). /// @@ -286,6 +296,9 @@ impl ::serde::Serialize for EndpointProperties { if let Some(ref extra_connection_attributes) = self.extra_connection_attributes { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExtraConnectionAttributes", extra_connection_attributes)?; } + if let Some(ref gcp_my_sql_settings) = self.gcp_my_sql_settings { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GcpMySQLSettings", gcp_my_sql_settings)?; + } if let Some(ref ibm_db2_settings) = self.ibm_db2_settings { ::serde::ser::SerializeMap::serialize_entry(&mut map, "IbmDb2Settings", ibm_db2_settings)?; } @@ -322,6 +335,9 @@ impl ::serde::Serialize for EndpointProperties { if let Some(ref postgre_sql_settings) = self.postgre_sql_settings { ::serde::ser::SerializeMap::serialize_entry(&mut map, "PostgreSqlSettings", postgre_sql_settings)?; } + if let Some(ref redis_settings) = self.redis_settings { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RedisSettings", redis_settings)?; + } if let Some(ref redshift_settings) = self.redshift_settings { ::serde::ser::SerializeMap::serialize_entry(&mut map, "RedshiftSettings", redshift_settings)?; } @@ -371,6 +387,7 @@ impl<'de> ::serde::Deserialize<'de> for EndpointProperties { let mut endpoint_type: Option<::Value> = None; let mut engine_name: Option<::Value> = None; let mut extra_connection_attributes: Option<::Value> = None; + let mut gcp_my_sql_settings: Option<::Value> = None; let mut ibm_db2_settings: Option<::Value> = None; let mut kafka_settings: Option<::Value> = None; let mut kinesis_settings: Option<::Value> = None; @@ -383,6 +400,7 @@ impl<'de> ::serde::Deserialize<'de> for EndpointProperties { let mut password: Option<::Value> = None; let mut port: Option<::Value> = None; let mut postgre_sql_settings: Option<::Value> = None; + let mut redis_settings: Option<::Value> = None; let mut redshift_settings: Option<::Value> = None; let mut resource_identifier: Option<::Value> = None; let mut s3_settings: Option<::Value> = None; @@ -421,6 +439,9 @@ impl<'de> ::serde::Deserialize<'de> for EndpointProperties { "ExtraConnectionAttributes" => { extra_connection_attributes = ::serde::de::MapAccess::next_value(&mut map)?; } + "GcpMySQLSettings" => { + gcp_my_sql_settings = ::serde::de::MapAccess::next_value(&mut map)?; + } "IbmDb2Settings" => { ibm_db2_settings = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -457,6 +478,9 @@ impl<'de> ::serde::Deserialize<'de> for EndpointProperties { "PostgreSqlSettings" => { postgre_sql_settings = ::serde::de::MapAccess::next_value(&mut map)?; } + "RedisSettings" => { + redis_settings = ::serde::de::MapAccess::next_value(&mut map)?; + } "RedshiftSettings" => { redshift_settings = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -495,6 +519,7 @@ impl<'de> ::serde::Deserialize<'de> for EndpointProperties { endpoint_type: endpoint_type.ok_or(::serde::de::Error::missing_field("EndpointType"))?, engine_name: engine_name.ok_or(::serde::de::Error::missing_field("EngineName"))?, extra_connection_attributes: extra_connection_attributes, + gcp_my_sql_settings: gcp_my_sql_settings, ibm_db2_settings: ibm_db2_settings, kafka_settings: kafka_settings, kinesis_settings: kinesis_settings, @@ -507,6 +532,7 @@ impl<'de> ::serde::Deserialize<'de> for EndpointProperties { password: password, port: port, postgre_sql_settings: postgre_sql_settings, + redis_settings: redis_settings, redshift_settings: redshift_settings, resource_identifier: resource_identifier, s3_settings: s3_settings, @@ -980,8 +1006,8 @@ pub struct ReplicationSubnetGroupProperties { pub subnet_ids: ::ValueList, /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationsubnetgroup.html#cfn-dms-replicationsubnetgroup-tags). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub tags: Option<::ValueList<::Tag>>, } @@ -1297,6 +1323,21 @@ pub mod endpoint { /// The [`AWS::DMS::Endpoint.DocDbSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-docdbsettings.html) property type. #[derive(Debug, Default)] pub struct DocDbSettings { + /// Property [`DocsToInvestigate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-docdbsettings.html#cfn-dms-endpoint-docdbsettings-docstoinvestigate). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub docs_to_investigate: Option<::Value>, + /// Property [`ExtractDocId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-docdbsettings.html#cfn-dms-endpoint-docdbsettings-extractdocid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub extract_doc_id: Option<::Value>, + /// Property [`NestingLevel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-docdbsettings.html#cfn-dms-endpoint-docdbsettings-nestinglevel). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub nesting_level: Option<::Value>, /// Property [`SecretsManagerAccessRoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-docdbsettings.html#cfn-dms-endpoint-docdbsettings-secretsmanageraccessrolearn). /// /// Update type: _Mutable_. @@ -1312,6 +1353,15 @@ pub mod endpoint { impl ::codec::SerializeValue for DocDbSettings { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref docs_to_investigate) = self.docs_to_investigate { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocsToInvestigate", docs_to_investigate)?; + } + if let Some(ref extract_doc_id) = self.extract_doc_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExtractDocId", extract_doc_id)?; + } + if let Some(ref nesting_level) = self.nesting_level { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NestingLevel", nesting_level)?; + } if let Some(ref secrets_manager_access_role_arn) = self.secrets_manager_access_role_arn { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretsManagerAccessRoleArn", secrets_manager_access_role_arn)?; } @@ -1334,11 +1384,23 @@ pub mod endpoint { } fn visit_map>(self, mut map: A) -> Result { + let mut docs_to_investigate: Option<::Value> = None; + let mut extract_doc_id: Option<::Value> = None; + let mut nesting_level: Option<::Value> = None; let mut secrets_manager_access_role_arn: Option<::Value> = None; let mut secrets_manager_secret_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "DocsToInvestigate" => { + docs_to_investigate = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ExtractDocId" => { + extract_doc_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NestingLevel" => { + nesting_level = ::serde::de::MapAccess::next_value(&mut map)?; + } "SecretsManagerAccessRoleArn" => { secrets_manager_access_role_arn = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1350,6 +1412,9 @@ pub mod endpoint { } Ok(DocDbSettings { + docs_to_investigate: docs_to_investigate, + extract_doc_id: extract_doc_id, + nesting_level: nesting_level, secrets_manager_access_role_arn: secrets_manager_access_role_arn, secrets_manager_secret_id: secrets_manager_secret_id, }) @@ -1505,64 +1570,207 @@ pub mod endpoint { } } - /// The [`AWS::DMS::Endpoint.IbmDb2Settings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-ibmdb2settings.html) property type. + /// The [`AWS::DMS::Endpoint.GcpMySQLSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html) property type. #[derive(Debug, Default)] - pub struct IbmDb2Settings { - /// Property [`SecretsManagerAccessRoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-ibmdb2settings.html#cfn-dms-endpoint-ibmdb2settings-secretsmanageraccessrolearn). + pub struct GcpMySQLSettings { + /// Property [`AfterConnectScript`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-afterconnectscript). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub after_connect_script: Option<::Value>, + /// Property [`CleanSourceMetadataOnMismatch`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-cleansourcemetadataonmismatch). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub clean_source_metadata_on_mismatch: Option<::Value>, + /// Property [`DatabaseName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-databasename). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub database_name: Option<::Value>, + /// Property [`EventsPollInterval`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-eventspollinterval). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub events_poll_interval: Option<::Value>, + /// Property [`MaxFileSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-maxfilesize). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub max_file_size: Option<::Value>, + /// Property [`ParallelLoadThreads`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-parallelloadthreads). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub parallel_load_threads: Option<::Value>, + /// Property [`Password`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-password). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub password: Option<::Value>, + /// Property [`Port`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-port). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub port: Option<::Value>, + /// Property [`SecretsManagerAccessRoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-secretsmanageraccessrolearn). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub secrets_manager_access_role_arn: Option<::Value>, - /// Property [`SecretsManagerSecretId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-ibmdb2settings.html#cfn-dms-endpoint-ibmdb2settings-secretsmanagersecretid). + /// Property [`SecretsManagerSecretId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-secretsmanagersecretid). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub secrets_manager_secret_id: Option<::Value>, + /// Property [`ServerName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-servername). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub server_name: Option<::Value>, + /// Property [`ServerTimezone`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-servertimezone). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub server_timezone: Option<::Value>, + /// Property [`Username`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-gcpmysqlsettings.html#cfn-dms-endpoint-gcpmysqlsettings-username). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub username: Option<::Value>, } - impl ::codec::SerializeValue for IbmDb2Settings { + impl ::codec::SerializeValue for GcpMySQLSettings { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref after_connect_script) = self.after_connect_script { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AfterConnectScript", after_connect_script)?; + } + if let Some(ref clean_source_metadata_on_mismatch) = self.clean_source_metadata_on_mismatch { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CleanSourceMetadataOnMismatch", clean_source_metadata_on_mismatch)?; + } + if let Some(ref database_name) = self.database_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatabaseName", database_name)?; + } + if let Some(ref events_poll_interval) = self.events_poll_interval { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EventsPollInterval", events_poll_interval)?; + } + if let Some(ref max_file_size) = self.max_file_size { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxFileSize", max_file_size)?; + } + if let Some(ref parallel_load_threads) = self.parallel_load_threads { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ParallelLoadThreads", parallel_load_threads)?; + } + if let Some(ref password) = self.password { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Password", password)?; + } + if let Some(ref port) = self.port { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Port", port)?; + } if let Some(ref secrets_manager_access_role_arn) = self.secrets_manager_access_role_arn { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretsManagerAccessRoleArn", secrets_manager_access_role_arn)?; } if let Some(ref secrets_manager_secret_id) = self.secrets_manager_secret_id { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretsManagerSecretId", secrets_manager_secret_id)?; } + if let Some(ref server_name) = self.server_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServerName", server_name)?; + } + if let Some(ref server_timezone) = self.server_timezone { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServerTimezone", server_timezone)?; + } + if let Some(ref username) = self.username { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Username", username)?; + } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for IbmDb2Settings { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for GcpMySQLSettings { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = IbmDb2Settings; + type Value = GcpMySQLSettings; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type IbmDb2Settings") + write!(f, "a struct of type GcpMySQLSettings") } fn visit_map>(self, mut map: A) -> Result { + let mut after_connect_script: Option<::Value> = None; + let mut clean_source_metadata_on_mismatch: Option<::Value> = None; + let mut database_name: Option<::Value> = None; + let mut events_poll_interval: Option<::Value> = None; + let mut max_file_size: Option<::Value> = None; + let mut parallel_load_threads: Option<::Value> = None; + let mut password: Option<::Value> = None; + let mut port: Option<::Value> = None; let mut secrets_manager_access_role_arn: Option<::Value> = None; let mut secrets_manager_secret_id: Option<::Value> = None; + let mut server_name: Option<::Value> = None; + let mut server_timezone: Option<::Value> = None; + let mut username: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "AfterConnectScript" => { + after_connect_script = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CleanSourceMetadataOnMismatch" => { + clean_source_metadata_on_mismatch = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DatabaseName" => { + database_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EventsPollInterval" => { + events_poll_interval = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MaxFileSize" => { + max_file_size = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ParallelLoadThreads" => { + parallel_load_threads = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Password" => { + password = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Port" => { + port = ::serde::de::MapAccess::next_value(&mut map)?; + } "SecretsManagerAccessRoleArn" => { secrets_manager_access_role_arn = ::serde::de::MapAccess::next_value(&mut map)?; } "SecretsManagerSecretId" => { secrets_manager_secret_id = ::serde::de::MapAccess::next_value(&mut map)?; } + "ServerName" => { + server_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ServerTimezone" => { + server_timezone = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Username" => { + username = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } - Ok(IbmDb2Settings { + Ok(GcpMySQLSettings { + after_connect_script: after_connect_script, + clean_source_metadata_on_mismatch: clean_source_metadata_on_mismatch, + database_name: database_name, + events_poll_interval: events_poll_interval, + max_file_size: max_file_size, + parallel_load_threads: parallel_load_threads, + password: password, + port: port, secrets_manager_access_role_arn: secrets_manager_access_role_arn, secrets_manager_secret_id: secrets_manager_secret_id, + server_name: server_name, + server_timezone: server_timezone, + username: username, }) } } @@ -1571,64 +1779,103 @@ pub mod endpoint { } } - /// The [`AWS::DMS::Endpoint.KafkaSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html) property type. + /// The [`AWS::DMS::Endpoint.IbmDb2Settings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-ibmdb2settings.html) property type. #[derive(Debug, Default)] - pub struct KafkaSettings { - /// Property [`Broker`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-broker). + pub struct IbmDb2Settings { + /// Property [`CurrentLsn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-ibmdb2settings.html#cfn-dms-endpoint-ibmdb2settings-currentlsn). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub broker: Option<::Value>, - /// Property [`Topic`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-topic). + pub current_lsn: Option<::Value>, + /// Property [`MaxKBytesPerRead`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-ibmdb2settings.html#cfn-dms-endpoint-ibmdb2settings-maxkbytesperread). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub topic: Option<::Value>, + pub max_k_bytes_per_read: Option<::Value>, + /// Property [`SecretsManagerAccessRoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-ibmdb2settings.html#cfn-dms-endpoint-ibmdb2settings-secretsmanageraccessrolearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub secrets_manager_access_role_arn: Option<::Value>, + /// Property [`SecretsManagerSecretId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-ibmdb2settings.html#cfn-dms-endpoint-ibmdb2settings-secretsmanagersecretid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub secrets_manager_secret_id: Option<::Value>, + /// Property [`SetDataCaptureChanges`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-ibmdb2settings.html#cfn-dms-endpoint-ibmdb2settings-setdatacapturechanges). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub set_data_capture_changes: Option<::Value>, } - impl ::codec::SerializeValue for KafkaSettings { + impl ::codec::SerializeValue for IbmDb2Settings { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref broker) = self.broker { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Broker", broker)?; + if let Some(ref current_lsn) = self.current_lsn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CurrentLsn", current_lsn)?; } - if let Some(ref topic) = self.topic { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Topic", topic)?; + if let Some(ref max_k_bytes_per_read) = self.max_k_bytes_per_read { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxKBytesPerRead", max_k_bytes_per_read)?; + } + if let Some(ref secrets_manager_access_role_arn) = self.secrets_manager_access_role_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretsManagerAccessRoleArn", secrets_manager_access_role_arn)?; + } + if let Some(ref secrets_manager_secret_id) = self.secrets_manager_secret_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretsManagerSecretId", secrets_manager_secret_id)?; + } + if let Some(ref set_data_capture_changes) = self.set_data_capture_changes { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SetDataCaptureChanges", set_data_capture_changes)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for KafkaSettings { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for IbmDb2Settings { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = KafkaSettings; + type Value = IbmDb2Settings; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type KafkaSettings") + write!(f, "a struct of type IbmDb2Settings") } fn visit_map>(self, mut map: A) -> Result { - let mut broker: Option<::Value> = None; - let mut topic: Option<::Value> = None; + let mut current_lsn: Option<::Value> = None; + let mut max_k_bytes_per_read: Option<::Value> = None; + let mut secrets_manager_access_role_arn: Option<::Value> = None; + let mut secrets_manager_secret_id: Option<::Value> = None; + let mut set_data_capture_changes: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Broker" => { - broker = ::serde::de::MapAccess::next_value(&mut map)?; + "CurrentLsn" => { + current_lsn = ::serde::de::MapAccess::next_value(&mut map)?; } - "Topic" => { - topic = ::serde::de::MapAccess::next_value(&mut map)?; + "MaxKBytesPerRead" => { + max_k_bytes_per_read = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SecretsManagerAccessRoleArn" => { + secrets_manager_access_role_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SecretsManagerSecretId" => { + secrets_manager_secret_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SetDataCaptureChanges" => { + set_data_capture_changes = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(KafkaSettings { - broker: broker, - topic: topic, + Ok(IbmDb2Settings { + current_lsn: current_lsn, + max_k_bytes_per_read: max_k_bytes_per_read, + secrets_manager_access_role_arn: secrets_manager_access_role_arn, + secrets_manager_secret_id: secrets_manager_secret_id, + set_data_capture_changes: set_data_capture_changes, }) } } @@ -1637,31 +1884,361 @@ pub mod endpoint { } } - /// The [`AWS::DMS::Endpoint.KinesisSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html) property type. + /// The [`AWS::DMS::Endpoint.KafkaSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html) property type. #[derive(Debug, Default)] - pub struct KinesisSettings { - /// Property [`MessageFormat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html#cfn-dms-endpoint-kinesissettings-messageformat). + pub struct KafkaSettings { + /// Property [`Broker`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-broker). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub broker: Option<::Value>, + /// Property [`IncludeControlDetails`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-includecontroldetails). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub include_control_details: Option<::Value>, + /// Property [`IncludeNullAndEmpty`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-includenullandempty). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub include_null_and_empty: Option<::Value>, + /// Property [`IncludePartitionValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-includepartitionvalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub include_partition_value: Option<::Value>, + /// Property [`IncludeTableAlterOperations`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-includetablealteroperations). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub include_table_alter_operations: Option<::Value>, + /// Property [`IncludeTransactionDetails`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-includetransactiondetails). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub include_transaction_details: Option<::Value>, + /// Property [`MessageFormat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-messageformat). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub message_format: Option<::Value>, - /// Property [`ServiceAccessRoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html#cfn-dms-endpoint-kinesissettings-serviceaccessrolearn). + /// Property [`MessageMaxBytes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-messagemaxbytes). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub service_access_role_arn: Option<::Value>, - /// Property [`StreamArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html#cfn-dms-endpoint-kinesissettings-streamarn). + pub message_max_bytes: Option<::Value>, + /// Property [`NoHexPrefix`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-nohexprefix). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub stream_arn: Option<::Value>, - } - - impl ::codec::SerializeValue for KinesisSettings { - fn serialize(&self, s: S) -> Result { - let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref message_format) = self.message_format { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "MessageFormat", message_format)?; + pub no_hex_prefix: Option<::Value>, + /// Property [`PartitionIncludeSchemaTable`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-partitionincludeschematable). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub partition_include_schema_table: Option<::Value>, + /// Property [`SaslPassword`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-saslpassword). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub sasl_password: Option<::Value>, + /// Property [`SaslUserName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-saslusername). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub sasl_user_name: Option<::Value>, + /// Property [`SecurityProtocol`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-securityprotocol). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub security_protocol: Option<::Value>, + /// Property [`SslCaCertificateArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-sslcacertificatearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ssl_ca_certificate_arn: Option<::Value>, + /// Property [`SslClientCertificateArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-sslclientcertificatearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ssl_client_certificate_arn: Option<::Value>, + /// Property [`SslClientKeyArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-sslclientkeyarn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ssl_client_key_arn: Option<::Value>, + /// Property [`SslClientKeyPassword`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-sslclientkeypassword). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ssl_client_key_password: Option<::Value>, + /// Property [`Topic`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kafkasettings.html#cfn-dms-endpoint-kafkasettings-topic). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub topic: Option<::Value>, + } + + impl ::codec::SerializeValue for KafkaSettings { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref broker) = self.broker { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Broker", broker)?; + } + if let Some(ref include_control_details) = self.include_control_details { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludeControlDetails", include_control_details)?; + } + if let Some(ref include_null_and_empty) = self.include_null_and_empty { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludeNullAndEmpty", include_null_and_empty)?; + } + if let Some(ref include_partition_value) = self.include_partition_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludePartitionValue", include_partition_value)?; + } + if let Some(ref include_table_alter_operations) = self.include_table_alter_operations { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludeTableAlterOperations", include_table_alter_operations)?; + } + if let Some(ref include_transaction_details) = self.include_transaction_details { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludeTransactionDetails", include_transaction_details)?; + } + if let Some(ref message_format) = self.message_format { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MessageFormat", message_format)?; + } + if let Some(ref message_max_bytes) = self.message_max_bytes { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MessageMaxBytes", message_max_bytes)?; + } + if let Some(ref no_hex_prefix) = self.no_hex_prefix { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NoHexPrefix", no_hex_prefix)?; + } + if let Some(ref partition_include_schema_table) = self.partition_include_schema_table { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PartitionIncludeSchemaTable", partition_include_schema_table)?; + } + if let Some(ref sasl_password) = self.sasl_password { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SaslPassword", sasl_password)?; + } + if let Some(ref sasl_user_name) = self.sasl_user_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SaslUserName", sasl_user_name)?; + } + if let Some(ref security_protocol) = self.security_protocol { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityProtocol", security_protocol)?; + } + if let Some(ref ssl_ca_certificate_arn) = self.ssl_ca_certificate_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SslCaCertificateArn", ssl_ca_certificate_arn)?; + } + if let Some(ref ssl_client_certificate_arn) = self.ssl_client_certificate_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SslClientCertificateArn", ssl_client_certificate_arn)?; + } + if let Some(ref ssl_client_key_arn) = self.ssl_client_key_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SslClientKeyArn", ssl_client_key_arn)?; + } + if let Some(ref ssl_client_key_password) = self.ssl_client_key_password { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SslClientKeyPassword", ssl_client_key_password)?; + } + if let Some(ref topic) = self.topic { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Topic", topic)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for KafkaSettings { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = KafkaSettings; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type KafkaSettings") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut broker: Option<::Value> = None; + let mut include_control_details: Option<::Value> = None; + let mut include_null_and_empty: Option<::Value> = None; + let mut include_partition_value: Option<::Value> = None; + let mut include_table_alter_operations: Option<::Value> = None; + let mut include_transaction_details: Option<::Value> = None; + let mut message_format: Option<::Value> = None; + let mut message_max_bytes: Option<::Value> = None; + let mut no_hex_prefix: Option<::Value> = None; + let mut partition_include_schema_table: Option<::Value> = None; + let mut sasl_password: Option<::Value> = None; + let mut sasl_user_name: Option<::Value> = None; + let mut security_protocol: Option<::Value> = None; + let mut ssl_ca_certificate_arn: Option<::Value> = None; + let mut ssl_client_certificate_arn: Option<::Value> = None; + let mut ssl_client_key_arn: Option<::Value> = None; + let mut ssl_client_key_password: Option<::Value> = None; + let mut topic: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Broker" => { + broker = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IncludeControlDetails" => { + include_control_details = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IncludeNullAndEmpty" => { + include_null_and_empty = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IncludePartitionValue" => { + include_partition_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IncludeTableAlterOperations" => { + include_table_alter_operations = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IncludeTransactionDetails" => { + include_transaction_details = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MessageFormat" => { + message_format = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MessageMaxBytes" => { + message_max_bytes = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NoHexPrefix" => { + no_hex_prefix = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PartitionIncludeSchemaTable" => { + partition_include_schema_table = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SaslPassword" => { + sasl_password = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SaslUserName" => { + sasl_user_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SecurityProtocol" => { + security_protocol = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SslCaCertificateArn" => { + ssl_ca_certificate_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SslClientCertificateArn" => { + ssl_client_certificate_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SslClientKeyArn" => { + ssl_client_key_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SslClientKeyPassword" => { + ssl_client_key_password = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Topic" => { + topic = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(KafkaSettings { + broker: broker, + include_control_details: include_control_details, + include_null_and_empty: include_null_and_empty, + include_partition_value: include_partition_value, + include_table_alter_operations: include_table_alter_operations, + include_transaction_details: include_transaction_details, + message_format: message_format, + message_max_bytes: message_max_bytes, + no_hex_prefix: no_hex_prefix, + partition_include_schema_table: partition_include_schema_table, + sasl_password: sasl_password, + sasl_user_name: sasl_user_name, + security_protocol: security_protocol, + ssl_ca_certificate_arn: ssl_ca_certificate_arn, + ssl_client_certificate_arn: ssl_client_certificate_arn, + ssl_client_key_arn: ssl_client_key_arn, + ssl_client_key_password: ssl_client_key_password, + topic: topic, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::DMS::Endpoint.KinesisSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html) property type. + #[derive(Debug, Default)] + pub struct KinesisSettings { + /// Property [`IncludeControlDetails`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html#cfn-dms-endpoint-kinesissettings-includecontroldetails). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub include_control_details: Option<::Value>, + /// Property [`IncludeNullAndEmpty`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html#cfn-dms-endpoint-kinesissettings-includenullandempty). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub include_null_and_empty: Option<::Value>, + /// Property [`IncludePartitionValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html#cfn-dms-endpoint-kinesissettings-includepartitionvalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub include_partition_value: Option<::Value>, + /// Property [`IncludeTableAlterOperations`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html#cfn-dms-endpoint-kinesissettings-includetablealteroperations). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub include_table_alter_operations: Option<::Value>, + /// Property [`IncludeTransactionDetails`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html#cfn-dms-endpoint-kinesissettings-includetransactiondetails). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub include_transaction_details: Option<::Value>, + /// Property [`MessageFormat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html#cfn-dms-endpoint-kinesissettings-messageformat). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub message_format: Option<::Value>, + /// Property [`NoHexPrefix`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html#cfn-dms-endpoint-kinesissettings-nohexprefix). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub no_hex_prefix: Option<::Value>, + /// Property [`PartitionIncludeSchemaTable`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html#cfn-dms-endpoint-kinesissettings-partitionincludeschematable). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub partition_include_schema_table: Option<::Value>, + /// Property [`ServiceAccessRoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html#cfn-dms-endpoint-kinesissettings-serviceaccessrolearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub service_access_role_arn: Option<::Value>, + /// Property [`StreamArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-kinesissettings.html#cfn-dms-endpoint-kinesissettings-streamarn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub stream_arn: Option<::Value>, + } + + impl ::codec::SerializeValue for KinesisSettings { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref include_control_details) = self.include_control_details { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludeControlDetails", include_control_details)?; + } + if let Some(ref include_null_and_empty) = self.include_null_and_empty { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludeNullAndEmpty", include_null_and_empty)?; + } + if let Some(ref include_partition_value) = self.include_partition_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludePartitionValue", include_partition_value)?; + } + if let Some(ref include_table_alter_operations) = self.include_table_alter_operations { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludeTableAlterOperations", include_table_alter_operations)?; + } + if let Some(ref include_transaction_details) = self.include_transaction_details { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludeTransactionDetails", include_transaction_details)?; + } + if let Some(ref message_format) = self.message_format { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MessageFormat", message_format)?; + } + if let Some(ref no_hex_prefix) = self.no_hex_prefix { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NoHexPrefix", no_hex_prefix)?; + } + if let Some(ref partition_include_schema_table) = self.partition_include_schema_table { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PartitionIncludeSchemaTable", partition_include_schema_table)?; } if let Some(ref service_access_role_arn) = self.service_access_role_arn { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServiceAccessRoleArn", service_access_role_arn)?; @@ -1685,15 +2262,43 @@ pub mod endpoint { } fn visit_map>(self, mut map: A) -> Result { + let mut include_control_details: Option<::Value> = None; + let mut include_null_and_empty: Option<::Value> = None; + let mut include_partition_value: Option<::Value> = None; + let mut include_table_alter_operations: Option<::Value> = None; + let mut include_transaction_details: Option<::Value> = None; let mut message_format: Option<::Value> = None; + let mut no_hex_prefix: Option<::Value> = None; + let mut partition_include_schema_table: Option<::Value> = None; let mut service_access_role_arn: Option<::Value> = None; let mut stream_arn: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "IncludeControlDetails" => { + include_control_details = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IncludeNullAndEmpty" => { + include_null_and_empty = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IncludePartitionValue" => { + include_partition_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IncludeTableAlterOperations" => { + include_table_alter_operations = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IncludeTransactionDetails" => { + include_transaction_details = ::serde::de::MapAccess::next_value(&mut map)?; + } "MessageFormat" => { message_format = ::serde::de::MapAccess::next_value(&mut map)?; } + "NoHexPrefix" => { + no_hex_prefix = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PartitionIncludeSchemaTable" => { + partition_include_schema_table = ::serde::de::MapAccess::next_value(&mut map)?; + } "ServiceAccessRoleArn" => { service_access_role_arn = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1705,7 +2310,14 @@ pub mod endpoint { } Ok(KinesisSettings { + include_control_details: include_control_details, + include_null_and_empty: include_null_and_empty, + include_partition_value: include_partition_value, + include_table_alter_operations: include_table_alter_operations, + include_transaction_details: include_transaction_details, message_format: message_format, + no_hex_prefix: no_hex_prefix, + partition_include_schema_table: partition_include_schema_table, service_access_role_arn: service_access_role_arn, stream_arn: stream_arn, }) @@ -1719,6 +2331,31 @@ pub mod endpoint { /// The [`AWS::DMS::Endpoint.MicrosoftSqlServerSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-microsoftsqlserversettings.html) property type. #[derive(Debug, Default)] pub struct MicrosoftSqlServerSettings { + /// Property [`BcpPacketSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-microsoftsqlserversettings.html#cfn-dms-endpoint-microsoftsqlserversettings-bcppacketsize). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub bcp_packet_size: Option<::Value>, + /// Property [`ControlTablesFileGroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-microsoftsqlserversettings.html#cfn-dms-endpoint-microsoftsqlserversettings-controltablesfilegroup). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub control_tables_file_group: Option<::Value>, + /// Property [`QuerySingleAlwaysOnNode`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-microsoftsqlserversettings.html#cfn-dms-endpoint-microsoftsqlserversettings-querysinglealwaysonnode). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub query_single_always_on_node: Option<::Value>, + /// Property [`ReadBackupOnly`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-microsoftsqlserversettings.html#cfn-dms-endpoint-microsoftsqlserversettings-readbackuponly). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub read_backup_only: Option<::Value>, + /// Property [`SafeguardPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-microsoftsqlserversettings.html#cfn-dms-endpoint-microsoftsqlserversettings-safeguardpolicy). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub safeguard_policy: Option<::Value>, /// Property [`SecretsManagerAccessRoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-microsoftsqlserversettings.html#cfn-dms-endpoint-microsoftsqlserversettings-secretsmanageraccessrolearn). /// /// Update type: _Mutable_. @@ -1729,17 +2366,48 @@ pub mod endpoint { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub secrets_manager_secret_id: Option<::Value>, + /// Property [`UseBcpFullLoad`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-microsoftsqlserversettings.html#cfn-dms-endpoint-microsoftsqlserversettings-usebcpfullload). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub use_bcp_full_load: Option<::Value>, + /// Property [`UseThirdPartyBackupDevice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-microsoftsqlserversettings.html#cfn-dms-endpoint-microsoftsqlserversettings-usethirdpartybackupdevice). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub use_third_party_backup_device: Option<::Value>, } impl ::codec::SerializeValue for MicrosoftSqlServerSettings { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref bcp_packet_size) = self.bcp_packet_size { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BcpPacketSize", bcp_packet_size)?; + } + if let Some(ref control_tables_file_group) = self.control_tables_file_group { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ControlTablesFileGroup", control_tables_file_group)?; + } + if let Some(ref query_single_always_on_node) = self.query_single_always_on_node { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "QuerySingleAlwaysOnNode", query_single_always_on_node)?; + } + if let Some(ref read_backup_only) = self.read_backup_only { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReadBackupOnly", read_backup_only)?; + } + if let Some(ref safeguard_policy) = self.safeguard_policy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SafeguardPolicy", safeguard_policy)?; + } if let Some(ref secrets_manager_access_role_arn) = self.secrets_manager_access_role_arn { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretsManagerAccessRoleArn", secrets_manager_access_role_arn)?; } if let Some(ref secrets_manager_secret_id) = self.secrets_manager_secret_id { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretsManagerSecretId", secrets_manager_secret_id)?; } + if let Some(ref use_bcp_full_load) = self.use_bcp_full_load { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UseBcpFullLoad", use_bcp_full_load)?; + } + if let Some(ref use_third_party_backup_device) = self.use_third_party_backup_device { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UseThirdPartyBackupDevice", use_third_party_backup_device)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -1756,24 +2424,59 @@ pub mod endpoint { } fn visit_map>(self, mut map: A) -> Result { + let mut bcp_packet_size: Option<::Value> = None; + let mut control_tables_file_group: Option<::Value> = None; + let mut query_single_always_on_node: Option<::Value> = None; + let mut read_backup_only: Option<::Value> = None; + let mut safeguard_policy: Option<::Value> = None; let mut secrets_manager_access_role_arn: Option<::Value> = None; let mut secrets_manager_secret_id: Option<::Value> = None; + let mut use_bcp_full_load: Option<::Value> = None; + let mut use_third_party_backup_device: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "BcpPacketSize" => { + bcp_packet_size = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ControlTablesFileGroup" => { + control_tables_file_group = ::serde::de::MapAccess::next_value(&mut map)?; + } + "QuerySingleAlwaysOnNode" => { + query_single_always_on_node = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ReadBackupOnly" => { + read_backup_only = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SafeguardPolicy" => { + safeguard_policy = ::serde::de::MapAccess::next_value(&mut map)?; + } "SecretsManagerAccessRoleArn" => { secrets_manager_access_role_arn = ::serde::de::MapAccess::next_value(&mut map)?; } "SecretsManagerSecretId" => { secrets_manager_secret_id = ::serde::de::MapAccess::next_value(&mut map)?; } + "UseBcpFullLoad" => { + use_bcp_full_load = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UseThirdPartyBackupDevice" => { + use_third_party_backup_device = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } Ok(MicrosoftSqlServerSettings { + bcp_packet_size: bcp_packet_size, + control_tables_file_group: control_tables_file_group, + query_single_always_on_node: query_single_always_on_node, + read_backup_only: read_backup_only, + safeguard_policy: safeguard_policy, secrets_manager_access_role_arn: secrets_manager_access_role_arn, secrets_manager_secret_id: secrets_manager_secret_id, + use_bcp_full_load: use_bcp_full_load, + use_third_party_backup_device: use_third_party_backup_device, }) } } @@ -1994,6 +2697,31 @@ pub mod endpoint { /// The [`AWS::DMS::Endpoint.MySqlSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mysqlsettings.html) property type. #[derive(Debug, Default)] pub struct MySqlSettings { + /// Property [`AfterConnectScript`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mysqlsettings.html#cfn-dms-endpoint-mysqlsettings-afterconnectscript). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub after_connect_script: Option<::Value>, + /// Property [`CleanSourceMetadataOnMismatch`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mysqlsettings.html#cfn-dms-endpoint-mysqlsettings-cleansourcemetadataonmismatch). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub clean_source_metadata_on_mismatch: Option<::Value>, + /// Property [`EventsPollInterval`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mysqlsettings.html#cfn-dms-endpoint-mysqlsettings-eventspollinterval). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub events_poll_interval: Option<::Value>, + /// Property [`MaxFileSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mysqlsettings.html#cfn-dms-endpoint-mysqlsettings-maxfilesize). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub max_file_size: Option<::Value>, + /// Property [`ParallelLoadThreads`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mysqlsettings.html#cfn-dms-endpoint-mysqlsettings-parallelloadthreads). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub parallel_load_threads: Option<::Value>, /// Property [`SecretsManagerAccessRoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mysqlsettings.html#cfn-dms-endpoint-mysqlsettings-secretsmanageraccessrolearn). /// /// Update type: _Mutable_. @@ -2004,17 +2732,48 @@ pub mod endpoint { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub secrets_manager_secret_id: Option<::Value>, + /// Property [`ServerTimezone`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mysqlsettings.html#cfn-dms-endpoint-mysqlsettings-servertimezone). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub server_timezone: Option<::Value>, + /// Property [`TargetDbType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-mysqlsettings.html#cfn-dms-endpoint-mysqlsettings-targetdbtype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub target_db_type: Option<::Value>, } impl ::codec::SerializeValue for MySqlSettings { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref after_connect_script) = self.after_connect_script { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AfterConnectScript", after_connect_script)?; + } + if let Some(ref clean_source_metadata_on_mismatch) = self.clean_source_metadata_on_mismatch { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CleanSourceMetadataOnMismatch", clean_source_metadata_on_mismatch)?; + } + if let Some(ref events_poll_interval) = self.events_poll_interval { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EventsPollInterval", events_poll_interval)?; + } + if let Some(ref max_file_size) = self.max_file_size { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxFileSize", max_file_size)?; + } + if let Some(ref parallel_load_threads) = self.parallel_load_threads { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ParallelLoadThreads", parallel_load_threads)?; + } if let Some(ref secrets_manager_access_role_arn) = self.secrets_manager_access_role_arn { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretsManagerAccessRoleArn", secrets_manager_access_role_arn)?; } if let Some(ref secrets_manager_secret_id) = self.secrets_manager_secret_id { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretsManagerSecretId", secrets_manager_secret_id)?; } + if let Some(ref server_timezone) = self.server_timezone { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServerTimezone", server_timezone)?; + } + if let Some(ref target_db_type) = self.target_db_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetDbType", target_db_type)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -2031,24 +2790,59 @@ pub mod endpoint { } fn visit_map>(self, mut map: A) -> Result { + let mut after_connect_script: Option<::Value> = None; + let mut clean_source_metadata_on_mismatch: Option<::Value> = None; + let mut events_poll_interval: Option<::Value> = None; + let mut max_file_size: Option<::Value> = None; + let mut parallel_load_threads: Option<::Value> = None; let mut secrets_manager_access_role_arn: Option<::Value> = None; let mut secrets_manager_secret_id: Option<::Value> = None; + let mut server_timezone: Option<::Value> = None; + let mut target_db_type: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "AfterConnectScript" => { + after_connect_script = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CleanSourceMetadataOnMismatch" => { + clean_source_metadata_on_mismatch = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EventsPollInterval" => { + events_poll_interval = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MaxFileSize" => { + max_file_size = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ParallelLoadThreads" => { + parallel_load_threads = ::serde::de::MapAccess::next_value(&mut map)?; + } "SecretsManagerAccessRoleArn" => { secrets_manager_access_role_arn = ::serde::de::MapAccess::next_value(&mut map)?; } "SecretsManagerSecretId" => { secrets_manager_secret_id = ::serde::de::MapAccess::next_value(&mut map)?; } + "ServerTimezone" => { + server_timezone = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TargetDbType" => { + target_db_type = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } Ok(MySqlSettings { + after_connect_script: after_connect_script, + clean_source_metadata_on_mismatch: clean_source_metadata_on_mismatch, + events_poll_interval: events_poll_interval, + max_file_size: max_file_size, + parallel_load_threads: parallel_load_threads, secrets_manager_access_role_arn: secrets_manager_access_role_arn, secrets_manager_secret_id: secrets_manager_secret_id, + server_timezone: server_timezone, + target_db_type: target_db_type, }) } } @@ -2191,6 +2985,116 @@ pub mod endpoint { /// The [`AWS::DMS::Endpoint.OracleSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html) property type. #[derive(Debug, Default)] pub struct OracleSettings { + /// Property [`AccessAlternateDirectly`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-accessalternatedirectly). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub access_alternate_directly: Option<::Value>, + /// Property [`AddSupplementalLogging`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-addsupplementallogging). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub add_supplemental_logging: Option<::Value>, + /// Property [`AdditionalArchivedLogDestId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-additionalarchivedlogdestid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub additional_archived_log_dest_id: Option<::Value>, + /// Property [`AllowSelectNestedTables`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-allowselectnestedtables). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub allow_select_nested_tables: Option<::Value>, + /// Property [`ArchivedLogDestId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-archivedlogdestid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub archived_log_dest_id: Option<::Value>, + /// Property [`ArchivedLogsOnly`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-archivedlogsonly). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub archived_logs_only: Option<::Value>, + /// Property [`AsmPassword`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-asmpassword). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub asm_password: Option<::Value>, + /// Property [`AsmServer`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-asmserver). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub asm_server: Option<::Value>, + /// Property [`AsmUser`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-asmuser). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub asm_user: Option<::Value>, + /// Property [`CharLengthSemantics`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-charlengthsemantics). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub char_length_semantics: Option<::Value>, + /// Property [`DirectPathNoLog`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-directpathnolog). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub direct_path_no_log: Option<::Value>, + /// Property [`DirectPathParallelLoad`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-directpathparallelload). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub direct_path_parallel_load: Option<::Value>, + /// Property [`EnableHomogenousTablespace`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-enablehomogenoustablespace). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enable_homogenous_tablespace: Option<::Value>, + /// Property [`ExtraArchivedLogDestIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-extraarchivedlogdestids). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub extra_archived_log_dest_ids: Option<::ValueList>, + /// Property [`FailTasksOnLobTruncation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-failtasksonlobtruncation). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub fail_tasks_on_lob_truncation: Option<::Value>, + /// Property [`NumberDatatypeScale`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-numberdatatypescale). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub number_datatype_scale: Option<::Value>, + /// Property [`OraclePathPrefix`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-oraclepathprefix). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub oracle_path_prefix: Option<::Value>, + /// Property [`ParallelAsmReadThreads`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-parallelasmreadthreads). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub parallel_asm_read_threads: Option<::Value>, + /// Property [`ReadAheadBlocks`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-readaheadblocks). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub read_ahead_blocks: Option<::Value>, + /// Property [`ReadTableSpaceName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-readtablespacename). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub read_table_space_name: Option<::Value>, + /// Property [`ReplacePathPrefix`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-replacepathprefix). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub replace_path_prefix: Option<::Value>, + /// Property [`RetryInterval`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-retryinterval). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub retry_interval: Option<::Value>, /// Property [`SecretsManagerAccessRoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-secretsmanageraccessrolearn). /// /// Update type: _Mutable_. @@ -2211,11 +3115,122 @@ pub mod endpoint { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub secrets_manager_secret_id: Option<::Value>, + /// Property [`SecurityDbEncryption`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-securitydbencryption). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub security_db_encryption: Option<::Value>, + /// Property [`SecurityDbEncryptionName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-securitydbencryptionname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub security_db_encryption_name: Option<::Value>, + /// Property [`SpatialDataOptionToGeoJsonFunctionName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-spatialdataoptiontogeojsonfunctionname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub spatial_data_option_to_geo_json_function_name: Option<::Value>, + /// Property [`StandbyDelayTime`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-standbydelaytime). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub standby_delay_time: Option<::Value>, + /// Property [`UseAlternateFolderForOnline`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-usealternatefolderforonline). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub use_alternate_folder_for_online: Option<::Value>, + /// Property [`UseBFile`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-usebfile). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub use_b_file: Option<::Value>, + /// Property [`UseDirectPathFullLoad`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-usedirectpathfullload). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub use_direct_path_full_load: Option<::Value>, + /// Property [`UseLogminerReader`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-uselogminerreader). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub use_logminer_reader: Option<::Value>, + /// Property [`UsePathPrefix`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-oraclesettings.html#cfn-dms-endpoint-oraclesettings-usepathprefix). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub use_path_prefix: Option<::Value>, } impl ::codec::SerializeValue for OracleSettings { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref access_alternate_directly) = self.access_alternate_directly { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AccessAlternateDirectly", access_alternate_directly)?; + } + if let Some(ref add_supplemental_logging) = self.add_supplemental_logging { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AddSupplementalLogging", add_supplemental_logging)?; + } + if let Some(ref additional_archived_log_dest_id) = self.additional_archived_log_dest_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AdditionalArchivedLogDestId", additional_archived_log_dest_id)?; + } + if let Some(ref allow_select_nested_tables) = self.allow_select_nested_tables { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AllowSelectNestedTables", allow_select_nested_tables)?; + } + if let Some(ref archived_log_dest_id) = self.archived_log_dest_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ArchivedLogDestId", archived_log_dest_id)?; + } + if let Some(ref archived_logs_only) = self.archived_logs_only { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ArchivedLogsOnly", archived_logs_only)?; + } + if let Some(ref asm_password) = self.asm_password { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AsmPassword", asm_password)?; + } + if let Some(ref asm_server) = self.asm_server { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AsmServer", asm_server)?; + } + if let Some(ref asm_user) = self.asm_user { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AsmUser", asm_user)?; + } + if let Some(ref char_length_semantics) = self.char_length_semantics { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CharLengthSemantics", char_length_semantics)?; + } + if let Some(ref direct_path_no_log) = self.direct_path_no_log { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DirectPathNoLog", direct_path_no_log)?; + } + if let Some(ref direct_path_parallel_load) = self.direct_path_parallel_load { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DirectPathParallelLoad", direct_path_parallel_load)?; + } + if let Some(ref enable_homogenous_tablespace) = self.enable_homogenous_tablespace { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EnableHomogenousTablespace", enable_homogenous_tablespace)?; + } + if let Some(ref extra_archived_log_dest_ids) = self.extra_archived_log_dest_ids { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExtraArchivedLogDestIds", extra_archived_log_dest_ids)?; + } + if let Some(ref fail_tasks_on_lob_truncation) = self.fail_tasks_on_lob_truncation { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FailTasksOnLobTruncation", fail_tasks_on_lob_truncation)?; + } + if let Some(ref number_datatype_scale) = self.number_datatype_scale { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NumberDatatypeScale", number_datatype_scale)?; + } + if let Some(ref oracle_path_prefix) = self.oracle_path_prefix { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OraclePathPrefix", oracle_path_prefix)?; + } + if let Some(ref parallel_asm_read_threads) = self.parallel_asm_read_threads { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ParallelAsmReadThreads", parallel_asm_read_threads)?; + } + if let Some(ref read_ahead_blocks) = self.read_ahead_blocks { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReadAheadBlocks", read_ahead_blocks)?; + } + if let Some(ref read_table_space_name) = self.read_table_space_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReadTableSpaceName", read_table_space_name)?; + } + if let Some(ref replace_path_prefix) = self.replace_path_prefix { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReplacePathPrefix", replace_path_prefix)?; + } + if let Some(ref retry_interval) = self.retry_interval { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RetryInterval", retry_interval)?; + } if let Some(ref secrets_manager_access_role_arn) = self.secrets_manager_access_role_arn { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretsManagerAccessRoleArn", secrets_manager_access_role_arn)?; } @@ -2228,6 +3243,33 @@ pub mod endpoint { if let Some(ref secrets_manager_secret_id) = self.secrets_manager_secret_id { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretsManagerSecretId", secrets_manager_secret_id)?; } + if let Some(ref security_db_encryption) = self.security_db_encryption { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityDbEncryption", security_db_encryption)?; + } + if let Some(ref security_db_encryption_name) = self.security_db_encryption_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityDbEncryptionName", security_db_encryption_name)?; + } + if let Some(ref spatial_data_option_to_geo_json_function_name) = self.spatial_data_option_to_geo_json_function_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpatialDataOptionToGeoJsonFunctionName", spatial_data_option_to_geo_json_function_name)?; + } + if let Some(ref standby_delay_time) = self.standby_delay_time { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "StandbyDelayTime", standby_delay_time)?; + } + if let Some(ref use_alternate_folder_for_online) = self.use_alternate_folder_for_online { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UseAlternateFolderForOnline", use_alternate_folder_for_online)?; + } + if let Some(ref use_b_file) = self.use_b_file { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UseBFile", use_b_file)?; + } + if let Some(ref use_direct_path_full_load) = self.use_direct_path_full_load { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UseDirectPathFullLoad", use_direct_path_full_load)?; + } + if let Some(ref use_logminer_reader) = self.use_logminer_reader { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UseLogminerReader", use_logminer_reader)?; + } + if let Some(ref use_path_prefix) = self.use_path_prefix { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UsePathPrefix", use_path_prefix)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -2244,13 +3286,110 @@ pub mod endpoint { } fn visit_map>(self, mut map: A) -> Result { + let mut access_alternate_directly: Option<::Value> = None; + let mut add_supplemental_logging: Option<::Value> = None; + let mut additional_archived_log_dest_id: Option<::Value> = None; + let mut allow_select_nested_tables: Option<::Value> = None; + let mut archived_log_dest_id: Option<::Value> = None; + let mut archived_logs_only: Option<::Value> = None; + let mut asm_password: Option<::Value> = None; + let mut asm_server: Option<::Value> = None; + let mut asm_user: Option<::Value> = None; + let mut char_length_semantics: Option<::Value> = None; + let mut direct_path_no_log: Option<::Value> = None; + let mut direct_path_parallel_load: Option<::Value> = None; + let mut enable_homogenous_tablespace: Option<::Value> = None; + let mut extra_archived_log_dest_ids: Option<::ValueList> = None; + let mut fail_tasks_on_lob_truncation: Option<::Value> = None; + let mut number_datatype_scale: Option<::Value> = None; + let mut oracle_path_prefix: Option<::Value> = None; + let mut parallel_asm_read_threads: Option<::Value> = None; + let mut read_ahead_blocks: Option<::Value> = None; + let mut read_table_space_name: Option<::Value> = None; + let mut replace_path_prefix: Option<::Value> = None; + let mut retry_interval: Option<::Value> = None; let mut secrets_manager_access_role_arn: Option<::Value> = None; let mut secrets_manager_oracle_asm_access_role_arn: Option<::Value> = None; let mut secrets_manager_oracle_asm_secret_id: Option<::Value> = None; let mut secrets_manager_secret_id: Option<::Value> = None; + let mut security_db_encryption: Option<::Value> = None; + let mut security_db_encryption_name: Option<::Value> = None; + let mut spatial_data_option_to_geo_json_function_name: Option<::Value> = None; + let mut standby_delay_time: Option<::Value> = None; + let mut use_alternate_folder_for_online: Option<::Value> = None; + let mut use_b_file: Option<::Value> = None; + let mut use_direct_path_full_load: Option<::Value> = None; + let mut use_logminer_reader: Option<::Value> = None; + let mut use_path_prefix: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "AccessAlternateDirectly" => { + access_alternate_directly = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AddSupplementalLogging" => { + add_supplemental_logging = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AdditionalArchivedLogDestId" => { + additional_archived_log_dest_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AllowSelectNestedTables" => { + allow_select_nested_tables = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ArchivedLogDestId" => { + archived_log_dest_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ArchivedLogsOnly" => { + archived_logs_only = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AsmPassword" => { + asm_password = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AsmServer" => { + asm_server = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AsmUser" => { + asm_user = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CharLengthSemantics" => { + char_length_semantics = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DirectPathNoLog" => { + direct_path_no_log = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DirectPathParallelLoad" => { + direct_path_parallel_load = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EnableHomogenousTablespace" => { + enable_homogenous_tablespace = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ExtraArchivedLogDestIds" => { + extra_archived_log_dest_ids = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FailTasksOnLobTruncation" => { + fail_tasks_on_lob_truncation = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NumberDatatypeScale" => { + number_datatype_scale = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OraclePathPrefix" => { + oracle_path_prefix = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ParallelAsmReadThreads" => { + parallel_asm_read_threads = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ReadAheadBlocks" => { + read_ahead_blocks = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ReadTableSpaceName" => { + read_table_space_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ReplacePathPrefix" => { + replace_path_prefix = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RetryInterval" => { + retry_interval = ::serde::de::MapAccess::next_value(&mut map)?; + } "SecretsManagerAccessRoleArn" => { secrets_manager_access_role_arn = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -2263,15 +3402,73 @@ pub mod endpoint { "SecretsManagerSecretId" => { secrets_manager_secret_id = ::serde::de::MapAccess::next_value(&mut map)?; } + "SecurityDbEncryption" => { + security_db_encryption = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SecurityDbEncryptionName" => { + security_db_encryption_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SpatialDataOptionToGeoJsonFunctionName" => { + spatial_data_option_to_geo_json_function_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "StandbyDelayTime" => { + standby_delay_time = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UseAlternateFolderForOnline" => { + use_alternate_folder_for_online = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UseBFile" => { + use_b_file = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UseDirectPathFullLoad" => { + use_direct_path_full_load = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UseLogminerReader" => { + use_logminer_reader = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UsePathPrefix" => { + use_path_prefix = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } Ok(OracleSettings { + access_alternate_directly: access_alternate_directly, + add_supplemental_logging: add_supplemental_logging, + additional_archived_log_dest_id: additional_archived_log_dest_id, + allow_select_nested_tables: allow_select_nested_tables, + archived_log_dest_id: archived_log_dest_id, + archived_logs_only: archived_logs_only, + asm_password: asm_password, + asm_server: asm_server, + asm_user: asm_user, + char_length_semantics: char_length_semantics, + direct_path_no_log: direct_path_no_log, + direct_path_parallel_load: direct_path_parallel_load, + enable_homogenous_tablespace: enable_homogenous_tablespace, + extra_archived_log_dest_ids: extra_archived_log_dest_ids, + fail_tasks_on_lob_truncation: fail_tasks_on_lob_truncation, + number_datatype_scale: number_datatype_scale, + oracle_path_prefix: oracle_path_prefix, + parallel_asm_read_threads: parallel_asm_read_threads, + read_ahead_blocks: read_ahead_blocks, + read_table_space_name: read_table_space_name, + replace_path_prefix: replace_path_prefix, + retry_interval: retry_interval, secrets_manager_access_role_arn: secrets_manager_access_role_arn, secrets_manager_oracle_asm_access_role_arn: secrets_manager_oracle_asm_access_role_arn, secrets_manager_oracle_asm_secret_id: secrets_manager_oracle_asm_secret_id, secrets_manager_secret_id: secrets_manager_secret_id, + security_db_encryption: security_db_encryption, + security_db_encryption_name: security_db_encryption_name, + spatial_data_option_to_geo_json_function_name: spatial_data_option_to_geo_json_function_name, + standby_delay_time: standby_delay_time, + use_alternate_folder_for_online: use_alternate_folder_for_online, + use_b_file: use_b_file, + use_direct_path_full_load: use_direct_path_full_load, + use_logminer_reader: use_logminer_reader, + use_path_prefix: use_path_prefix, }) } } @@ -2283,6 +3480,56 @@ pub mod endpoint { /// The [`AWS::DMS::Endpoint.PostgreSqlSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html) property type. #[derive(Debug, Default)] pub struct PostgreSqlSettings { + /// Property [`AfterConnectScript`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-afterconnectscript). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub after_connect_script: Option<::Value>, + /// Property [`CaptureDdls`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-captureddls). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub capture_ddls: Option<::Value>, + /// Property [`DdlArtifactsSchema`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-ddlartifactsschema). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ddl_artifacts_schema: Option<::Value>, + /// Property [`ExecuteTimeout`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-executetimeout). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub execute_timeout: Option<::Value>, + /// Property [`FailTasksOnLobTruncation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-failtasksonlobtruncation). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub fail_tasks_on_lob_truncation: Option<::Value>, + /// Property [`HeartbeatEnable`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-heartbeatenable). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub heartbeat_enable: Option<::Value>, + /// Property [`HeartbeatFrequency`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-heartbeatfrequency). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub heartbeat_frequency: Option<::Value>, + /// Property [`HeartbeatSchema`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-heartbeatschema). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub heartbeat_schema: Option<::Value>, + /// Property [`MaxFileSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-maxfilesize). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub max_file_size: Option<::Value>, + /// Property [`PluginName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-pluginname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub plugin_name: Option<::Value>, /// Property [`SecretsManagerAccessRoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-secretsmanageraccessrolearn). /// /// Update type: _Mutable_. @@ -2293,17 +3540,55 @@ pub mod endpoint { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub secrets_manager_secret_id: Option<::Value>, + /// Property [`SlotName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-postgresqlsettings.html#cfn-dms-endpoint-postgresqlsettings-slotname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub slot_name: Option<::Value>, } impl ::codec::SerializeValue for PostgreSqlSettings { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref after_connect_script) = self.after_connect_script { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AfterConnectScript", after_connect_script)?; + } + if let Some(ref capture_ddls) = self.capture_ddls { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CaptureDdls", capture_ddls)?; + } + if let Some(ref ddl_artifacts_schema) = self.ddl_artifacts_schema { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DdlArtifactsSchema", ddl_artifacts_schema)?; + } + if let Some(ref execute_timeout) = self.execute_timeout { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExecuteTimeout", execute_timeout)?; + } + if let Some(ref fail_tasks_on_lob_truncation) = self.fail_tasks_on_lob_truncation { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FailTasksOnLobTruncation", fail_tasks_on_lob_truncation)?; + } + if let Some(ref heartbeat_enable) = self.heartbeat_enable { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HeartbeatEnable", heartbeat_enable)?; + } + if let Some(ref heartbeat_frequency) = self.heartbeat_frequency { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HeartbeatFrequency", heartbeat_frequency)?; + } + if let Some(ref heartbeat_schema) = self.heartbeat_schema { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HeartbeatSchema", heartbeat_schema)?; + } + if let Some(ref max_file_size) = self.max_file_size { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxFileSize", max_file_size)?; + } + if let Some(ref plugin_name) = self.plugin_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PluginName", plugin_name)?; + } if let Some(ref secrets_manager_access_role_arn) = self.secrets_manager_access_role_arn { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretsManagerAccessRoleArn", secrets_manager_access_role_arn)?; } if let Some(ref secrets_manager_secret_id) = self.secrets_manager_secret_id { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretsManagerSecretId", secrets_manager_secret_id)?; } + if let Some(ref slot_name) = self.slot_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SlotName", slot_name)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -2320,24 +3605,79 @@ pub mod endpoint { } fn visit_map>(self, mut map: A) -> Result { + let mut after_connect_script: Option<::Value> = None; + let mut capture_ddls: Option<::Value> = None; + let mut ddl_artifacts_schema: Option<::Value> = None; + let mut execute_timeout: Option<::Value> = None; + let mut fail_tasks_on_lob_truncation: Option<::Value> = None; + let mut heartbeat_enable: Option<::Value> = None; + let mut heartbeat_frequency: Option<::Value> = None; + let mut heartbeat_schema: Option<::Value> = None; + let mut max_file_size: Option<::Value> = None; + let mut plugin_name: Option<::Value> = None; let mut secrets_manager_access_role_arn: Option<::Value> = None; let mut secrets_manager_secret_id: Option<::Value> = None; + let mut slot_name: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "AfterConnectScript" => { + after_connect_script = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CaptureDdls" => { + capture_ddls = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DdlArtifactsSchema" => { + ddl_artifacts_schema = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ExecuteTimeout" => { + execute_timeout = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FailTasksOnLobTruncation" => { + fail_tasks_on_lob_truncation = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HeartbeatEnable" => { + heartbeat_enable = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HeartbeatFrequency" => { + heartbeat_frequency = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HeartbeatSchema" => { + heartbeat_schema = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MaxFileSize" => { + max_file_size = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PluginName" => { + plugin_name = ::serde::de::MapAccess::next_value(&mut map)?; + } "SecretsManagerAccessRoleArn" => { secrets_manager_access_role_arn = ::serde::de::MapAccess::next_value(&mut map)?; } "SecretsManagerSecretId" => { secrets_manager_secret_id = ::serde::de::MapAccess::next_value(&mut map)?; } + "SlotName" => { + slot_name = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } Ok(PostgreSqlSettings { + after_connect_script: after_connect_script, + capture_ddls: capture_ddls, + ddl_artifacts_schema: ddl_artifacts_schema, + execute_timeout: execute_timeout, + fail_tasks_on_lob_truncation: fail_tasks_on_lob_truncation, + heartbeat_enable: heartbeat_enable, + heartbeat_frequency: heartbeat_frequency, + heartbeat_schema: heartbeat_schema, + max_file_size: max_file_size, + plugin_name: plugin_name, secrets_manager_access_role_arn: secrets_manager_access_role_arn, secrets_manager_secret_id: secrets_manager_secret_id, + slot_name: slot_name, }) } } @@ -2346,38 +3686,353 @@ pub mod endpoint { } } - /// The [`AWS::DMS::Endpoint.RedshiftSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html) property type. + /// The [`AWS::DMS::Endpoint.RedisSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redissettings.html) property type. #[derive(Debug, Default)] - pub struct RedshiftSettings { - /// Property [`SecretsManagerAccessRoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-secretsmanageraccessrolearn). + pub struct RedisSettings { + /// Property [`AuthPassword`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redissettings.html#cfn-dms-endpoint-redissettings-authpassword). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub secrets_manager_access_role_arn: Option<::Value>, - /// Property [`SecretsManagerSecretId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-secretsmanagersecretid). + pub auth_password: Option<::Value>, + /// Property [`AuthType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redissettings.html#cfn-dms-endpoint-redissettings-authtype). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub secrets_manager_secret_id: Option<::Value>, + pub auth_type: Option<::Value>, + /// Property [`AuthUserName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redissettings.html#cfn-dms-endpoint-redissettings-authusername). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub auth_user_name: Option<::Value>, + /// Property [`Port`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redissettings.html#cfn-dms-endpoint-redissettings-port). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub port: Option<::Value>, + /// Property [`ServerName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redissettings.html#cfn-dms-endpoint-redissettings-servername). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub server_name: Option<::Value>, + /// Property [`SslCaCertificateArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redissettings.html#cfn-dms-endpoint-redissettings-sslcacertificatearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ssl_ca_certificate_arn: Option<::Value>, + /// Property [`SslSecurityProtocol`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redissettings.html#cfn-dms-endpoint-redissettings-sslsecurityprotocol). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ssl_security_protocol: Option<::Value>, } - impl ::codec::SerializeValue for RedshiftSettings { + impl ::codec::SerializeValue for RedisSettings { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref secrets_manager_access_role_arn) = self.secrets_manager_access_role_arn { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretsManagerAccessRoleArn", secrets_manager_access_role_arn)?; + if let Some(ref auth_password) = self.auth_password { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AuthPassword", auth_password)?; } - if let Some(ref secrets_manager_secret_id) = self.secrets_manager_secret_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretsManagerSecretId", secrets_manager_secret_id)?; + if let Some(ref auth_type) = self.auth_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AuthType", auth_type)?; } - ::serde::ser::SerializeMap::end(map) - } - } - - impl ::codec::DeserializeValue for RedshiftSettings { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { - struct Visitor; - + if let Some(ref auth_user_name) = self.auth_user_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AuthUserName", auth_user_name)?; + } + if let Some(ref port) = self.port { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Port", port)?; + } + if let Some(ref server_name) = self.server_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServerName", server_name)?; + } + if let Some(ref ssl_ca_certificate_arn) = self.ssl_ca_certificate_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SslCaCertificateArn", ssl_ca_certificate_arn)?; + } + if let Some(ref ssl_security_protocol) = self.ssl_security_protocol { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SslSecurityProtocol", ssl_security_protocol)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for RedisSettings { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = RedisSettings; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type RedisSettings") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut auth_password: Option<::Value> = None; + let mut auth_type: Option<::Value> = None; + let mut auth_user_name: Option<::Value> = None; + let mut port: Option<::Value> = None; + let mut server_name: Option<::Value> = None; + let mut ssl_ca_certificate_arn: Option<::Value> = None; + let mut ssl_security_protocol: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AuthPassword" => { + auth_password = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AuthType" => { + auth_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AuthUserName" => { + auth_user_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Port" => { + port = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ServerName" => { + server_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SslCaCertificateArn" => { + ssl_ca_certificate_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SslSecurityProtocol" => { + ssl_security_protocol = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(RedisSettings { + auth_password: auth_password, + auth_type: auth_type, + auth_user_name: auth_user_name, + port: port, + server_name: server_name, + ssl_ca_certificate_arn: ssl_ca_certificate_arn, + ssl_security_protocol: ssl_security_protocol, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::DMS::Endpoint.RedshiftSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html) property type. + #[derive(Debug, Default)] + pub struct RedshiftSettings { + /// Property [`AcceptAnyDate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-acceptanydate). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub accept_any_date: Option<::Value>, + /// Property [`AfterConnectScript`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-afterconnectscript). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub after_connect_script: Option<::Value>, + /// Property [`BucketFolder`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-bucketfolder). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub bucket_folder: Option<::Value>, + /// Property [`BucketName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-bucketname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub bucket_name: Option<::Value>, + /// Property [`CaseSensitiveNames`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-casesensitivenames). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub case_sensitive_names: Option<::Value>, + /// Property [`CompUpdate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-compupdate). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub comp_update: Option<::Value>, + /// Property [`ConnectionTimeout`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-connectiontimeout). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub connection_timeout: Option<::Value>, + /// Property [`DateFormat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-dateformat). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub date_format: Option<::Value>, + /// Property [`EmptyAsNull`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-emptyasnull). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub empty_as_null: Option<::Value>, + /// Property [`EncryptionMode`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-encryptionmode). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub encryption_mode: Option<::Value>, + /// Property [`ExplicitIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-explicitids). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub explicit_ids: Option<::Value>, + /// Property [`FileTransferUploadStreams`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-filetransferuploadstreams). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub file_transfer_upload_streams: Option<::Value>, + /// Property [`LoadTimeout`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-loadtimeout). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub load_timeout: Option<::Value>, + /// Property [`MaxFileSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-maxfilesize). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub max_file_size: Option<::Value>, + /// Property [`RemoveQuotes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-removequotes). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub remove_quotes: Option<::Value>, + /// Property [`ReplaceChars`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-replacechars). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub replace_chars: Option<::Value>, + /// Property [`ReplaceInvalidChars`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-replaceinvalidchars). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub replace_invalid_chars: Option<::Value>, + /// Property [`SecretsManagerAccessRoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-secretsmanageraccessrolearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub secrets_manager_access_role_arn: Option<::Value>, + /// Property [`SecretsManagerSecretId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-secretsmanagersecretid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub secrets_manager_secret_id: Option<::Value>, + /// Property [`ServerSideEncryptionKmsKeyId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-serversideencryptionkmskeyid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub server_side_encryption_kms_key_id: Option<::Value>, + /// Property [`ServiceAccessRoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-serviceaccessrolearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub service_access_role_arn: Option<::Value>, + /// Property [`TimeFormat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-timeformat). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub time_format: Option<::Value>, + /// Property [`TrimBlanks`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-trimblanks). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub trim_blanks: Option<::Value>, + /// Property [`TruncateColumns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-truncatecolumns). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub truncate_columns: Option<::Value>, + /// Property [`WriteBufferSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-redshiftsettings.html#cfn-dms-endpoint-redshiftsettings-writebuffersize). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub write_buffer_size: Option<::Value>, + } + + impl ::codec::SerializeValue for RedshiftSettings { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref accept_any_date) = self.accept_any_date { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcceptAnyDate", accept_any_date)?; + } + if let Some(ref after_connect_script) = self.after_connect_script { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AfterConnectScript", after_connect_script)?; + } + if let Some(ref bucket_folder) = self.bucket_folder { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BucketFolder", bucket_folder)?; + } + if let Some(ref bucket_name) = self.bucket_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BucketName", bucket_name)?; + } + if let Some(ref case_sensitive_names) = self.case_sensitive_names { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CaseSensitiveNames", case_sensitive_names)?; + } + if let Some(ref comp_update) = self.comp_update { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CompUpdate", comp_update)?; + } + if let Some(ref connection_timeout) = self.connection_timeout { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConnectionTimeout", connection_timeout)?; + } + if let Some(ref date_format) = self.date_format { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DateFormat", date_format)?; + } + if let Some(ref empty_as_null) = self.empty_as_null { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EmptyAsNull", empty_as_null)?; + } + if let Some(ref encryption_mode) = self.encryption_mode { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EncryptionMode", encryption_mode)?; + } + if let Some(ref explicit_ids) = self.explicit_ids { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExplicitIds", explicit_ids)?; + } + if let Some(ref file_transfer_upload_streams) = self.file_transfer_upload_streams { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FileTransferUploadStreams", file_transfer_upload_streams)?; + } + if let Some(ref load_timeout) = self.load_timeout { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LoadTimeout", load_timeout)?; + } + if let Some(ref max_file_size) = self.max_file_size { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxFileSize", max_file_size)?; + } + if let Some(ref remove_quotes) = self.remove_quotes { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RemoveQuotes", remove_quotes)?; + } + if let Some(ref replace_chars) = self.replace_chars { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReplaceChars", replace_chars)?; + } + if let Some(ref replace_invalid_chars) = self.replace_invalid_chars { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReplaceInvalidChars", replace_invalid_chars)?; + } + if let Some(ref secrets_manager_access_role_arn) = self.secrets_manager_access_role_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretsManagerAccessRoleArn", secrets_manager_access_role_arn)?; + } + if let Some(ref secrets_manager_secret_id) = self.secrets_manager_secret_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretsManagerSecretId", secrets_manager_secret_id)?; + } + if let Some(ref server_side_encryption_kms_key_id) = self.server_side_encryption_kms_key_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServerSideEncryptionKmsKeyId", server_side_encryption_kms_key_id)?; + } + if let Some(ref service_access_role_arn) = self.service_access_role_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServiceAccessRoleArn", service_access_role_arn)?; + } + if let Some(ref time_format) = self.time_format { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TimeFormat", time_format)?; + } + if let Some(ref trim_blanks) = self.trim_blanks { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TrimBlanks", trim_blanks)?; + } + if let Some(ref truncate_columns) = self.truncate_columns { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TruncateColumns", truncate_columns)?; + } + if let Some(ref write_buffer_size) = self.write_buffer_size { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "WriteBufferSize", write_buffer_size)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for RedshiftSettings { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + impl<'de> ::serde::de::Visitor<'de> for Visitor { type Value = RedshiftSettings; @@ -2386,24 +4041,139 @@ pub mod endpoint { } fn visit_map>(self, mut map: A) -> Result { + let mut accept_any_date: Option<::Value> = None; + let mut after_connect_script: Option<::Value> = None; + let mut bucket_folder: Option<::Value> = None; + let mut bucket_name: Option<::Value> = None; + let mut case_sensitive_names: Option<::Value> = None; + let mut comp_update: Option<::Value> = None; + let mut connection_timeout: Option<::Value> = None; + let mut date_format: Option<::Value> = None; + let mut empty_as_null: Option<::Value> = None; + let mut encryption_mode: Option<::Value> = None; + let mut explicit_ids: Option<::Value> = None; + let mut file_transfer_upload_streams: Option<::Value> = None; + let mut load_timeout: Option<::Value> = None; + let mut max_file_size: Option<::Value> = None; + let mut remove_quotes: Option<::Value> = None; + let mut replace_chars: Option<::Value> = None; + let mut replace_invalid_chars: Option<::Value> = None; let mut secrets_manager_access_role_arn: Option<::Value> = None; let mut secrets_manager_secret_id: Option<::Value> = None; + let mut server_side_encryption_kms_key_id: Option<::Value> = None; + let mut service_access_role_arn: Option<::Value> = None; + let mut time_format: Option<::Value> = None; + let mut trim_blanks: Option<::Value> = None; + let mut truncate_columns: Option<::Value> = None; + let mut write_buffer_size: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "AcceptAnyDate" => { + accept_any_date = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AfterConnectScript" => { + after_connect_script = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BucketFolder" => { + bucket_folder = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BucketName" => { + bucket_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CaseSensitiveNames" => { + case_sensitive_names = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CompUpdate" => { + comp_update = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ConnectionTimeout" => { + connection_timeout = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DateFormat" => { + date_format = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EmptyAsNull" => { + empty_as_null = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EncryptionMode" => { + encryption_mode = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ExplicitIds" => { + explicit_ids = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FileTransferUploadStreams" => { + file_transfer_upload_streams = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LoadTimeout" => { + load_timeout = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MaxFileSize" => { + max_file_size = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RemoveQuotes" => { + remove_quotes = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ReplaceChars" => { + replace_chars = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ReplaceInvalidChars" => { + replace_invalid_chars = ::serde::de::MapAccess::next_value(&mut map)?; + } "SecretsManagerAccessRoleArn" => { secrets_manager_access_role_arn = ::serde::de::MapAccess::next_value(&mut map)?; } "SecretsManagerSecretId" => { secrets_manager_secret_id = ::serde::de::MapAccess::next_value(&mut map)?; } + "ServerSideEncryptionKmsKeyId" => { + server_side_encryption_kms_key_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ServiceAccessRoleArn" => { + service_access_role_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TimeFormat" => { + time_format = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TrimBlanks" => { + trim_blanks = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TruncateColumns" => { + truncate_columns = ::serde::de::MapAccess::next_value(&mut map)?; + } + "WriteBufferSize" => { + write_buffer_size = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } Ok(RedshiftSettings { + accept_any_date: accept_any_date, + after_connect_script: after_connect_script, + bucket_folder: bucket_folder, + bucket_name: bucket_name, + case_sensitive_names: case_sensitive_names, + comp_update: comp_update, + connection_timeout: connection_timeout, + date_format: date_format, + empty_as_null: empty_as_null, + encryption_mode: encryption_mode, + explicit_ids: explicit_ids, + file_transfer_upload_streams: file_transfer_upload_streams, + load_timeout: load_timeout, + max_file_size: max_file_size, + remove_quotes: remove_quotes, + replace_chars: replace_chars, + replace_invalid_chars: replace_invalid_chars, secrets_manager_access_role_arn: secrets_manager_access_role_arn, secrets_manager_secret_id: secrets_manager_secret_id, + server_side_encryption_kms_key_id: server_side_encryption_kms_key_id, + service_access_role_arn: service_access_role_arn, + time_format: time_format, + trim_blanks: trim_blanks, + truncate_columns: truncate_columns, + write_buffer_size: write_buffer_size, }) } } @@ -2415,6 +4185,11 @@ pub mod endpoint { /// The [`AWS::DMS::Endpoint.S3Settings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html) property type. #[derive(Debug, Default)] pub struct S3Settings { + /// Property [`AddColumnName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-addcolumnname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub add_column_name: Option<::Value>, /// Property [`BucketFolder`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-bucketfolder). /// /// Update type: _Mutable_. @@ -2425,6 +4200,36 @@ pub mod endpoint { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub bucket_name: Option<::Value>, + /// Property [`CannedAclForObjects`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-cannedaclforobjects). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub canned_acl_for_objects: Option<::Value>, + /// Property [`CdcInsertsAndUpdates`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-cdcinsertsandupdates). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub cdc_inserts_and_updates: Option<::Value>, + /// Property [`CdcInsertsOnly`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-cdcinsertsonly). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub cdc_inserts_only: Option<::Value>, + /// Property [`CdcMaxBatchInterval`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-cdcmaxbatchinterval). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub cdc_max_batch_interval: Option<::Value>, + /// Property [`CdcMinFileSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-cdcminfilesize). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub cdc_min_file_size: Option<::Value>, + /// Property [`CdcPath`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-cdcpath). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub cdc_path: Option<::Value>, /// Property [`CompressionType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-compressiontype). /// /// Update type: _Mutable_. @@ -2435,47 +4240,260 @@ pub mod endpoint { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub csv_delimiter: Option<::Value>, + /// Property [`CsvNoSupValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-csvnosupvalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub csv_no_sup_value: Option<::Value>, + /// Property [`CsvNullValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-csvnullvalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub csv_null_value: Option<::Value>, /// Property [`CsvRowDelimiter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-csvrowdelimiter). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub csv_row_delimiter: Option<::Value>, + /// Property [`DataFormat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-dataformat). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub data_format: Option<::Value>, + /// Property [`DataPageSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-datapagesize). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub data_page_size: Option<::Value>, + /// Property [`DatePartitionDelimiter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-datepartitiondelimiter). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub date_partition_delimiter: Option<::Value>, + /// Property [`DatePartitionEnabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-datepartitionenabled). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub date_partition_enabled: Option<::Value>, + /// Property [`DatePartitionSequence`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-datepartitionsequence). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub date_partition_sequence: Option<::Value>, + /// Property [`DatePartitionTimezone`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-datepartitiontimezone). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub date_partition_timezone: Option<::Value>, + /// Property [`DictPageSizeLimit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-dictpagesizelimit). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub dict_page_size_limit: Option<::Value>, + /// Property [`EnableStatistics`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-enablestatistics). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enable_statistics: Option<::Value>, + /// Property [`EncodingType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-encodingtype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub encoding_type: Option<::Value>, + /// Property [`EncryptionMode`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-encryptionmode). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub encryption_mode: Option<::Value>, /// Property [`ExternalTableDefinition`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-externaltabledefinition). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub external_table_definition: Option<::Value>, + /// Property [`IgnoreHeaderRows`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-ignoreheaderrows). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ignore_header_rows: Option<::Value>, + /// Property [`IncludeOpForFullLoad`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-includeopforfullload). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub include_op_for_full_load: Option<::Value>, + /// Property [`MaxFileSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-maxfilesize). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub max_file_size: Option<::Value>, + /// Property [`ParquetTimestampInMillisecond`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-parquettimestampinmillisecond). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub parquet_timestamp_in_millisecond: Option<::Value>, + /// Property [`ParquetVersion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-parquetversion). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub parquet_version: Option<::Value>, + /// Property [`PreserveTransactions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-preservetransactions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub preserve_transactions: Option<::Value>, + /// Property [`Rfc4180`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-rfc4180). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub rfc4180: Option<::Value>, + /// Property [`RowGroupLength`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-rowgrouplength). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub row_group_length: Option<::Value>, + /// Property [`ServerSideEncryptionKmsKeyId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-serversideencryptionkmskeyid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub server_side_encryption_kms_key_id: Option<::Value>, /// Property [`ServiceAccessRoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-serviceaccessrolearn). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub service_access_role_arn: Option<::Value>, + /// Property [`TimestampColumnName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-timestampcolumnname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub timestamp_column_name: Option<::Value>, + /// Property [`UseCsvNoSupValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-usecsvnosupvalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub use_csv_no_sup_value: Option<::Value>, + /// Property [`UseTaskStartTimeForFullLoadTimestamp`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dms-endpoint-s3settings.html#cfn-dms-endpoint-s3settings-usetaskstarttimeforfullloadtimestamp). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub use_task_start_time_for_full_load_timestamp: Option<::Value>, } impl ::codec::SerializeValue for S3Settings { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref add_column_name) = self.add_column_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AddColumnName", add_column_name)?; + } if let Some(ref bucket_folder) = self.bucket_folder { ::serde::ser::SerializeMap::serialize_entry(&mut map, "BucketFolder", bucket_folder)?; } if let Some(ref bucket_name) = self.bucket_name { ::serde::ser::SerializeMap::serialize_entry(&mut map, "BucketName", bucket_name)?; } + if let Some(ref canned_acl_for_objects) = self.canned_acl_for_objects { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CannedAclForObjects", canned_acl_for_objects)?; + } + if let Some(ref cdc_inserts_and_updates) = self.cdc_inserts_and_updates { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CdcInsertsAndUpdates", cdc_inserts_and_updates)?; + } + if let Some(ref cdc_inserts_only) = self.cdc_inserts_only { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CdcInsertsOnly", cdc_inserts_only)?; + } + if let Some(ref cdc_max_batch_interval) = self.cdc_max_batch_interval { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CdcMaxBatchInterval", cdc_max_batch_interval)?; + } + if let Some(ref cdc_min_file_size) = self.cdc_min_file_size { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CdcMinFileSize", cdc_min_file_size)?; + } + if let Some(ref cdc_path) = self.cdc_path { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CdcPath", cdc_path)?; + } if let Some(ref compression_type) = self.compression_type { ::serde::ser::SerializeMap::serialize_entry(&mut map, "CompressionType", compression_type)?; } if let Some(ref csv_delimiter) = self.csv_delimiter { ::serde::ser::SerializeMap::serialize_entry(&mut map, "CsvDelimiter", csv_delimiter)?; } + if let Some(ref csv_no_sup_value) = self.csv_no_sup_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CsvNoSupValue", csv_no_sup_value)?; + } + if let Some(ref csv_null_value) = self.csv_null_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CsvNullValue", csv_null_value)?; + } if let Some(ref csv_row_delimiter) = self.csv_row_delimiter { ::serde::ser::SerializeMap::serialize_entry(&mut map, "CsvRowDelimiter", csv_row_delimiter)?; } + if let Some(ref data_format) = self.data_format { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataFormat", data_format)?; + } + if let Some(ref data_page_size) = self.data_page_size { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataPageSize", data_page_size)?; + } + if let Some(ref date_partition_delimiter) = self.date_partition_delimiter { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatePartitionDelimiter", date_partition_delimiter)?; + } + if let Some(ref date_partition_enabled) = self.date_partition_enabled { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatePartitionEnabled", date_partition_enabled)?; + } + if let Some(ref date_partition_sequence) = self.date_partition_sequence { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatePartitionSequence", date_partition_sequence)?; + } + if let Some(ref date_partition_timezone) = self.date_partition_timezone { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatePartitionTimezone", date_partition_timezone)?; + } + if let Some(ref dict_page_size_limit) = self.dict_page_size_limit { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DictPageSizeLimit", dict_page_size_limit)?; + } + if let Some(ref enable_statistics) = self.enable_statistics { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EnableStatistics", enable_statistics)?; + } + if let Some(ref encoding_type) = self.encoding_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EncodingType", encoding_type)?; + } + if let Some(ref encryption_mode) = self.encryption_mode { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EncryptionMode", encryption_mode)?; + } if let Some(ref external_table_definition) = self.external_table_definition { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExternalTableDefinition", external_table_definition)?; } + if let Some(ref ignore_header_rows) = self.ignore_header_rows { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IgnoreHeaderRows", ignore_header_rows)?; + } + if let Some(ref include_op_for_full_load) = self.include_op_for_full_load { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludeOpForFullLoad", include_op_for_full_load)?; + } + if let Some(ref max_file_size) = self.max_file_size { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxFileSize", max_file_size)?; + } + if let Some(ref parquet_timestamp_in_millisecond) = self.parquet_timestamp_in_millisecond { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ParquetTimestampInMillisecond", parquet_timestamp_in_millisecond)?; + } + if let Some(ref parquet_version) = self.parquet_version { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ParquetVersion", parquet_version)?; + } + if let Some(ref preserve_transactions) = self.preserve_transactions { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PreserveTransactions", preserve_transactions)?; + } + if let Some(ref rfc4180) = self.rfc4180 { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Rfc4180", rfc4180)?; + } + if let Some(ref row_group_length) = self.row_group_length { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RowGroupLength", row_group_length)?; + } + if let Some(ref server_side_encryption_kms_key_id) = self.server_side_encryption_kms_key_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServerSideEncryptionKmsKeyId", server_side_encryption_kms_key_id)?; + } if let Some(ref service_access_role_arn) = self.service_access_role_arn { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServiceAccessRoleArn", service_access_role_arn)?; } + if let Some(ref timestamp_column_name) = self.timestamp_column_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TimestampColumnName", timestamp_column_name)?; + } + if let Some(ref use_csv_no_sup_value) = self.use_csv_no_sup_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UseCsvNoSupValue", use_csv_no_sup_value)?; + } + if let Some(ref use_task_start_time_for_full_load_timestamp) = self.use_task_start_time_for_full_load_timestamp { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UseTaskStartTimeForFullLoadTimestamp", use_task_start_time_for_full_load_timestamp)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -2492,49 +4510,204 @@ pub mod endpoint { } fn visit_map>(self, mut map: A) -> Result { + let mut add_column_name: Option<::Value> = None; let mut bucket_folder: Option<::Value> = None; let mut bucket_name: Option<::Value> = None; + let mut canned_acl_for_objects: Option<::Value> = None; + let mut cdc_inserts_and_updates: Option<::Value> = None; + let mut cdc_inserts_only: Option<::Value> = None; + let mut cdc_max_batch_interval: Option<::Value> = None; + let mut cdc_min_file_size: Option<::Value> = None; + let mut cdc_path: Option<::Value> = None; let mut compression_type: Option<::Value> = None; let mut csv_delimiter: Option<::Value> = None; + let mut csv_no_sup_value: Option<::Value> = None; + let mut csv_null_value: Option<::Value> = None; let mut csv_row_delimiter: Option<::Value> = None; + let mut data_format: Option<::Value> = None; + let mut data_page_size: Option<::Value> = None; + let mut date_partition_delimiter: Option<::Value> = None; + let mut date_partition_enabled: Option<::Value> = None; + let mut date_partition_sequence: Option<::Value> = None; + let mut date_partition_timezone: Option<::Value> = None; + let mut dict_page_size_limit: Option<::Value> = None; + let mut enable_statistics: Option<::Value> = None; + let mut encoding_type: Option<::Value> = None; + let mut encryption_mode: Option<::Value> = None; let mut external_table_definition: Option<::Value> = None; + let mut ignore_header_rows: Option<::Value> = None; + let mut include_op_for_full_load: Option<::Value> = None; + let mut max_file_size: Option<::Value> = None; + let mut parquet_timestamp_in_millisecond: Option<::Value> = None; + let mut parquet_version: Option<::Value> = None; + let mut preserve_transactions: Option<::Value> = None; + let mut rfc4180: Option<::Value> = None; + let mut row_group_length: Option<::Value> = None; + let mut server_side_encryption_kms_key_id: Option<::Value> = None; let mut service_access_role_arn: Option<::Value> = None; + let mut timestamp_column_name: Option<::Value> = None; + let mut use_csv_no_sup_value: Option<::Value> = None; + let mut use_task_start_time_for_full_load_timestamp: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "AddColumnName" => { + add_column_name = ::serde::de::MapAccess::next_value(&mut map)?; + } "BucketFolder" => { bucket_folder = ::serde::de::MapAccess::next_value(&mut map)?; } "BucketName" => { bucket_name = ::serde::de::MapAccess::next_value(&mut map)?; } + "CannedAclForObjects" => { + canned_acl_for_objects = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CdcInsertsAndUpdates" => { + cdc_inserts_and_updates = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CdcInsertsOnly" => { + cdc_inserts_only = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CdcMaxBatchInterval" => { + cdc_max_batch_interval = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CdcMinFileSize" => { + cdc_min_file_size = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CdcPath" => { + cdc_path = ::serde::de::MapAccess::next_value(&mut map)?; + } "CompressionType" => { compression_type = ::serde::de::MapAccess::next_value(&mut map)?; } "CsvDelimiter" => { csv_delimiter = ::serde::de::MapAccess::next_value(&mut map)?; } + "CsvNoSupValue" => { + csv_no_sup_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CsvNullValue" => { + csv_null_value = ::serde::de::MapAccess::next_value(&mut map)?; + } "CsvRowDelimiter" => { csv_row_delimiter = ::serde::de::MapAccess::next_value(&mut map)?; } + "DataFormat" => { + data_format = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DataPageSize" => { + data_page_size = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DatePartitionDelimiter" => { + date_partition_delimiter = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DatePartitionEnabled" => { + date_partition_enabled = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DatePartitionSequence" => { + date_partition_sequence = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DatePartitionTimezone" => { + date_partition_timezone = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DictPageSizeLimit" => { + dict_page_size_limit = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EnableStatistics" => { + enable_statistics = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EncodingType" => { + encoding_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EncryptionMode" => { + encryption_mode = ::serde::de::MapAccess::next_value(&mut map)?; + } "ExternalTableDefinition" => { external_table_definition = ::serde::de::MapAccess::next_value(&mut map)?; } + "IgnoreHeaderRows" => { + ignore_header_rows = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IncludeOpForFullLoad" => { + include_op_for_full_load = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MaxFileSize" => { + max_file_size = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ParquetTimestampInMillisecond" => { + parquet_timestamp_in_millisecond = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ParquetVersion" => { + parquet_version = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PreserveTransactions" => { + preserve_transactions = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Rfc4180" => { + rfc4180 = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RowGroupLength" => { + row_group_length = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ServerSideEncryptionKmsKeyId" => { + server_side_encryption_kms_key_id = ::serde::de::MapAccess::next_value(&mut map)?; + } "ServiceAccessRoleArn" => { service_access_role_arn = ::serde::de::MapAccess::next_value(&mut map)?; } + "TimestampColumnName" => { + timestamp_column_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UseCsvNoSupValue" => { + use_csv_no_sup_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UseTaskStartTimeForFullLoadTimestamp" => { + use_task_start_time_for_full_load_timestamp = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } Ok(S3Settings { + add_column_name: add_column_name, bucket_folder: bucket_folder, bucket_name: bucket_name, + canned_acl_for_objects: canned_acl_for_objects, + cdc_inserts_and_updates: cdc_inserts_and_updates, + cdc_inserts_only: cdc_inserts_only, + cdc_max_batch_interval: cdc_max_batch_interval, + cdc_min_file_size: cdc_min_file_size, + cdc_path: cdc_path, compression_type: compression_type, csv_delimiter: csv_delimiter, + csv_no_sup_value: csv_no_sup_value, + csv_null_value: csv_null_value, csv_row_delimiter: csv_row_delimiter, + data_format: data_format, + data_page_size: data_page_size, + date_partition_delimiter: date_partition_delimiter, + date_partition_enabled: date_partition_enabled, + date_partition_sequence: date_partition_sequence, + date_partition_timezone: date_partition_timezone, + dict_page_size_limit: dict_page_size_limit, + enable_statistics: enable_statistics, + encoding_type: encoding_type, + encryption_mode: encryption_mode, external_table_definition: external_table_definition, + ignore_header_rows: ignore_header_rows, + include_op_for_full_load: include_op_for_full_load, + max_file_size: max_file_size, + parquet_timestamp_in_millisecond: parquet_timestamp_in_millisecond, + parquet_version: parquet_version, + preserve_transactions: preserve_transactions, + rfc4180: rfc4180, + row_group_length: row_group_length, + server_side_encryption_kms_key_id: server_side_encryption_kms_key_id, service_access_role_arn: service_access_role_arn, + timestamp_column_name: timestamp_column_name, + use_csv_no_sup_value: use_csv_no_sup_value, + use_task_start_time_for_full_load_timestamp: use_task_start_time_for_full_load_timestamp, }) } } diff --git a/src/aws/docdb.rs b/src/aws/docdb.rs index cb0ef11..4dc1c87 100644 --- a/src/aws/docdb.rs +++ b/src/aws/docdb.rs @@ -19,6 +19,11 @@ pub struct DBClusterProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub backup_retention_period: Option<::Value>, + /// Property [`CopyTagsToSnapshot`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-copytagstosnapshot). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub copy_tags_to_snapshot: Option<::Value>, /// Property [`DBClusterIdentifier`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-dbclusteridentifier). /// /// Update type: _Immutable_. @@ -58,12 +63,12 @@ pub struct DBClusterProperties { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub master_user_password: ::Value, + pub master_user_password: Option<::Value>, /// Property [`MasterUsername`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-masterusername). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub master_username: ::Value, + pub master_username: Option<::Value>, /// Property [`Port`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbcluster.html#cfn-docdb-dbcluster-port). /// /// Update type: _Mutable_. @@ -110,6 +115,9 @@ impl ::serde::Serialize for DBClusterProperties { if let Some(ref backup_retention_period) = self.backup_retention_period { ::serde::ser::SerializeMap::serialize_entry(&mut map, "BackupRetentionPeriod", backup_retention_period)?; } + if let Some(ref copy_tags_to_snapshot) = self.copy_tags_to_snapshot { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CopyTagsToSnapshot", copy_tags_to_snapshot)?; + } if let Some(ref db_cluster_identifier) = self.db_cluster_identifier { ::serde::ser::SerializeMap::serialize_entry(&mut map, "DBClusterIdentifier", db_cluster_identifier)?; } @@ -131,8 +139,12 @@ impl ::serde::Serialize for DBClusterProperties { if let Some(ref kms_key_id) = self.kms_key_id { ::serde::ser::SerializeMap::serialize_entry(&mut map, "KmsKeyId", kms_key_id)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "MasterUserPassword", &self.master_user_password)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "MasterUsername", &self.master_username)?; + if let Some(ref master_user_password) = self.master_user_password { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MasterUserPassword", master_user_password)?; + } + if let Some(ref master_username) = self.master_username { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MasterUsername", master_username)?; + } if let Some(ref port) = self.port { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Port", port)?; } @@ -172,6 +184,7 @@ impl<'de> ::serde::Deserialize<'de> for DBClusterProperties { fn visit_map>(self, mut map: A) -> Result { let mut availability_zones: Option<::ValueList> = None; let mut backup_retention_period: Option<::Value> = None; + let mut copy_tags_to_snapshot: Option<::Value> = None; let mut db_cluster_identifier: Option<::Value> = None; let mut db_cluster_parameter_group_name: Option<::Value> = None; let mut db_subnet_group_name: Option<::Value> = None; @@ -197,6 +210,9 @@ impl<'de> ::serde::Deserialize<'de> for DBClusterProperties { "BackupRetentionPeriod" => { backup_retention_period = ::serde::de::MapAccess::next_value(&mut map)?; } + "CopyTagsToSnapshot" => { + copy_tags_to_snapshot = ::serde::de::MapAccess::next_value(&mut map)?; + } "DBClusterIdentifier" => { db_cluster_identifier = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -252,6 +268,7 @@ impl<'de> ::serde::Deserialize<'de> for DBClusterProperties { Ok(DBClusterProperties { availability_zones: availability_zones, backup_retention_period: backup_retention_period, + copy_tags_to_snapshot: copy_tags_to_snapshot, db_cluster_identifier: db_cluster_identifier, db_cluster_parameter_group_name: db_cluster_parameter_group_name, db_subnet_group_name: db_subnet_group_name, @@ -259,8 +276,8 @@ impl<'de> ::serde::Deserialize<'de> for DBClusterProperties { enable_cloudwatch_logs_exports: enable_cloudwatch_logs_exports, engine_version: engine_version, kms_key_id: kms_key_id, - master_user_password: master_user_password.ok_or(::serde::de::Error::missing_field("MasterUserPassword"))?, - master_username: master_username.ok_or(::serde::de::Error::missing_field("MasterUsername"))?, + master_user_password: master_user_password, + master_username: master_username, port: port, preferred_backup_window: preferred_backup_window, preferred_maintenance_window: preferred_maintenance_window, @@ -453,6 +470,11 @@ pub struct DBInstanceProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub db_instance_identifier: Option<::Value>, + /// Property [`EnablePerformanceInsights`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbinstance.html#cfn-docdb-dbinstance-enableperformanceinsights). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enable_performance_insights: Option<::Value>, /// Property [`PreferredMaintenanceWindow`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-docdb-dbinstance.html#cfn-docdb-dbinstance-preferredmaintenancewindow). /// /// Update type: _Mutable_. @@ -479,6 +501,9 @@ impl ::serde::Serialize for DBInstanceProperties { if let Some(ref db_instance_identifier) = self.db_instance_identifier { ::serde::ser::SerializeMap::serialize_entry(&mut map, "DBInstanceIdentifier", db_instance_identifier)?; } + if let Some(ref enable_performance_insights) = self.enable_performance_insights { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EnablePerformanceInsights", enable_performance_insights)?; + } if let Some(ref preferred_maintenance_window) = self.preferred_maintenance_window { ::serde::ser::SerializeMap::serialize_entry(&mut map, "PreferredMaintenanceWindow", preferred_maintenance_window)?; } @@ -506,6 +531,7 @@ impl<'de> ::serde::Deserialize<'de> for DBInstanceProperties { let mut db_cluster_identifier: Option<::Value> = None; let mut db_instance_class: Option<::Value> = None; let mut db_instance_identifier: Option<::Value> = None; + let mut enable_performance_insights: Option<::Value> = None; let mut preferred_maintenance_window: Option<::Value> = None; let mut tags: Option<::ValueList<::Tag>> = None; @@ -526,6 +552,9 @@ impl<'de> ::serde::Deserialize<'de> for DBInstanceProperties { "DBInstanceIdentifier" => { db_instance_identifier = ::serde::de::MapAccess::next_value(&mut map)?; } + "EnablePerformanceInsights" => { + enable_performance_insights = ::serde::de::MapAccess::next_value(&mut map)?; + } "PreferredMaintenanceWindow" => { preferred_maintenance_window = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -542,6 +571,7 @@ impl<'de> ::serde::Deserialize<'de> for DBInstanceProperties { db_cluster_identifier: db_cluster_identifier.ok_or(::serde::de::Error::missing_field("DBClusterIdentifier"))?, db_instance_class: db_instance_class.ok_or(::serde::de::Error::missing_field("DBInstanceClass"))?, db_instance_identifier: db_instance_identifier, + enable_performance_insights: enable_performance_insights, preferred_maintenance_window: preferred_maintenance_window, tags: tags, }) diff --git a/src/aws/dynamodb.rs b/src/aws/dynamodb.rs index d261c59..c276c86 100644 --- a/src/aws/dynamodb.rs +++ b/src/aws/dynamodb.rs @@ -267,6 +267,11 @@ pub struct TableProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub stream_specification: Option<::Value>, + /// Property [`TableClass`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html#cfn-dynamodb-table-tableclass). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub table_class: Option<::Value>, /// Property [`TableName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html#cfn-dynamodb-table-tablename). /// /// Update type: _Immutable_. @@ -318,6 +323,9 @@ impl ::serde::Serialize for TableProperties { if let Some(ref stream_specification) = self.stream_specification { ::serde::ser::SerializeMap::serialize_entry(&mut map, "StreamSpecification", stream_specification)?; } + if let Some(ref table_class) = self.table_class { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TableClass", table_class)?; + } if let Some(ref table_name) = self.table_name { ::serde::ser::SerializeMap::serialize_entry(&mut map, "TableName", table_name)?; } @@ -354,6 +362,7 @@ impl<'de> ::serde::Deserialize<'de> for TableProperties { let mut provisioned_throughput: Option<::Value> = None; let mut sse_specification: Option<::Value> = None; let mut stream_specification: Option<::Value> = None; + let mut table_class: Option<::Value> = None; let mut table_name: Option<::Value> = None; let mut tags: Option<::ValueList<::Tag>> = None; let mut time_to_live_specification: Option<::Value> = None; @@ -393,6 +402,9 @@ impl<'de> ::serde::Deserialize<'de> for TableProperties { "StreamSpecification" => { stream_specification = ::serde::de::MapAccess::next_value(&mut map)?; } + "TableClass" => { + table_class = ::serde::de::MapAccess::next_value(&mut map)?; + } "TableName" => { table_name = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -418,6 +430,7 @@ impl<'de> ::serde::Deserialize<'de> for TableProperties { provisioned_throughput: provisioned_throughput, sse_specification: sse_specification, stream_specification: stream_specification, + table_class: table_class, table_name: table_name, tags: tags, time_to_live_specification: time_to_live_specification, @@ -1217,6 +1230,11 @@ pub mod global_table { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub sse_specification: Option<::Value>, + /// Property [`TableClass`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-replicaspecification.html#cfn-dynamodb-globaltable-replicaspecification-tableclass). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub table_class: Option<::Value>, /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-dynamodb-globaltable-replicaspecification.html#cfn-dynamodb-globaltable-replicaspecification-tags). /// /// Update type: _Mutable_. @@ -1243,6 +1261,9 @@ pub mod global_table { if let Some(ref sse_specification) = self.sse_specification { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SSESpecification", sse_specification)?; } + if let Some(ref table_class) = self.table_class { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TableClass", table_class)?; + } if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } @@ -1268,6 +1289,7 @@ pub mod global_table { let mut read_provisioned_throughput_settings: Option<::Value> = None; let mut region: Option<::Value> = None; let mut sse_specification: Option<::Value> = None; + let mut table_class: Option<::Value> = None; let mut tags: Option<::ValueList<::Tag>> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { @@ -1290,6 +1312,9 @@ pub mod global_table { "SSESpecification" => { sse_specification = ::serde::de::MapAccess::next_value(&mut map)?; } + "TableClass" => { + table_class = ::serde::de::MapAccess::next_value(&mut map)?; + } "Tags" => { tags = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1304,6 +1329,7 @@ pub mod global_table { read_provisioned_throughput_settings: read_provisioned_throughput_settings, region: region.ok_or(::serde::de::Error::missing_field("Region"))?, sse_specification: sse_specification, + table_class: table_class, tags: tags, }) } diff --git a/src/aws/ec2.rs b/src/aws/ec2.rs index 3d41cfa..3a26286 100644 --- a/src/aws/ec2.rs +++ b/src/aws/ec2.rs @@ -54,6 +54,16 @@ pub struct CapacityReservationProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub instance_type: ::Value, + /// Property [`OutPostArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservation.html#cfn-ec2-capacityreservation-outpostarn). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub out_post_arn: Option<::Value>, + /// Property [`PlacementGroupArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservation.html#cfn-ec2-capacityreservation-placementgrouparn). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub placement_group_arn: Option<::Value>, /// Property [`TagSpecifications`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservation.html#cfn-ec2-capacityreservation-tagspecifications). /// /// Update type: _Immutable_. @@ -88,6 +98,12 @@ impl ::serde::Serialize for CapacityReservationProperties { } ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstancePlatform", &self.instance_platform)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceType", &self.instance_type)?; + if let Some(ref out_post_arn) = self.out_post_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OutPostArn", out_post_arn)?; + } + if let Some(ref placement_group_arn) = self.placement_group_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PlacementGroupArn", placement_group_arn)?; + } if let Some(ref tag_specifications) = self.tag_specifications { ::serde::ser::SerializeMap::serialize_entry(&mut map, "TagSpecifications", tag_specifications)?; } @@ -119,6 +135,8 @@ impl<'de> ::serde::Deserialize<'de> for CapacityReservationProperties { let mut instance_match_criteria: Option<::Value> = None; let mut instance_platform: Option<::Value> = None; let mut instance_type: Option<::Value> = None; + let mut out_post_arn: Option<::Value> = None; + let mut placement_group_arn: Option<::Value> = None; let mut tag_specifications: Option<::ValueList> = None; let mut tenancy: Option<::Value> = None; @@ -151,6 +169,12 @@ impl<'de> ::serde::Deserialize<'de> for CapacityReservationProperties { "InstanceType" => { instance_type = ::serde::de::MapAccess::next_value(&mut map)?; } + "OutPostArn" => { + out_post_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PlacementGroupArn" => { + placement_group_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } "TagSpecifications" => { tag_specifications = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -171,6 +195,8 @@ impl<'de> ::serde::Deserialize<'de> for CapacityReservationProperties { instance_match_criteria: instance_match_criteria, instance_platform: instance_platform.ok_or(::serde::de::Error::missing_field("InstancePlatform"))?, instance_type: instance_type.ok_or(::serde::de::Error::missing_field("InstanceType"))?, + out_post_arn: out_post_arn, + placement_group_arn: placement_group_arn, tag_specifications: tag_specifications, tenancy: tenancy, }) @@ -200,6 +226,188 @@ impl From for CapacityReservation { } } +/// The [`AWS::EC2::CapacityReservationFleet`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservationfleet.html) resource type. +#[derive(Debug, Default)] +pub struct CapacityReservationFleet { + properties: CapacityReservationFleetProperties +} + +/// Properties for the `CapacityReservationFleet` resource. +#[derive(Debug, Default)] +pub struct CapacityReservationFleetProperties { + /// Property [`AllocationStrategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservationfleet.html#cfn-ec2-capacityreservationfleet-allocationstrategy). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub allocation_strategy: Option<::Value>, + /// Property [`EndDate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservationfleet.html#cfn-ec2-capacityreservationfleet-enddate). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub end_date: Option<::Value>, + /// Property [`InstanceMatchCriteria`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservationfleet.html#cfn-ec2-capacityreservationfleet-instancematchcriteria). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub instance_match_criteria: Option<::Value>, + /// Property [`InstanceTypeSpecifications`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservationfleet.html#cfn-ec2-capacityreservationfleet-instancetypespecifications). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub instance_type_specifications: Option<::ValueList>, + /// Property [`NoRemoveEndDate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservationfleet.html#cfn-ec2-capacityreservationfleet-noremoveenddate). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub no_remove_end_date: Option<::Value>, + /// Property [`RemoveEndDate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservationfleet.html#cfn-ec2-capacityreservationfleet-removeenddate). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub remove_end_date: Option<::Value>, + /// Property [`TagSpecifications`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservationfleet.html#cfn-ec2-capacityreservationfleet-tagspecifications). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub tag_specifications: Option<::ValueList>, + /// Property [`Tenancy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservationfleet.html#cfn-ec2-capacityreservationfleet-tenancy). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub tenancy: Option<::Value>, + /// Property [`TotalTargetCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-capacityreservationfleet.html#cfn-ec2-capacityreservationfleet-totaltargetcapacity). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub total_target_capacity: Option<::Value>, +} + +impl ::serde::Serialize for CapacityReservationFleetProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref allocation_strategy) = self.allocation_strategy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AllocationStrategy", allocation_strategy)?; + } + if let Some(ref end_date) = self.end_date { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EndDate", end_date)?; + } + if let Some(ref instance_match_criteria) = self.instance_match_criteria { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceMatchCriteria", instance_match_criteria)?; + } + if let Some(ref instance_type_specifications) = self.instance_type_specifications { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceTypeSpecifications", instance_type_specifications)?; + } + if let Some(ref no_remove_end_date) = self.no_remove_end_date { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NoRemoveEndDate", no_remove_end_date)?; + } + if let Some(ref remove_end_date) = self.remove_end_date { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RemoveEndDate", remove_end_date)?; + } + if let Some(ref tag_specifications) = self.tag_specifications { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TagSpecifications", tag_specifications)?; + } + if let Some(ref tenancy) = self.tenancy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tenancy", tenancy)?; + } + if let Some(ref total_target_capacity) = self.total_target_capacity { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TotalTargetCapacity", total_target_capacity)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for CapacityReservationFleetProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CapacityReservationFleetProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CapacityReservationFleetProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut allocation_strategy: Option<::Value> = None; + let mut end_date: Option<::Value> = None; + let mut instance_match_criteria: Option<::Value> = None; + let mut instance_type_specifications: Option<::ValueList> = None; + let mut no_remove_end_date: Option<::Value> = None; + let mut remove_end_date: Option<::Value> = None; + let mut tag_specifications: Option<::ValueList> = None; + let mut tenancy: Option<::Value> = None; + let mut total_target_capacity: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AllocationStrategy" => { + allocation_strategy = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EndDate" => { + end_date = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceMatchCriteria" => { + instance_match_criteria = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceTypeSpecifications" => { + instance_type_specifications = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NoRemoveEndDate" => { + no_remove_end_date = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RemoveEndDate" => { + remove_end_date = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TagSpecifications" => { + tag_specifications = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tenancy" => { + tenancy = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TotalTargetCapacity" => { + total_target_capacity = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CapacityReservationFleetProperties { + allocation_strategy: allocation_strategy, + end_date: end_date, + instance_match_criteria: instance_match_criteria, + instance_type_specifications: instance_type_specifications, + no_remove_end_date: no_remove_end_date, + remove_end_date: remove_end_date, + tag_specifications: tag_specifications, + tenancy: tenancy, + total_target_capacity: total_target_capacity, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for CapacityReservationFleet { + type Properties = CapacityReservationFleetProperties; + const TYPE: &'static str = "AWS::EC2::CapacityReservationFleet"; + fn properties(&self) -> &CapacityReservationFleetProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut CapacityReservationFleetProperties { + &mut self.properties + } +} + +impl ::private::Sealed for CapacityReservationFleet {} + +impl From for CapacityReservationFleet { + fn from(properties: CapacityReservationFleetProperties) -> CapacityReservationFleet { + CapacityReservationFleet { properties } + } +} + /// The [`AWS::EC2::CarrierGateway`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-carriergateway.html) resource type. #[derive(Debug, Default)] pub struct CarrierGateway { @@ -439,6 +647,11 @@ pub struct ClientVpnEndpointProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub client_connect_options: Option<::Value>, + /// Property [`ClientLoginBannerOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnendpoint.html#cfn-ec2-clientvpnendpoint-clientloginbanneroptions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub client_login_banner_options: Option<::Value>, /// Property [`ConnectionLogOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnendpoint.html#cfn-ec2-clientvpnendpoint-connectionlogoptions). /// /// Update type: _Mutable_. @@ -469,6 +682,11 @@ pub struct ClientVpnEndpointProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub server_certificate_arn: ::Value, + /// Property [`SessionTimeoutHours`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnendpoint.html#cfn-ec2-clientvpnendpoint-sessiontimeouthours). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub session_timeout_hours: Option<::Value>, /// Property [`SplitTunnel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-clientvpnendpoint.html#cfn-ec2-clientvpnendpoint-splittunnel). /// /// Update type: _Mutable_. @@ -504,6 +722,9 @@ impl ::serde::Serialize for ClientVpnEndpointProperties { if let Some(ref client_connect_options) = self.client_connect_options { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ClientConnectOptions", client_connect_options)?; } + if let Some(ref client_login_banner_options) = self.client_login_banner_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ClientLoginBannerOptions", client_login_banner_options)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConnectionLogOptions", &self.connection_log_options)?; if let Some(ref description) = self.description { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; @@ -518,6 +739,9 @@ impl ::serde::Serialize for ClientVpnEndpointProperties { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SelfServicePortal", self_service_portal)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServerCertificateArn", &self.server_certificate_arn)?; + if let Some(ref session_timeout_hours) = self.session_timeout_hours { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SessionTimeoutHours", session_timeout_hours)?; + } if let Some(ref split_tunnel) = self.split_tunnel { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SplitTunnel", split_tunnel)?; } @@ -552,12 +776,14 @@ impl<'de> ::serde::Deserialize<'de> for ClientVpnEndpointProperties { let mut authentication_options: Option<::ValueList> = None; let mut client_cidr_block: Option<::Value> = None; let mut client_connect_options: Option<::Value> = None; + let mut client_login_banner_options: Option<::Value> = None; let mut connection_log_options: Option<::Value> = None; let mut description: Option<::Value> = None; let mut dns_servers: Option<::ValueList> = None; let mut security_group_ids: Option<::ValueList> = None; let mut self_service_portal: Option<::Value> = None; let mut server_certificate_arn: Option<::Value> = None; + let mut session_timeout_hours: Option<::Value> = None; let mut split_tunnel: Option<::Value> = None; let mut tag_specifications: Option<::ValueList> = None; let mut transport_protocol: Option<::Value> = None; @@ -575,6 +801,9 @@ impl<'de> ::serde::Deserialize<'de> for ClientVpnEndpointProperties { "ClientConnectOptions" => { client_connect_options = ::serde::de::MapAccess::next_value(&mut map)?; } + "ClientLoginBannerOptions" => { + client_login_banner_options = ::serde::de::MapAccess::next_value(&mut map)?; + } "ConnectionLogOptions" => { connection_log_options = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -593,6 +822,9 @@ impl<'de> ::serde::Deserialize<'de> for ClientVpnEndpointProperties { "ServerCertificateArn" => { server_certificate_arn = ::serde::de::MapAccess::next_value(&mut map)?; } + "SessionTimeoutHours" => { + session_timeout_hours = ::serde::de::MapAccess::next_value(&mut map)?; + } "SplitTunnel" => { split_tunnel = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -616,12 +848,14 @@ impl<'de> ::serde::Deserialize<'de> for ClientVpnEndpointProperties { authentication_options: authentication_options.ok_or(::serde::de::Error::missing_field("AuthenticationOptions"))?, client_cidr_block: client_cidr_block.ok_or(::serde::de::Error::missing_field("ClientCidrBlock"))?, client_connect_options: client_connect_options, + client_login_banner_options: client_login_banner_options, connection_log_options: connection_log_options.ok_or(::serde::de::Error::missing_field("ConnectionLogOptions"))?, description: description, dns_servers: dns_servers, security_group_ids: security_group_ids, self_service_portal: self_service_portal, server_certificate_arn: server_certificate_arn.ok_or(::serde::de::Error::missing_field("ServerCertificateArn"))?, + session_timeout_hours: session_timeout_hours, split_tunnel: split_tunnel, tag_specifications: tag_specifications, transport_protocol: transport_protocol, @@ -963,7 +1197,7 @@ impl From for CustomerGateway { } } -/// The [`AWS::EC2::DHCPOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-dhcp-options.html) resource type. +/// The [`AWS::EC2::DHCPOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-dhcpoptions.html) resource type. #[derive(Debug, Default)] pub struct DHCPOptions { properties: DHCPOptionsProperties @@ -972,32 +1206,32 @@ pub struct DHCPOptions { /// Properties for the `DHCPOptions` resource. #[derive(Debug, Default)] pub struct DHCPOptionsProperties { - /// Property [`DomainName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-dhcp-options.html#cfn-ec2-dhcpoptions-domainname). + /// Property [`DomainName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-dhcpoptions.html#cfn-ec2-dhcpoptions-domainname). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub domain_name: Option<::Value>, - /// Property [`DomainNameServers`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-dhcp-options.html#cfn-ec2-dhcpoptions-domainnameservers). + /// Property [`DomainNameServers`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-dhcpoptions.html#cfn-ec2-dhcpoptions-domainnameservers). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub domain_name_servers: Option<::ValueList>, - /// Property [`NetbiosNameServers`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-dhcp-options.html#cfn-ec2-dhcpoptions-netbiosnameservers). + /// Property [`NetbiosNameServers`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-dhcpoptions.html#cfn-ec2-dhcpoptions-netbiosnameservers). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub netbios_name_servers: Option<::ValueList>, - /// Property [`NetbiosNodeType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-dhcp-options.html#cfn-ec2-dhcpoptions-netbiosnodetype). + /// Property [`NetbiosNodeType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-dhcpoptions.html#cfn-ec2-dhcpoptions-netbiosnodetype). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub netbios_node_type: Option<::Value>, - /// Property [`NtpServers`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-dhcp-options.html#cfn-ec2-dhcpoptions-ntpservers). + /// Property [`NtpServers`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-dhcpoptions.html#cfn-ec2-dhcpoptions-ntpservers). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub ntp_servers: Option<::ValueList>, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-dhcp-options.html#cfn-ec2-dhcpoptions-tags). + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-dhcpoptions.html#cfn-ec2-dhcpoptions-tags). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. @@ -1753,6 +1987,11 @@ pub struct FlowLogProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub deliver_logs_permission_arn: Option<::Value>, + /// Property [`DestinationOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-flowlog.html#cfn-ec2-flowlog-destinationoptions). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub destination_options: Option<::Value<::json::Value>>, /// Property [`LogDestination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-flowlog.html#cfn-ec2-flowlog-logdestination). /// /// Update type: _Immutable_. @@ -1806,6 +2045,9 @@ impl ::serde::Serialize for FlowLogProperties { if let Some(ref deliver_logs_permission_arn) = self.deliver_logs_permission_arn { ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeliverLogsPermissionArn", deliver_logs_permission_arn)?; } + if let Some(ref destination_options) = self.destination_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationOptions", destination_options)?; + } if let Some(ref log_destination) = self.log_destination { ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogDestination", log_destination)?; } @@ -1844,6 +2086,7 @@ impl<'de> ::serde::Deserialize<'de> for FlowLogProperties { fn visit_map>(self, mut map: A) -> Result { let mut deliver_logs_permission_arn: Option<::Value> = None; + let mut destination_options: Option<::Value<::json::Value>> = None; let mut log_destination: Option<::Value> = None; let mut log_destination_type: Option<::Value> = None; let mut log_format: Option<::Value> = None; @@ -1859,6 +2102,9 @@ impl<'de> ::serde::Deserialize<'de> for FlowLogProperties { "DeliverLogsPermissionArn" => { deliver_logs_permission_arn = ::serde::de::MapAccess::next_value(&mut map)?; } + "DestinationOptions" => { + destination_options = ::serde::de::MapAccess::next_value(&mut map)?; + } "LogDestination" => { log_destination = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1892,6 +2138,7 @@ impl<'de> ::serde::Deserialize<'de> for FlowLogProperties { Ok(FlowLogProperties { deliver_logs_permission_arn: deliver_logs_permission_arn, + destination_options: destination_options, log_destination: log_destination, log_destination_type: log_destination_type, log_format: log_format, @@ -2128,549 +2375,530 @@ impl From for Host { } } -/// The [`AWS::EC2::Instance`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html) resource type. +/// The [`AWS::EC2::IPAM`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipam.html) resource type. #[derive(Debug, Default)] -pub struct Instance { - properties: InstanceProperties +pub struct IPAM { + properties: IPAMProperties } -/// Properties for the `Instance` resource. +/// Properties for the `IPAM` resource. #[derive(Debug, Default)] -pub struct InstanceProperties { - /// Property [`AdditionalInfo`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-additionalinfo). - /// - /// Update type: _Conditional_. - /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. - /// For more information, see the relevant resource type documentation. - pub additional_info: Option<::Value>, - /// Property [`Affinity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-affinity). - /// - /// Update type: _Conditional_. - /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. - /// For more information, see the relevant resource type documentation. - pub affinity: Option<::Value>, - /// Property [`AvailabilityZone`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-availabilityzone). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub availability_zone: Option<::Value>, - /// Property [`BlockDeviceMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-blockdevicemappings). - /// - /// Update type: _Conditional_. - /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. - /// For more information, see the relevant resource type documentation. - pub block_device_mappings: Option<::ValueList>, - /// Property [`CpuOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-cpuoptions). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub cpu_options: Option<::Value>, - /// Property [`CreditSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-creditspecification). +pub struct IPAMProperties { + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipam.html#cfn-ec2-ipam-description). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub credit_specification: Option<::Value>, - /// Property [`DisableApiTermination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-disableapitermination). + pub description: Option<::Value>, + /// Property [`OperatingRegions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipam.html#cfn-ec2-ipam-operatingregions). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub disable_api_termination: Option<::Value>, - /// Property [`EbsOptimized`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-ebsoptimized). + pub operating_regions: Option<::ValueList>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipam.html#cfn-ec2-ipam-tags). /// - /// Update type: _Conditional_. - /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. - /// For more information, see the relevant resource type documentation. - pub ebs_optimized: Option<::Value>, - /// Property [`ElasticGpuSpecifications`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-elasticgpuspecifications). + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, +} + +impl ::serde::Serialize for IPAMProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + if let Some(ref operating_regions) = self.operating_regions { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OperatingRegions", operating_regions)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for IPAMProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = IPAMProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type IPAMProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut description: Option<::Value> = None; + let mut operating_regions: Option<::ValueList> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OperatingRegions" => { + operating_regions = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(IPAMProperties { + description: description, + operating_regions: operating_regions, + tags: tags, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for IPAM { + type Properties = IPAMProperties; + const TYPE: &'static str = "AWS::EC2::IPAM"; + fn properties(&self) -> &IPAMProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut IPAMProperties { + &mut self.properties + } +} + +impl ::private::Sealed for IPAM {} + +impl From for IPAM { + fn from(properties: IPAMProperties) -> IPAM { + IPAM { properties } + } +} + +/// The [`AWS::EC2::IPAMAllocation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamallocation.html) resource type. +#[derive(Debug, Default)] +pub struct IPAMAllocation { + properties: IPAMAllocationProperties +} + +/// Properties for the `IPAMAllocation` resource. +#[derive(Debug, Default)] +pub struct IPAMAllocationProperties { + /// Property [`Cidr`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamallocation.html#cfn-ec2-ipamallocation-cidr). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub elastic_gpu_specifications: Option<::ValueList>, - /// Property [`ElasticInferenceAccelerators`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-elasticinferenceaccelerators). + pub cidr: Option<::Value>, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamallocation.html#cfn-ec2-ipamallocation-description). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub elastic_inference_accelerators: Option<::ValueList>, - /// Property [`EnclaveOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-enclaveoptions). + pub description: Option<::Value>, + /// Property [`IpamPoolId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamallocation.html#cfn-ec2-ipamallocation-ipampoolid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub enclave_options: Option<::Value>, - /// Property [`HibernationOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-hibernationoptions). + pub ipam_pool_id: ::Value, + /// Property [`NetmaskLength`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamallocation.html#cfn-ec2-ipamallocation-netmasklength). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub hibernation_options: Option<::Value>, - /// Property [`HostId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-hostid). - /// - /// Update type: _Conditional_. - /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. - /// For more information, see the relevant resource type documentation. - pub host_id: Option<::Value>, - /// Property [`HostResourceGroupArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-hostresourcegrouparn). + pub netmask_length: Option<::Value>, +} + +impl ::serde::Serialize for IPAMAllocationProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref cidr) = self.cidr { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Cidr", cidr)?; + } + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IpamPoolId", &self.ipam_pool_id)?; + if let Some(ref netmask_length) = self.netmask_length { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetmaskLength", netmask_length)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for IPAMAllocationProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = IPAMAllocationProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type IPAMAllocationProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut cidr: Option<::Value> = None; + let mut description: Option<::Value> = None; + let mut ipam_pool_id: Option<::Value> = None; + let mut netmask_length: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Cidr" => { + cidr = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IpamPoolId" => { + ipam_pool_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NetmaskLength" => { + netmask_length = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(IPAMAllocationProperties { + cidr: cidr, + description: description, + ipam_pool_id: ipam_pool_id.ok_or(::serde::de::Error::missing_field("IpamPoolId"))?, + netmask_length: netmask_length, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for IPAMAllocation { + type Properties = IPAMAllocationProperties; + const TYPE: &'static str = "AWS::EC2::IPAMAllocation"; + fn properties(&self) -> &IPAMAllocationProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut IPAMAllocationProperties { + &mut self.properties + } +} + +impl ::private::Sealed for IPAMAllocation {} + +impl From for IPAMAllocation { + fn from(properties: IPAMAllocationProperties) -> IPAMAllocation { + IPAMAllocation { properties } + } +} + +/// The [`AWS::EC2::IPAMPool`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html) resource type. +#[derive(Debug, Default)] +pub struct IPAMPool { + properties: IPAMPoolProperties +} + +/// Properties for the `IPAMPool` resource. +#[derive(Debug, Default)] +pub struct IPAMPoolProperties { + /// Property [`AddressFamily`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-addressfamily). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub host_resource_group_arn: Option<::Value>, - /// Property [`IamInstanceProfile`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-iaminstanceprofile). + pub address_family: ::Value, + /// Property [`AllocationDefaultNetmaskLength`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-allocationdefaultnetmasklength). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub iam_instance_profile: Option<::Value>, - /// Property [`ImageId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-imageid). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub image_id: Option<::Value>, - /// Property [`InstanceInitiatedShutdownBehavior`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-instanceinitiatedshutdownbehavior). + pub allocation_default_netmask_length: Option<::Value>, + /// Property [`AllocationMaxNetmaskLength`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-allocationmaxnetmasklength). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub instance_initiated_shutdown_behavior: Option<::Value>, - /// Property [`InstanceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-instancetype). - /// - /// Update type: _Conditional_. - /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. - /// For more information, see the relevant resource type documentation. - pub instance_type: Option<::Value>, - /// Property [`Ipv6AddressCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-ipv6addresscount). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub ipv6_address_count: Option<::Value>, - /// Property [`Ipv6Addresses`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-ipv6addresses). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub ipv6_addresses: Option<::ValueList>, - /// Property [`KernelId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-kernelid). + pub allocation_max_netmask_length: Option<::Value>, + /// Property [`AllocationMinNetmaskLength`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-allocationminnetmasklength). /// - /// Update type: _Conditional_. - /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. - /// For more information, see the relevant resource type documentation. - pub kernel_id: Option<::Value>, - /// Property [`KeyName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-keyname). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub key_name: Option<::Value>, - /// Property [`LaunchTemplate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-launchtemplate). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub launch_template: Option<::Value>, - /// Property [`LicenseSpecifications`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-licensespecifications). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub license_specifications: Option<::ValueList>, - /// Property [`Monitoring`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-monitoring). + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub allocation_min_netmask_length: Option<::Value>, + /// Property [`AllocationResourceTags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-allocationresourcetags). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub monitoring: Option<::Value>, - /// Property [`NetworkInterfaces`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-networkinterfaces). + pub allocation_resource_tags: Option<::ValueList<::Tag>>, + /// Property [`AutoImport`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-autoimport). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub network_interfaces: Option<::ValueList>, - /// Property [`PlacementGroupName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-placementgroupname). + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub auto_import: Option<::Value>, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-description). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub placement_group_name: Option<::Value>, - /// Property [`PrivateIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-privateipaddress). + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`IpamScopeId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-ipamscopeid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub private_ip_address: Option<::Value>, - /// Property [`RamdiskId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-ramdiskid). - /// - /// Update type: _Conditional_. - /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. - /// For more information, see the relevant resource type documentation. - pub ramdisk_id: Option<::Value>, - /// Property [`SecurityGroupIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-securitygroupids). - /// - /// Update type: _Conditional_. - /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. - /// For more information, see the relevant resource type documentation. - pub security_group_ids: Option<::ValueList>, - /// Property [`SecurityGroups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-securitygroups). + pub ipam_scope_id: ::Value, + /// Property [`Locale`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-locale). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub security_groups: Option<::ValueList>, - /// Property [`SourceDestCheck`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-sourcedestcheck). + pub locale: Option<::Value>, + /// Property [`ProvisionedCidrs`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-provisionedcidrs). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub source_dest_check: Option<::Value>, - /// Property [`SsmAssociations`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-ssmassociations). + pub provisioned_cidrs: Option<::ValueList>, + /// Property [`PubliclyAdvertisable`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-publiclyadvertisable). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub ssm_associations: Option<::ValueList>, - /// Property [`SubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-subnetid). + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub publicly_advertisable: Option<::Value>, + /// Property [`SourceIpamPoolId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-sourceipampoolid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub subnet_id: Option<::Value>, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-tags). + pub source_ipam_pool_id: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipampool.html#cfn-ec2-ipampool-tags). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub tags: Option<::ValueList<::Tag>>, - /// Property [`Tenancy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-tenancy). - /// - /// Update type: _Conditional_. - /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. - /// For more information, see the relevant resource type documentation. - pub tenancy: Option<::Value>, - /// Property [`UserData`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-userdata). - /// - /// Update type: _Conditional_. - /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. - /// For more information, see the relevant resource type documentation. - pub user_data: Option<::Value>, - /// Property [`Volumes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-volumes). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub volumes: Option<::ValueList>, } -impl ::serde::Serialize for InstanceProperties { +impl ::serde::Serialize for IPAMPoolProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref additional_info) = self.additional_info { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AdditionalInfo", additional_info)?; - } - if let Some(ref affinity) = self.affinity { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Affinity", affinity)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AddressFamily", &self.address_family)?; + if let Some(ref allocation_default_netmask_length) = self.allocation_default_netmask_length { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AllocationDefaultNetmaskLength", allocation_default_netmask_length)?; } - if let Some(ref availability_zone) = self.availability_zone { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AvailabilityZone", availability_zone)?; + if let Some(ref allocation_max_netmask_length) = self.allocation_max_netmask_length { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AllocationMaxNetmaskLength", allocation_max_netmask_length)?; } - if let Some(ref block_device_mappings) = self.block_device_mappings { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "BlockDeviceMappings", block_device_mappings)?; + if let Some(ref allocation_min_netmask_length) = self.allocation_min_netmask_length { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AllocationMinNetmaskLength", allocation_min_netmask_length)?; } - if let Some(ref cpu_options) = self.cpu_options { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CpuOptions", cpu_options)?; + if let Some(ref allocation_resource_tags) = self.allocation_resource_tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AllocationResourceTags", allocation_resource_tags)?; } - if let Some(ref credit_specification) = self.credit_specification { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CreditSpecification", credit_specification)?; + if let Some(ref auto_import) = self.auto_import { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AutoImport", auto_import)?; } - if let Some(ref disable_api_termination) = self.disable_api_termination { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DisableApiTermination", disable_api_termination)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; } - if let Some(ref ebs_optimized) = self.ebs_optimized { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "EbsOptimized", ebs_optimized)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IpamScopeId", &self.ipam_scope_id)?; + if let Some(ref locale) = self.locale { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Locale", locale)?; } - if let Some(ref elastic_gpu_specifications) = self.elastic_gpu_specifications { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ElasticGpuSpecifications", elastic_gpu_specifications)?; + if let Some(ref provisioned_cidrs) = self.provisioned_cidrs { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ProvisionedCidrs", provisioned_cidrs)?; } - if let Some(ref elastic_inference_accelerators) = self.elastic_inference_accelerators { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ElasticInferenceAccelerators", elastic_inference_accelerators)?; + if let Some(ref publicly_advertisable) = self.publicly_advertisable { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PubliclyAdvertisable", publicly_advertisable)?; } - if let Some(ref enclave_options) = self.enclave_options { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "EnclaveOptions", enclave_options)?; + if let Some(ref source_ipam_pool_id) = self.source_ipam_pool_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourceIpamPoolId", source_ipam_pool_id)?; } - if let Some(ref hibernation_options) = self.hibernation_options { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "HibernationOptions", hibernation_options)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } - if let Some(ref host_id) = self.host_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "HostId", host_id)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for IPAMPoolProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = IPAMPoolProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type IPAMPoolProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut address_family: Option<::Value> = None; + let mut allocation_default_netmask_length: Option<::Value> = None; + let mut allocation_max_netmask_length: Option<::Value> = None; + let mut allocation_min_netmask_length: Option<::Value> = None; + let mut allocation_resource_tags: Option<::ValueList<::Tag>> = None; + let mut auto_import: Option<::Value> = None; + let mut description: Option<::Value> = None; + let mut ipam_scope_id: Option<::Value> = None; + let mut locale: Option<::Value> = None; + let mut provisioned_cidrs: Option<::ValueList> = None; + let mut publicly_advertisable: Option<::Value> = None; + let mut source_ipam_pool_id: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AddressFamily" => { + address_family = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AllocationDefaultNetmaskLength" => { + allocation_default_netmask_length = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AllocationMaxNetmaskLength" => { + allocation_max_netmask_length = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AllocationMinNetmaskLength" => { + allocation_min_netmask_length = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AllocationResourceTags" => { + allocation_resource_tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AutoImport" => { + auto_import = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IpamScopeId" => { + ipam_scope_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Locale" => { + locale = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ProvisionedCidrs" => { + provisioned_cidrs = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PubliclyAdvertisable" => { + publicly_advertisable = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SourceIpamPoolId" => { + source_ipam_pool_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(IPAMPoolProperties { + address_family: address_family.ok_or(::serde::de::Error::missing_field("AddressFamily"))?, + allocation_default_netmask_length: allocation_default_netmask_length, + allocation_max_netmask_length: allocation_max_netmask_length, + allocation_min_netmask_length: allocation_min_netmask_length, + allocation_resource_tags: allocation_resource_tags, + auto_import: auto_import, + description: description, + ipam_scope_id: ipam_scope_id.ok_or(::serde::de::Error::missing_field("IpamScopeId"))?, + locale: locale, + provisioned_cidrs: provisioned_cidrs, + publicly_advertisable: publicly_advertisable, + source_ipam_pool_id: source_ipam_pool_id, + tags: tags, + }) + } } - if let Some(ref host_resource_group_arn) = self.host_resource_group_arn { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "HostResourceGroupArn", host_resource_group_arn)?; - } - if let Some(ref iam_instance_profile) = self.iam_instance_profile { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "IamInstanceProfile", iam_instance_profile)?; - } - if let Some(ref image_id) = self.image_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ImageId", image_id)?; - } - if let Some(ref instance_initiated_shutdown_behavior) = self.instance_initiated_shutdown_behavior { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceInitiatedShutdownBehavior", instance_initiated_shutdown_behavior)?; - } - if let Some(ref instance_type) = self.instance_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceType", instance_type)?; - } - if let Some(ref ipv6_address_count) = self.ipv6_address_count { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6AddressCount", ipv6_address_count)?; - } - if let Some(ref ipv6_addresses) = self.ipv6_addresses { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6Addresses", ipv6_addresses)?; - } - if let Some(ref kernel_id) = self.kernel_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "KernelId", kernel_id)?; - } - if let Some(ref key_name) = self.key_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "KeyName", key_name)?; - } - if let Some(ref launch_template) = self.launch_template { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplate", launch_template)?; - } - if let Some(ref license_specifications) = self.license_specifications { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LicenseSpecifications", license_specifications)?; - } - if let Some(ref monitoring) = self.monitoring { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Monitoring", monitoring)?; - } - if let Some(ref network_interfaces) = self.network_interfaces { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaces", network_interfaces)?; - } - if let Some(ref placement_group_name) = self.placement_group_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PlacementGroupName", placement_group_name)?; - } - if let Some(ref private_ip_address) = self.private_ip_address { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateIpAddress", private_ip_address)?; - } - if let Some(ref ramdisk_id) = self.ramdisk_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "RamdiskId", ramdisk_id)?; - } - if let Some(ref security_group_ids) = self.security_group_ids { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityGroupIds", security_group_ids)?; - } - if let Some(ref security_groups) = self.security_groups { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityGroups", security_groups)?; - } - if let Some(ref source_dest_check) = self.source_dest_check { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourceDestCheck", source_dest_check)?; - } - if let Some(ref ssm_associations) = self.ssm_associations { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SsmAssociations", ssm_associations)?; - } - if let Some(ref subnet_id) = self.subnet_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetId", subnet_id)?; + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for IPAMPool { + type Properties = IPAMPoolProperties; + const TYPE: &'static str = "AWS::EC2::IPAMPool"; + fn properties(&self) -> &IPAMPoolProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut IPAMPoolProperties { + &mut self.properties + } +} + +impl ::private::Sealed for IPAMPool {} + +impl From for IPAMPool { + fn from(properties: IPAMPoolProperties) -> IPAMPool { + IPAMPool { properties } + } +} + +/// The [`AWS::EC2::IPAMScope`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamscope.html) resource type. +#[derive(Debug, Default)] +pub struct IPAMScope { + properties: IPAMScopeProperties +} + +/// Properties for the `IPAMScope` resource. +#[derive(Debug, Default)] +pub struct IPAMScopeProperties { + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamscope.html#cfn-ec2-ipamscope-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`IpamId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamscope.html#cfn-ec2-ipamscope-ipamid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub ipam_id: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-ipamscope.html#cfn-ec2-ipamscope-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, +} + +impl ::serde::Serialize for IPAMScopeProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IpamId", &self.ipam_id)?; if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } - if let Some(ref tenancy) = self.tenancy { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tenancy", tenancy)?; - } - if let Some(ref user_data) = self.user_data { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "UserData", user_data)?; - } - if let Some(ref volumes) = self.volumes { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Volumes", volumes)?; - } ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for InstanceProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for IPAMScopeProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = InstanceProperties; + type Value = IPAMScopeProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type InstanceProperties") + write!(f, "a struct of type IPAMScopeProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut additional_info: Option<::Value> = None; - let mut affinity: Option<::Value> = None; - let mut availability_zone: Option<::Value> = None; - let mut block_device_mappings: Option<::ValueList> = None; - let mut cpu_options: Option<::Value> = None; - let mut credit_specification: Option<::Value> = None; - let mut disable_api_termination: Option<::Value> = None; - let mut ebs_optimized: Option<::Value> = None; - let mut elastic_gpu_specifications: Option<::ValueList> = None; - let mut elastic_inference_accelerators: Option<::ValueList> = None; - let mut enclave_options: Option<::Value> = None; - let mut hibernation_options: Option<::Value> = None; - let mut host_id: Option<::Value> = None; - let mut host_resource_group_arn: Option<::Value> = None; - let mut iam_instance_profile: Option<::Value> = None; - let mut image_id: Option<::Value> = None; - let mut instance_initiated_shutdown_behavior: Option<::Value> = None; - let mut instance_type: Option<::Value> = None; - let mut ipv6_address_count: Option<::Value> = None; - let mut ipv6_addresses: Option<::ValueList> = None; - let mut kernel_id: Option<::Value> = None; - let mut key_name: Option<::Value> = None; - let mut launch_template: Option<::Value> = None; - let mut license_specifications: Option<::ValueList> = None; - let mut monitoring: Option<::Value> = None; - let mut network_interfaces: Option<::ValueList> = None; - let mut placement_group_name: Option<::Value> = None; - let mut private_ip_address: Option<::Value> = None; - let mut ramdisk_id: Option<::Value> = None; - let mut security_group_ids: Option<::ValueList> = None; - let mut security_groups: Option<::ValueList> = None; - let mut source_dest_check: Option<::Value> = None; - let mut ssm_associations: Option<::ValueList> = None; - let mut subnet_id: Option<::Value> = None; + let mut description: Option<::Value> = None; + let mut ipam_id: Option<::Value> = None; let mut tags: Option<::ValueList<::Tag>> = None; - let mut tenancy: Option<::Value> = None; - let mut user_data: Option<::Value> = None; - let mut volumes: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "AdditionalInfo" => { - additional_info = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Affinity" => { - affinity = ::serde::de::MapAccess::next_value(&mut map)?; - } - "AvailabilityZone" => { - availability_zone = ::serde::de::MapAccess::next_value(&mut map)?; - } - "BlockDeviceMappings" => { - block_device_mappings = ::serde::de::MapAccess::next_value(&mut map)?; - } - "CpuOptions" => { - cpu_options = ::serde::de::MapAccess::next_value(&mut map)?; - } - "CreditSpecification" => { - credit_specification = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DisableApiTermination" => { - disable_api_termination = ::serde::de::MapAccess::next_value(&mut map)?; - } - "EbsOptimized" => { - ebs_optimized = ::serde::de::MapAccess::next_value(&mut map)?; - } - "ElasticGpuSpecifications" => { - elastic_gpu_specifications = ::serde::de::MapAccess::next_value(&mut map)?; - } - "ElasticInferenceAccelerators" => { - elastic_inference_accelerators = ::serde::de::MapAccess::next_value(&mut map)?; - } - "EnclaveOptions" => { - enclave_options = ::serde::de::MapAccess::next_value(&mut map)?; - } - "HibernationOptions" => { - hibernation_options = ::serde::de::MapAccess::next_value(&mut map)?; - } - "HostId" => { - host_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "HostResourceGroupArn" => { - host_resource_group_arn = ::serde::de::MapAccess::next_value(&mut map)?; - } - "IamInstanceProfile" => { - iam_instance_profile = ::serde::de::MapAccess::next_value(&mut map)?; - } - "ImageId" => { - image_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "InstanceInitiatedShutdownBehavior" => { - instance_initiated_shutdown_behavior = ::serde::de::MapAccess::next_value(&mut map)?; - } - "InstanceType" => { - instance_type = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Ipv6AddressCount" => { - ipv6_address_count = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Ipv6Addresses" => { - ipv6_addresses = ::serde::de::MapAccess::next_value(&mut map)?; - } - "KernelId" => { - kernel_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "KeyName" => { - key_name = ::serde::de::MapAccess::next_value(&mut map)?; - } - "LaunchTemplate" => { - launch_template = ::serde::de::MapAccess::next_value(&mut map)?; - } - "LicenseSpecifications" => { - license_specifications = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Monitoring" => { - monitoring = ::serde::de::MapAccess::next_value(&mut map)?; - } - "NetworkInterfaces" => { - network_interfaces = ::serde::de::MapAccess::next_value(&mut map)?; - } - "PlacementGroupName" => { - placement_group_name = ::serde::de::MapAccess::next_value(&mut map)?; - } - "PrivateIpAddress" => { - private_ip_address = ::serde::de::MapAccess::next_value(&mut map)?; - } - "RamdiskId" => { - ramdisk_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SecurityGroupIds" => { - security_group_ids = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SecurityGroups" => { - security_groups = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SourceDestCheck" => { - source_dest_check = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SsmAssociations" => { - ssm_associations = ::serde::de::MapAccess::next_value(&mut map)?; + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; } - "SubnetId" => { - subnet_id = ::serde::de::MapAccess::next_value(&mut map)?; + "IpamId" => { + ipam_id = ::serde::de::MapAccess::next_value(&mut map)?; } "Tags" => { tags = ::serde::de::MapAccess::next_value(&mut map)?; } - "Tenancy" => { - tenancy = ::serde::de::MapAccess::next_value(&mut map)?; - } - "UserData" => { - user_data = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Volumes" => { - volumes = ::serde::de::MapAccess::next_value(&mut map)?; - } _ => {} } } - Ok(InstanceProperties { - additional_info: additional_info, - affinity: affinity, - availability_zone: availability_zone, - block_device_mappings: block_device_mappings, - cpu_options: cpu_options, - credit_specification: credit_specification, - disable_api_termination: disable_api_termination, - ebs_optimized: ebs_optimized, - elastic_gpu_specifications: elastic_gpu_specifications, - elastic_inference_accelerators: elastic_inference_accelerators, - enclave_options: enclave_options, - hibernation_options: hibernation_options, - host_id: host_id, - host_resource_group_arn: host_resource_group_arn, - iam_instance_profile: iam_instance_profile, - image_id: image_id, - instance_initiated_shutdown_behavior: instance_initiated_shutdown_behavior, - instance_type: instance_type, - ipv6_address_count: ipv6_address_count, - ipv6_addresses: ipv6_addresses, - kernel_id: kernel_id, - key_name: key_name, - launch_template: launch_template, - license_specifications: license_specifications, - monitoring: monitoring, - network_interfaces: network_interfaces, - placement_group_name: placement_group_name, - private_ip_address: private_ip_address, - ramdisk_id: ramdisk_id, - security_group_ids: security_group_ids, - security_groups: security_groups, - source_dest_check: source_dest_check, - ssm_associations: ssm_associations, - subnet_id: subnet_id, + Ok(IPAMScopeProperties { + description: description, + ipam_id: ipam_id.ok_or(::serde::de::Error::missing_field("IpamId"))?, tags: tags, - tenancy: tenancy, - user_data: user_data, - volumes: volumes, }) } } @@ -2679,477 +2907,534 @@ impl<'de> ::serde::Deserialize<'de> for InstanceProperties { } } -impl ::Resource for Instance { - type Properties = InstanceProperties; - const TYPE: &'static str = "AWS::EC2::Instance"; - fn properties(&self) -> &InstanceProperties { +impl ::Resource for IPAMScope { + type Properties = IPAMScopeProperties; + const TYPE: &'static str = "AWS::EC2::IPAMScope"; + fn properties(&self) -> &IPAMScopeProperties { &self.properties } - fn properties_mut(&mut self) -> &mut InstanceProperties { + fn properties_mut(&mut self) -> &mut IPAMScopeProperties { &mut self.properties } } -impl ::private::Sealed for Instance {} +impl ::private::Sealed for IPAMScope {} -impl From for Instance { - fn from(properties: InstanceProperties) -> Instance { - Instance { properties } +impl From for IPAMScope { + fn from(properties: IPAMScopeProperties) -> IPAMScope { + IPAMScope { properties } } } -/// The [`AWS::EC2::InternetGateway`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-internetgateway.html) resource type. +/// The [`AWS::EC2::Instance`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html) resource type. #[derive(Debug, Default)] -pub struct InternetGateway { - properties: InternetGatewayProperties +pub struct Instance { + properties: InstanceProperties } -/// Properties for the `InternetGateway` resource. +/// Properties for the `Instance` resource. #[derive(Debug, Default)] -pub struct InternetGatewayProperties { - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-internetgateway.html#cfn-ec2-internetgateway-tags). +pub struct InstanceProperties { + /// Property [`AdditionalInfo`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-additionalinfo). + /// + /// Update type: _Conditional_. + /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. + /// For more information, see the relevant resource type documentation. + pub additional_info: Option<::Value>, + /// Property [`Affinity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-affinity). + /// + /// Update type: _Conditional_. + /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. + /// For more information, see the relevant resource type documentation. + pub affinity: Option<::Value>, + /// Property [`AvailabilityZone`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-availabilityzone). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub availability_zone: Option<::Value>, + /// Property [`BlockDeviceMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-blockdevicemappings). + /// + /// Update type: _Conditional_. + /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. + /// For more information, see the relevant resource type documentation. + pub block_device_mappings: Option<::ValueList>, + /// Property [`CpuOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-cpuoptions). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub cpu_options: Option<::Value>, + /// Property [`CreditSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-creditspecification). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub tags: Option<::ValueList<::Tag>>, -} - -impl ::serde::Serialize for InternetGatewayProperties { - fn serialize(&self, s: S) -> Result { - let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref tags) = self.tags { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; - } - ::serde::ser::SerializeMap::end(map) - } -} - -impl<'de> ::serde::Deserialize<'de> for InternetGatewayProperties { - fn deserialize>(d: D) -> Result { - struct Visitor; - - impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = InternetGatewayProperties; - - fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type InternetGatewayProperties") - } - - fn visit_map>(self, mut map: A) -> Result { - let mut tags: Option<::ValueList<::Tag>> = None; - - while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { - match __cfn_key.as_ref() { - "Tags" => { - tags = ::serde::de::MapAccess::next_value(&mut map)?; - } - _ => {} - } - } - - Ok(InternetGatewayProperties { - tags: tags, - }) - } - } - - d.deserialize_map(Visitor) - } -} - -impl ::Resource for InternetGateway { - type Properties = InternetGatewayProperties; - const TYPE: &'static str = "AWS::EC2::InternetGateway"; - fn properties(&self) -> &InternetGatewayProperties { - &self.properties - } - fn properties_mut(&mut self) -> &mut InternetGatewayProperties { - &mut self.properties - } -} - -impl ::private::Sealed for InternetGateway {} - -impl From for InternetGateway { - fn from(properties: InternetGatewayProperties) -> InternetGateway { - InternetGateway { properties } - } -} - -/// The [`AWS::EC2::LaunchTemplate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html) resource type. -#[derive(Debug, Default)] -pub struct LaunchTemplate { - properties: LaunchTemplateProperties -} - -/// Properties for the `LaunchTemplate` resource. -#[derive(Debug, Default)] -pub struct LaunchTemplateProperties { - /// Property [`LaunchTemplateData`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html#cfn-ec2-launchtemplate-launchtemplatedata). + pub credit_specification: Option<::Value>, + /// Property [`DisableApiTermination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-disableapitermination). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub launch_template_data: Option<::Value>, - /// Property [`LaunchTemplateName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html#cfn-ec2-launchtemplate-launchtemplatename). + pub disable_api_termination: Option<::Value>, + /// Property [`EbsOptimized`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-ebsoptimized). + /// + /// Update type: _Conditional_. + /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. + /// For more information, see the relevant resource type documentation. + pub ebs_optimized: Option<::Value>, + /// Property [`ElasticGpuSpecifications`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-elasticgpuspecifications). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub launch_template_name: Option<::Value>, - /// Property [`TagSpecifications`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html#cfn-ec2-launchtemplate-tagspecifications). + pub elastic_gpu_specifications: Option<::ValueList>, + /// Property [`ElasticInferenceAccelerators`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-elasticinferenceaccelerators). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub elastic_inference_accelerators: Option<::ValueList>, + /// Property [`EnclaveOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-enclaveoptions). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub enclave_options: Option<::Value>, + /// Property [`HibernationOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-hibernationoptions). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub hibernation_options: Option<::Value>, + /// Property [`HostId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-hostid). + /// + /// Update type: _Conditional_. + /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. + /// For more information, see the relevant resource type documentation. + pub host_id: Option<::Value>, + /// Property [`HostResourceGroupArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-hostresourcegrouparn). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub host_resource_group_arn: Option<::Value>, + /// Property [`IamInstanceProfile`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-iaminstanceprofile). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub tag_specifications: Option<::ValueList>, -} - -impl ::serde::Serialize for LaunchTemplateProperties { - fn serialize(&self, s: S) -> Result { - let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref launch_template_data) = self.launch_template_data { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplateData", launch_template_data)?; - } - if let Some(ref launch_template_name) = self.launch_template_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplateName", launch_template_name)?; - } - if let Some(ref tag_specifications) = self.tag_specifications { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TagSpecifications", tag_specifications)?; - } - ::serde::ser::SerializeMap::end(map) - } -} - -impl<'de> ::serde::Deserialize<'de> for LaunchTemplateProperties { - fn deserialize>(d: D) -> Result { - struct Visitor; - - impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = LaunchTemplateProperties; - - fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type LaunchTemplateProperties") - } - - fn visit_map>(self, mut map: A) -> Result { - let mut launch_template_data: Option<::Value> = None; - let mut launch_template_name: Option<::Value> = None; - let mut tag_specifications: Option<::ValueList> = None; - - while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { - match __cfn_key.as_ref() { - "LaunchTemplateData" => { - launch_template_data = ::serde::de::MapAccess::next_value(&mut map)?; - } - "LaunchTemplateName" => { - launch_template_name = ::serde::de::MapAccess::next_value(&mut map)?; - } - "TagSpecifications" => { - tag_specifications = ::serde::de::MapAccess::next_value(&mut map)?; - } - _ => {} - } - } - - Ok(LaunchTemplateProperties { - launch_template_data: launch_template_data, - launch_template_name: launch_template_name, - tag_specifications: tag_specifications, - }) - } - } - - d.deserialize_map(Visitor) - } -} - -impl ::Resource for LaunchTemplate { - type Properties = LaunchTemplateProperties; - const TYPE: &'static str = "AWS::EC2::LaunchTemplate"; - fn properties(&self) -> &LaunchTemplateProperties { - &self.properties - } - fn properties_mut(&mut self) -> &mut LaunchTemplateProperties { - &mut self.properties - } -} - -impl ::private::Sealed for LaunchTemplate {} - -impl From for LaunchTemplate { - fn from(properties: LaunchTemplateProperties) -> LaunchTemplate { - LaunchTemplate { properties } - } -} - -/// The [`AWS::EC2::LocalGatewayRoute`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroute.html) resource type. -#[derive(Debug, Default)] -pub struct LocalGatewayRoute { - properties: LocalGatewayRouteProperties -} - -/// Properties for the `LocalGatewayRoute` resource. -#[derive(Debug, Default)] -pub struct LocalGatewayRouteProperties { - /// Property [`DestinationCidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroute.html#cfn-ec2-localgatewayroute-destinationcidrblock). + pub iam_instance_profile: Option<::Value>, + /// Property [`ImageId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-imageid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub destination_cidr_block: ::Value, - /// Property [`LocalGatewayRouteTableId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroute.html#cfn-ec2-localgatewayroute-localgatewayroutetableid). + pub image_id: Option<::Value>, + /// Property [`InstanceInitiatedShutdownBehavior`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-instanceinitiatedshutdownbehavior). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub instance_initiated_shutdown_behavior: Option<::Value>, + /// Property [`InstanceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-instancetype). + /// + /// Update type: _Conditional_. + /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. + /// For more information, see the relevant resource type documentation. + pub instance_type: Option<::Value>, + /// Property [`Ipv6AddressCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-ipv6addresscount). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub local_gateway_route_table_id: ::Value, - /// Property [`LocalGatewayVirtualInterfaceGroupId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroute.html#cfn-ec2-localgatewayroute-localgatewayvirtualinterfacegroupid). + pub ipv6_address_count: Option<::Value>, + /// Property [`Ipv6Addresses`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-ipv6addresses). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub local_gateway_virtual_interface_group_id: ::Value, -} - -impl ::serde::Serialize for LocalGatewayRouteProperties { - fn serialize(&self, s: S) -> Result { - let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationCidrBlock", &self.destination_cidr_block)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LocalGatewayRouteTableId", &self.local_gateway_route_table_id)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LocalGatewayVirtualInterfaceGroupId", &self.local_gateway_virtual_interface_group_id)?; - ::serde::ser::SerializeMap::end(map) - } -} - -impl<'de> ::serde::Deserialize<'de> for LocalGatewayRouteProperties { - fn deserialize>(d: D) -> Result { - struct Visitor; - - impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = LocalGatewayRouteProperties; - - fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type LocalGatewayRouteProperties") - } - - fn visit_map>(self, mut map: A) -> Result { - let mut destination_cidr_block: Option<::Value> = None; - let mut local_gateway_route_table_id: Option<::Value> = None; - let mut local_gateway_virtual_interface_group_id: Option<::Value> = None; - - while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { - match __cfn_key.as_ref() { - "DestinationCidrBlock" => { - destination_cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; - } - "LocalGatewayRouteTableId" => { - local_gateway_route_table_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "LocalGatewayVirtualInterfaceGroupId" => { - local_gateway_virtual_interface_group_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - _ => {} - } - } - - Ok(LocalGatewayRouteProperties { - destination_cidr_block: destination_cidr_block.ok_or(::serde::de::Error::missing_field("DestinationCidrBlock"))?, - local_gateway_route_table_id: local_gateway_route_table_id.ok_or(::serde::de::Error::missing_field("LocalGatewayRouteTableId"))?, - local_gateway_virtual_interface_group_id: local_gateway_virtual_interface_group_id.ok_or(::serde::de::Error::missing_field("LocalGatewayVirtualInterfaceGroupId"))?, - }) - } - } - - d.deserialize_map(Visitor) - } -} - -impl ::Resource for LocalGatewayRoute { - type Properties = LocalGatewayRouteProperties; - const TYPE: &'static str = "AWS::EC2::LocalGatewayRoute"; - fn properties(&self) -> &LocalGatewayRouteProperties { - &self.properties - } - fn properties_mut(&mut self) -> &mut LocalGatewayRouteProperties { - &mut self.properties - } -} - -impl ::private::Sealed for LocalGatewayRoute {} - -impl From for LocalGatewayRoute { - fn from(properties: LocalGatewayRouteProperties) -> LocalGatewayRoute { - LocalGatewayRoute { properties } - } -} - -/// The [`AWS::EC2::LocalGatewayRouteTableVPCAssociation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroutetablevpcassociation.html) resource type. -#[derive(Debug, Default)] -pub struct LocalGatewayRouteTableVPCAssociation { - properties: LocalGatewayRouteTableVPCAssociationProperties -} - -/// Properties for the `LocalGatewayRouteTableVPCAssociation` resource. -#[derive(Debug, Default)] -pub struct LocalGatewayRouteTableVPCAssociationProperties { - /// Property [`LocalGatewayRouteTableId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroutetablevpcassociation.html#cfn-ec2-localgatewayroutetablevpcassociation-localgatewayroutetableid). + pub ipv6_addresses: Option<::ValueList>, + /// Property [`KernelId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-kernelid). + /// + /// Update type: _Conditional_. + /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. + /// For more information, see the relevant resource type documentation. + pub kernel_id: Option<::Value>, + /// Property [`KeyName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-keyname). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub local_gateway_route_table_id: ::Value, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroutetablevpcassociation.html#cfn-ec2-localgatewayroutetablevpcassociation-tags). + pub key_name: Option<::Value>, + /// Property [`LaunchTemplate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-launchtemplate). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub launch_template: Option<::Value>, + /// Property [`LicenseSpecifications`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-licensespecifications). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub license_specifications: Option<::ValueList>, + /// Property [`Monitoring`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-monitoring). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub tags: Option<::ValueList<::Tag>>, - /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroutetablevpcassociation.html#cfn-ec2-localgatewayroutetablevpcassociation-vpcid). + pub monitoring: Option<::Value>, + /// Property [`NetworkInterfaces`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-networkinterfaces). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub vpc_id: ::Value, + pub network_interfaces: Option<::ValueList>, + /// Property [`PlacementGroupName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-placementgroupname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub placement_group_name: Option<::Value>, + /// Property [`PrivateDnsNameOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-privatednsnameoptions). + /// + /// Update type: _Conditional_. + /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. + /// For more information, see the relevant resource type documentation. + pub private_dns_name_options: Option<::Value>, + /// Property [`PrivateIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-privateipaddress). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub private_ip_address: Option<::Value>, + /// Property [`PropagateTagsToVolumeOnCreation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-propagatetagstovolumeoncreation). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub propagate_tags_to_volume_on_creation: Option<::Value>, + /// Property [`RamdiskId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-ramdiskid). + /// + /// Update type: _Conditional_. + /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. + /// For more information, see the relevant resource type documentation. + pub ramdisk_id: Option<::Value>, + /// Property [`SecurityGroupIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-securitygroupids). + /// + /// Update type: _Conditional_. + /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. + /// For more information, see the relevant resource type documentation. + pub security_group_ids: Option<::ValueList>, + /// Property [`SecurityGroups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-securitygroups). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub security_groups: Option<::ValueList>, + /// Property [`SourceDestCheck`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-sourcedestcheck). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub source_dest_check: Option<::Value>, + /// Property [`SsmAssociations`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-ssmassociations). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ssm_associations: Option<::ValueList>, + /// Property [`SubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-subnetid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub subnet_id: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`Tenancy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-tenancy). + /// + /// Update type: _Conditional_. + /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. + /// For more information, see the relevant resource type documentation. + pub tenancy: Option<::Value>, + /// Property [`UserData`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-userdata). + /// + /// Update type: _Conditional_. + /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. + /// For more information, see the relevant resource type documentation. + pub user_data: Option<::Value>, + /// Property [`Volumes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#cfn-ec2-instance-volumes). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub volumes: Option<::ValueList>, } -impl ::serde::Serialize for LocalGatewayRouteTableVPCAssociationProperties { +impl ::serde::Serialize for InstanceProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LocalGatewayRouteTableId", &self.local_gateway_route_table_id)?; - if let Some(ref tags) = self.tags { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + if let Some(ref additional_info) = self.additional_info { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AdditionalInfo", additional_info)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", &self.vpc_id)?; - ::serde::ser::SerializeMap::end(map) - } -} - -impl<'de> ::serde::Deserialize<'de> for LocalGatewayRouteTableVPCAssociationProperties { - fn deserialize>(d: D) -> Result { - struct Visitor; - - impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = LocalGatewayRouteTableVPCAssociationProperties; - - fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type LocalGatewayRouteTableVPCAssociationProperties") - } - - fn visit_map>(self, mut map: A) -> Result { - let mut local_gateway_route_table_id: Option<::Value> = None; - let mut tags: Option<::ValueList<::Tag>> = None; - let mut vpc_id: Option<::Value> = None; - - while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { - match __cfn_key.as_ref() { - "LocalGatewayRouteTableId" => { - local_gateway_route_table_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Tags" => { - tags = ::serde::de::MapAccess::next_value(&mut map)?; - } - "VpcId" => { - vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - _ => {} - } - } - - Ok(LocalGatewayRouteTableVPCAssociationProperties { - local_gateway_route_table_id: local_gateway_route_table_id.ok_or(::serde::de::Error::missing_field("LocalGatewayRouteTableId"))?, - tags: tags, - vpc_id: vpc_id.ok_or(::serde::de::Error::missing_field("VpcId"))?, - }) - } + if let Some(ref affinity) = self.affinity { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Affinity", affinity)?; } - - d.deserialize_map(Visitor) - } -} - -impl ::Resource for LocalGatewayRouteTableVPCAssociation { - type Properties = LocalGatewayRouteTableVPCAssociationProperties; - const TYPE: &'static str = "AWS::EC2::LocalGatewayRouteTableVPCAssociation"; - fn properties(&self) -> &LocalGatewayRouteTableVPCAssociationProperties { - &self.properties - } - fn properties_mut(&mut self) -> &mut LocalGatewayRouteTableVPCAssociationProperties { - &mut self.properties - } -} - -impl ::private::Sealed for LocalGatewayRouteTableVPCAssociation {} - -impl From for LocalGatewayRouteTableVPCAssociation { - fn from(properties: LocalGatewayRouteTableVPCAssociationProperties) -> LocalGatewayRouteTableVPCAssociation { - LocalGatewayRouteTableVPCAssociation { properties } - } -} - -/// The [`AWS::EC2::NatGateway`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html) resource type. -#[derive(Debug, Default)] -pub struct NatGateway { - properties: NatGatewayProperties -} - -/// Properties for the `NatGateway` resource. -#[derive(Debug, Default)] -pub struct NatGatewayProperties { - /// Property [`AllocationId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html#cfn-ec2-natgateway-allocationid). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub allocation_id: Option<::Value>, - /// Property [`ConnectivityType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html#cfn-ec2-natgateway-connectivitytype). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub connectivity_type: Option<::Value>, - /// Property [`SubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html#cfn-ec2-natgateway-subnetid). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub subnet_id: ::Value, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html#cfn-ec2-natgateway-tags). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub tags: Option<::ValueList<::Tag>>, -} - -impl ::serde::Serialize for NatGatewayProperties { - fn serialize(&self, s: S) -> Result { - let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref allocation_id) = self.allocation_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AllocationId", allocation_id)?; + if let Some(ref availability_zone) = self.availability_zone { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AvailabilityZone", availability_zone)?; } - if let Some(ref connectivity_type) = self.connectivity_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConnectivityType", connectivity_type)?; + if let Some(ref block_device_mappings) = self.block_device_mappings { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BlockDeviceMappings", block_device_mappings)?; + } + if let Some(ref cpu_options) = self.cpu_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CpuOptions", cpu_options)?; + } + if let Some(ref credit_specification) = self.credit_specification { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CreditSpecification", credit_specification)?; + } + if let Some(ref disable_api_termination) = self.disable_api_termination { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DisableApiTermination", disable_api_termination)?; + } + if let Some(ref ebs_optimized) = self.ebs_optimized { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EbsOptimized", ebs_optimized)?; + } + if let Some(ref elastic_gpu_specifications) = self.elastic_gpu_specifications { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ElasticGpuSpecifications", elastic_gpu_specifications)?; + } + if let Some(ref elastic_inference_accelerators) = self.elastic_inference_accelerators { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ElasticInferenceAccelerators", elastic_inference_accelerators)?; + } + if let Some(ref enclave_options) = self.enclave_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EnclaveOptions", enclave_options)?; + } + if let Some(ref hibernation_options) = self.hibernation_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HibernationOptions", hibernation_options)?; + } + if let Some(ref host_id) = self.host_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HostId", host_id)?; + } + if let Some(ref host_resource_group_arn) = self.host_resource_group_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HostResourceGroupArn", host_resource_group_arn)?; + } + if let Some(ref iam_instance_profile) = self.iam_instance_profile { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IamInstanceProfile", iam_instance_profile)?; + } + if let Some(ref image_id) = self.image_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ImageId", image_id)?; + } + if let Some(ref instance_initiated_shutdown_behavior) = self.instance_initiated_shutdown_behavior { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceInitiatedShutdownBehavior", instance_initiated_shutdown_behavior)?; + } + if let Some(ref instance_type) = self.instance_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceType", instance_type)?; + } + if let Some(ref ipv6_address_count) = self.ipv6_address_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6AddressCount", ipv6_address_count)?; + } + if let Some(ref ipv6_addresses) = self.ipv6_addresses { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6Addresses", ipv6_addresses)?; + } + if let Some(ref kernel_id) = self.kernel_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "KernelId", kernel_id)?; + } + if let Some(ref key_name) = self.key_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "KeyName", key_name)?; + } + if let Some(ref launch_template) = self.launch_template { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplate", launch_template)?; + } + if let Some(ref license_specifications) = self.license_specifications { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LicenseSpecifications", license_specifications)?; + } + if let Some(ref monitoring) = self.monitoring { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Monitoring", monitoring)?; + } + if let Some(ref network_interfaces) = self.network_interfaces { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaces", network_interfaces)?; + } + if let Some(ref placement_group_name) = self.placement_group_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PlacementGroupName", placement_group_name)?; + } + if let Some(ref private_dns_name_options) = self.private_dns_name_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateDnsNameOptions", private_dns_name_options)?; + } + if let Some(ref private_ip_address) = self.private_ip_address { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateIpAddress", private_ip_address)?; + } + if let Some(ref propagate_tags_to_volume_on_creation) = self.propagate_tags_to_volume_on_creation { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PropagateTagsToVolumeOnCreation", propagate_tags_to_volume_on_creation)?; + } + if let Some(ref ramdisk_id) = self.ramdisk_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RamdiskId", ramdisk_id)?; + } + if let Some(ref security_group_ids) = self.security_group_ids { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityGroupIds", security_group_ids)?; + } + if let Some(ref security_groups) = self.security_groups { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityGroups", security_groups)?; + } + if let Some(ref source_dest_check) = self.source_dest_check { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourceDestCheck", source_dest_check)?; + } + if let Some(ref ssm_associations) = self.ssm_associations { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SsmAssociations", ssm_associations)?; + } + if let Some(ref subnet_id) = self.subnet_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetId", subnet_id)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetId", &self.subnet_id)?; if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } + if let Some(ref tenancy) = self.tenancy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tenancy", tenancy)?; + } + if let Some(ref user_data) = self.user_data { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UserData", user_data)?; + } + if let Some(ref volumes) = self.volumes { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Volumes", volumes)?; + } ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for NatGatewayProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for InstanceProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = NatGatewayProperties; + type Value = InstanceProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type NatGatewayProperties") + write!(f, "a struct of type InstanceProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut allocation_id: Option<::Value> = None; - let mut connectivity_type: Option<::Value> = None; + let mut additional_info: Option<::Value> = None; + let mut affinity: Option<::Value> = None; + let mut availability_zone: Option<::Value> = None; + let mut block_device_mappings: Option<::ValueList> = None; + let mut cpu_options: Option<::Value> = None; + let mut credit_specification: Option<::Value> = None; + let mut disable_api_termination: Option<::Value> = None; + let mut ebs_optimized: Option<::Value> = None; + let mut elastic_gpu_specifications: Option<::ValueList> = None; + let mut elastic_inference_accelerators: Option<::ValueList> = None; + let mut enclave_options: Option<::Value> = None; + let mut hibernation_options: Option<::Value> = None; + let mut host_id: Option<::Value> = None; + let mut host_resource_group_arn: Option<::Value> = None; + let mut iam_instance_profile: Option<::Value> = None; + let mut image_id: Option<::Value> = None; + let mut instance_initiated_shutdown_behavior: Option<::Value> = None; + let mut instance_type: Option<::Value> = None; + let mut ipv6_address_count: Option<::Value> = None; + let mut ipv6_addresses: Option<::ValueList> = None; + let mut kernel_id: Option<::Value> = None; + let mut key_name: Option<::Value> = None; + let mut launch_template: Option<::Value> = None; + let mut license_specifications: Option<::ValueList> = None; + let mut monitoring: Option<::Value> = None; + let mut network_interfaces: Option<::ValueList> = None; + let mut placement_group_name: Option<::Value> = None; + let mut private_dns_name_options: Option<::Value> = None; + let mut private_ip_address: Option<::Value> = None; + let mut propagate_tags_to_volume_on_creation: Option<::Value> = None; + let mut ramdisk_id: Option<::Value> = None; + let mut security_group_ids: Option<::ValueList> = None; + let mut security_groups: Option<::ValueList> = None; + let mut source_dest_check: Option<::Value> = None; + let mut ssm_associations: Option<::ValueList> = None; let mut subnet_id: Option<::Value> = None; let mut tags: Option<::ValueList<::Tag>> = None; - - while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + let mut tenancy: Option<::Value> = None; + let mut user_data: Option<::Value> = None; + let mut volumes: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "AllocationId" => { - allocation_id = ::serde::de::MapAccess::next_value(&mut map)?; + "AdditionalInfo" => { + additional_info = ::serde::de::MapAccess::next_value(&mut map)?; } - "ConnectivityType" => { - connectivity_type = ::serde::de::MapAccess::next_value(&mut map)?; + "Affinity" => { + affinity = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AvailabilityZone" => { + availability_zone = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BlockDeviceMappings" => { + block_device_mappings = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CpuOptions" => { + cpu_options = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CreditSpecification" => { + credit_specification = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DisableApiTermination" => { + disable_api_termination = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EbsOptimized" => { + ebs_optimized = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ElasticGpuSpecifications" => { + elastic_gpu_specifications = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ElasticInferenceAccelerators" => { + elastic_inference_accelerators = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EnclaveOptions" => { + enclave_options = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HibernationOptions" => { + hibernation_options = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HostId" => { + host_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HostResourceGroupArn" => { + host_resource_group_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IamInstanceProfile" => { + iam_instance_profile = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ImageId" => { + image_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceInitiatedShutdownBehavior" => { + instance_initiated_shutdown_behavior = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceType" => { + instance_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Ipv6AddressCount" => { + ipv6_address_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Ipv6Addresses" => { + ipv6_addresses = ::serde::de::MapAccess::next_value(&mut map)?; + } + "KernelId" => { + kernel_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "KeyName" => { + key_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LaunchTemplate" => { + launch_template = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LicenseSpecifications" => { + license_specifications = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Monitoring" => { + monitoring = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NetworkInterfaces" => { + network_interfaces = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PlacementGroupName" => { + placement_group_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PrivateDnsNameOptions" => { + private_dns_name_options = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PrivateIpAddress" => { + private_ip_address = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PropagateTagsToVolumeOnCreation" => { + propagate_tags_to_volume_on_creation = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RamdiskId" => { + ramdisk_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SecurityGroupIds" => { + security_group_ids = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SecurityGroups" => { + security_groups = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SourceDestCheck" => { + source_dest_check = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SsmAssociations" => { + ssm_associations = ::serde::de::MapAccess::next_value(&mut map)?; } "SubnetId" => { subnet_id = ::serde::de::MapAccess::next_value(&mut map)?; @@ -3157,15 +3442,60 @@ impl<'de> ::serde::Deserialize<'de> for NatGatewayProperties { "Tags" => { tags = ::serde::de::MapAccess::next_value(&mut map)?; } + "Tenancy" => { + tenancy = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UserData" => { + user_data = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Volumes" => { + volumes = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } - Ok(NatGatewayProperties { - allocation_id: allocation_id, - connectivity_type: connectivity_type, - subnet_id: subnet_id.ok_or(::serde::de::Error::missing_field("SubnetId"))?, + Ok(InstanceProperties { + additional_info: additional_info, + affinity: affinity, + availability_zone: availability_zone, + block_device_mappings: block_device_mappings, + cpu_options: cpu_options, + credit_specification: credit_specification, + disable_api_termination: disable_api_termination, + ebs_optimized: ebs_optimized, + elastic_gpu_specifications: elastic_gpu_specifications, + elastic_inference_accelerators: elastic_inference_accelerators, + enclave_options: enclave_options, + hibernation_options: hibernation_options, + host_id: host_id, + host_resource_group_arn: host_resource_group_arn, + iam_instance_profile: iam_instance_profile, + image_id: image_id, + instance_initiated_shutdown_behavior: instance_initiated_shutdown_behavior, + instance_type: instance_type, + ipv6_address_count: ipv6_address_count, + ipv6_addresses: ipv6_addresses, + kernel_id: kernel_id, + key_name: key_name, + launch_template: launch_template, + license_specifications: license_specifications, + monitoring: monitoring, + network_interfaces: network_interfaces, + placement_group_name: placement_group_name, + private_dns_name_options: private_dns_name_options, + private_ip_address: private_ip_address, + propagate_tags_to_volume_on_creation: propagate_tags_to_volume_on_creation, + ramdisk_id: ramdisk_id, + security_group_ids: security_group_ids, + security_groups: security_groups, + source_dest_check: source_dest_check, + ssm_associations: ssm_associations, + subnet_id: subnet_id, tags: tags, + tenancy: tenancy, + user_data: user_data, + volumes: volumes, }) } } @@ -3174,87 +3504,76 @@ impl<'de> ::serde::Deserialize<'de> for NatGatewayProperties { } } -impl ::Resource for NatGateway { - type Properties = NatGatewayProperties; - const TYPE: &'static str = "AWS::EC2::NatGateway"; - fn properties(&self) -> &NatGatewayProperties { +impl ::Resource for Instance { + type Properties = InstanceProperties; + const TYPE: &'static str = "AWS::EC2::Instance"; + fn properties(&self) -> &InstanceProperties { &self.properties } - fn properties_mut(&mut self) -> &mut NatGatewayProperties { + fn properties_mut(&mut self) -> &mut InstanceProperties { &mut self.properties } } -impl ::private::Sealed for NatGateway {} +impl ::private::Sealed for Instance {} -impl From for NatGateway { - fn from(properties: NatGatewayProperties) -> NatGateway { - NatGateway { properties } +impl From for Instance { + fn from(properties: InstanceProperties) -> Instance { + Instance { properties } } } -/// The [`AWS::EC2::NetworkAcl`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl.html) resource type. +/// The [`AWS::EC2::InternetGateway`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-internetgateway.html) resource type. #[derive(Debug, Default)] -pub struct NetworkAcl { - properties: NetworkAclProperties +pub struct InternetGateway { + properties: InternetGatewayProperties } -/// Properties for the `NetworkAcl` resource. +/// Properties for the `InternetGateway` resource. #[derive(Debug, Default)] -pub struct NetworkAclProperties { - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl.html#cfn-ec2-networkacl-tags). +pub struct InternetGatewayProperties { + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-internetgateway.html#cfn-ec2-internetgateway-tags). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub tags: Option<::ValueList<::Tag>>, - /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl.html#cfn-ec2-networkacl-vpcid). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub vpc_id: ::Value, } -impl ::serde::Serialize for NetworkAclProperties { +impl ::serde::Serialize for InternetGatewayProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", &self.vpc_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for NetworkAclProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for InternetGatewayProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = NetworkAclProperties; + type Value = InternetGatewayProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type NetworkAclProperties") + write!(f, "a struct of type InternetGatewayProperties") } fn visit_map>(self, mut map: A) -> Result { let mut tags: Option<::ValueList<::Tag>> = None; - let mut vpc_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { "Tags" => { tags = ::serde::de::MapAccess::next_value(&mut map)?; } - "VpcId" => { - vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; - } _ => {} } } - Ok(NetworkAclProperties { + Ok(InternetGatewayProperties { tags: tags, - vpc_id: vpc_id.ok_or(::serde::de::Error::missing_field("VpcId"))?, }) } } @@ -3263,172 +3582,102 @@ impl<'de> ::serde::Deserialize<'de> for NetworkAclProperties { } } -impl ::Resource for NetworkAcl { - type Properties = NetworkAclProperties; - const TYPE: &'static str = "AWS::EC2::NetworkAcl"; - fn properties(&self) -> &NetworkAclProperties { +impl ::Resource for InternetGateway { + type Properties = InternetGatewayProperties; + const TYPE: &'static str = "AWS::EC2::InternetGateway"; + fn properties(&self) -> &InternetGatewayProperties { &self.properties } - fn properties_mut(&mut self) -> &mut NetworkAclProperties { + fn properties_mut(&mut self) -> &mut InternetGatewayProperties { &mut self.properties } } -impl ::private::Sealed for NetworkAcl {} +impl ::private::Sealed for InternetGateway {} -impl From for NetworkAcl { - fn from(properties: NetworkAclProperties) -> NetworkAcl { - NetworkAcl { properties } +impl From for InternetGateway { + fn from(properties: InternetGatewayProperties) -> InternetGateway { + InternetGateway { properties } } } -/// The [`AWS::EC2::NetworkAclEntry`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl-entry.html) resource type. +/// The [`AWS::EC2::LaunchTemplate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html) resource type. #[derive(Debug, Default)] -pub struct NetworkAclEntry { - properties: NetworkAclEntryProperties +pub struct LaunchTemplate { + properties: LaunchTemplateProperties } -/// Properties for the `NetworkAclEntry` resource. +/// Properties for the `LaunchTemplate` resource. #[derive(Debug, Default)] -pub struct NetworkAclEntryProperties { - /// Property [`CidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl-entry.html#cfn-ec2-networkaclentry-cidrblock). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub cidr_block: Option<::Value>, - /// Property [`Egress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl-entry.html#cfn-ec2-networkaclentry-egress). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub egress: Option<::Value>, - /// Property [`Icmp`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl-entry.html#cfn-ec2-networkaclentry-icmp). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub icmp: Option<::Value>, - /// Property [`Ipv6CidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl-entry.html#cfn-ec2-networkaclentry-ipv6cidrblock). +pub struct LaunchTemplateProperties { + /// Property [`LaunchTemplateData`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html#cfn-ec2-launchtemplate-launchtemplatedata). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub ipv6_cidr_block: Option<::Value>, - /// Property [`NetworkAclId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl-entry.html#cfn-ec2-networkaclentry-networkaclid). + pub launch_template_data: Option<::Value>, + /// Property [`LaunchTemplateName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html#cfn-ec2-launchtemplate-launchtemplatename). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub network_acl_id: ::Value, - /// Property [`PortRange`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl-entry.html#cfn-ec2-networkaclentry-portrange). + pub launch_template_name: Option<::Value>, + /// Property [`TagSpecifications`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-launchtemplate.html#cfn-ec2-launchtemplate-tagspecifications). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub port_range: Option<::Value>, - /// Property [`Protocol`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl-entry.html#cfn-ec2-networkaclentry-protocol). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub protocol: ::Value, - /// Property [`RuleAction`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl-entry.html#cfn-ec2-networkaclentry-ruleaction). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub rule_action: ::Value, - /// Property [`RuleNumber`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-acl-entry.html#cfn-ec2-networkaclentry-rulenumber). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub rule_number: ::Value, + pub tag_specifications: Option<::ValueList>, } -impl ::serde::Serialize for NetworkAclEntryProperties { +impl ::serde::Serialize for LaunchTemplateProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref cidr_block) = self.cidr_block { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CidrBlock", cidr_block)?; - } - if let Some(ref egress) = self.egress { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Egress", egress)?; - } - if let Some(ref icmp) = self.icmp { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Icmp", icmp)?; + if let Some(ref launch_template_data) = self.launch_template_data { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplateData", launch_template_data)?; } - if let Some(ref ipv6_cidr_block) = self.ipv6_cidr_block { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6CidrBlock", ipv6_cidr_block)?; + if let Some(ref launch_template_name) = self.launch_template_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplateName", launch_template_name)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkAclId", &self.network_acl_id)?; - if let Some(ref port_range) = self.port_range { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PortRange", port_range)?; + if let Some(ref tag_specifications) = self.tag_specifications { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TagSpecifications", tag_specifications)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Protocol", &self.protocol)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "RuleAction", &self.rule_action)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "RuleNumber", &self.rule_number)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for NetworkAclEntryProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for LaunchTemplateProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = NetworkAclEntryProperties; + type Value = LaunchTemplateProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type NetworkAclEntryProperties") + write!(f, "a struct of type LaunchTemplateProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut cidr_block: Option<::Value> = None; - let mut egress: Option<::Value> = None; - let mut icmp: Option<::Value> = None; - let mut ipv6_cidr_block: Option<::Value> = None; - let mut network_acl_id: Option<::Value> = None; - let mut port_range: Option<::Value> = None; - let mut protocol: Option<::Value> = None; - let mut rule_action: Option<::Value> = None; - let mut rule_number: Option<::Value> = None; + let mut launch_template_data: Option<::Value> = None; + let mut launch_template_name: Option<::Value> = None; + let mut tag_specifications: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "CidrBlock" => { - cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Egress" => { - egress = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Icmp" => { - icmp = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Ipv6CidrBlock" => { - ipv6_cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; - } - "NetworkAclId" => { - network_acl_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "PortRange" => { - port_range = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Protocol" => { - protocol = ::serde::de::MapAccess::next_value(&mut map)?; + "LaunchTemplateData" => { + launch_template_data = ::serde::de::MapAccess::next_value(&mut map)?; } - "RuleAction" => { - rule_action = ::serde::de::MapAccess::next_value(&mut map)?; + "LaunchTemplateName" => { + launch_template_name = ::serde::de::MapAccess::next_value(&mut map)?; } - "RuleNumber" => { - rule_number = ::serde::de::MapAccess::next_value(&mut map)?; + "TagSpecifications" => { + tag_specifications = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(NetworkAclEntryProperties { - cidr_block: cidr_block, - egress: egress, - icmp: icmp, - ipv6_cidr_block: ipv6_cidr_block, - network_acl_id: network_acl_id.ok_or(::serde::de::Error::missing_field("NetworkAclId"))?, - port_range: port_range, - protocol: protocol.ok_or(::serde::de::Error::missing_field("Protocol"))?, - rule_action: rule_action.ok_or(::serde::de::Error::missing_field("RuleAction"))?, - rule_number: rule_number.ok_or(::serde::de::Error::missing_field("RuleNumber"))?, + Ok(LaunchTemplateProperties { + launch_template_data: launch_template_data, + launch_template_name: launch_template_name, + tag_specifications: tag_specifications, }) } } @@ -3437,100 +3686,96 @@ impl<'de> ::serde::Deserialize<'de> for NetworkAclEntryProperties { } } -impl ::Resource for NetworkAclEntry { - type Properties = NetworkAclEntryProperties; - const TYPE: &'static str = "AWS::EC2::NetworkAclEntry"; - fn properties(&self) -> &NetworkAclEntryProperties { +impl ::Resource for LaunchTemplate { + type Properties = LaunchTemplateProperties; + const TYPE: &'static str = "AWS::EC2::LaunchTemplate"; + fn properties(&self) -> &LaunchTemplateProperties { &self.properties } - fn properties_mut(&mut self) -> &mut NetworkAclEntryProperties { + fn properties_mut(&mut self) -> &mut LaunchTemplateProperties { &mut self.properties } } -impl ::private::Sealed for NetworkAclEntry {} +impl ::private::Sealed for LaunchTemplate {} -impl From for NetworkAclEntry { - fn from(properties: NetworkAclEntryProperties) -> NetworkAclEntry { - NetworkAclEntry { properties } +impl From for LaunchTemplate { + fn from(properties: LaunchTemplateProperties) -> LaunchTemplate { + LaunchTemplate { properties } } } -/// The [`AWS::EC2::NetworkInsightsAnalysis`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsanalysis.html) resource type. +/// The [`AWS::EC2::LocalGatewayRoute`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroute.html) resource type. #[derive(Debug, Default)] -pub struct NetworkInsightsAnalysis { - properties: NetworkInsightsAnalysisProperties +pub struct LocalGatewayRoute { + properties: LocalGatewayRouteProperties } -/// Properties for the `NetworkInsightsAnalysis` resource. +/// Properties for the `LocalGatewayRoute` resource. #[derive(Debug, Default)] -pub struct NetworkInsightsAnalysisProperties { - /// Property [`FilterInArns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsanalysis.html#cfn-ec2-networkinsightsanalysis-filterinarns). +pub struct LocalGatewayRouteProperties { + /// Property [`DestinationCidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroute.html#cfn-ec2-localgatewayroute-destinationcidrblock). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub filter_in_arns: Option<::ValueList>, - /// Property [`NetworkInsightsPathId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsanalysis.html#cfn-ec2-networkinsightsanalysis-networkinsightspathid). + pub destination_cidr_block: ::Value, + /// Property [`LocalGatewayRouteTableId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroute.html#cfn-ec2-localgatewayroute-localgatewayroutetableid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub network_insights_path_id: ::Value, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsanalysis.html#cfn-ec2-networkinsightsanalysis-tags). + pub local_gateway_route_table_id: ::Value, + /// Property [`LocalGatewayVirtualInterfaceGroupId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroute.html#cfn-ec2-localgatewayroute-localgatewayvirtualinterfacegroupid). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub tags: Option<::ValueList<::Tag>>, + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub local_gateway_virtual_interface_group_id: ::Value, } -impl ::serde::Serialize for NetworkInsightsAnalysisProperties { +impl ::serde::Serialize for LocalGatewayRouteProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref filter_in_arns) = self.filter_in_arns { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "FilterInArns", filter_in_arns)?; - } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInsightsPathId", &self.network_insights_path_id)?; - if let Some(ref tags) = self.tags { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationCidrBlock", &self.destination_cidr_block)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LocalGatewayRouteTableId", &self.local_gateway_route_table_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LocalGatewayVirtualInterfaceGroupId", &self.local_gateway_virtual_interface_group_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for NetworkInsightsAnalysisProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for LocalGatewayRouteProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = NetworkInsightsAnalysisProperties; + type Value = LocalGatewayRouteProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type NetworkInsightsAnalysisProperties") + write!(f, "a struct of type LocalGatewayRouteProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut filter_in_arns: Option<::ValueList> = None; - let mut network_insights_path_id: Option<::Value> = None; - let mut tags: Option<::ValueList<::Tag>> = None; + let mut destination_cidr_block: Option<::Value> = None; + let mut local_gateway_route_table_id: Option<::Value> = None; + let mut local_gateway_virtual_interface_group_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "FilterInArns" => { - filter_in_arns = ::serde::de::MapAccess::next_value(&mut map)?; + "DestinationCidrBlock" => { + destination_cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; } - "NetworkInsightsPathId" => { - network_insights_path_id = ::serde::de::MapAccess::next_value(&mut map)?; + "LocalGatewayRouteTableId" => { + local_gateway_route_table_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "Tags" => { - tags = ::serde::de::MapAccess::next_value(&mut map)?; + "LocalGatewayVirtualInterfaceGroupId" => { + local_gateway_virtual_interface_group_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(NetworkInsightsAnalysisProperties { - filter_in_arns: filter_in_arns, - network_insights_path_id: network_insights_path_id.ok_or(::serde::de::Error::missing_field("NetworkInsightsPathId"))?, - tags: tags, + Ok(LocalGatewayRouteProperties { + destination_cidr_block: destination_cidr_block.ok_or(::serde::de::Error::missing_field("DestinationCidrBlock"))?, + local_gateway_route_table_id: local_gateway_route_table_id.ok_or(::serde::de::Error::missing_field("LocalGatewayRouteTableId"))?, + local_gateway_virtual_interface_group_id: local_gateway_virtual_interface_group_id.ok_or(::serde::de::Error::missing_field("LocalGatewayVirtualInterfaceGroupId"))?, }) } } @@ -3539,148 +3784,98 @@ impl<'de> ::serde::Deserialize<'de> for NetworkInsightsAnalysisProperties { } } -impl ::Resource for NetworkInsightsAnalysis { - type Properties = NetworkInsightsAnalysisProperties; - const TYPE: &'static str = "AWS::EC2::NetworkInsightsAnalysis"; - fn properties(&self) -> &NetworkInsightsAnalysisProperties { +impl ::Resource for LocalGatewayRoute { + type Properties = LocalGatewayRouteProperties; + const TYPE: &'static str = "AWS::EC2::LocalGatewayRoute"; + fn properties(&self) -> &LocalGatewayRouteProperties { &self.properties } - fn properties_mut(&mut self) -> &mut NetworkInsightsAnalysisProperties { + fn properties_mut(&mut self) -> &mut LocalGatewayRouteProperties { &mut self.properties } } -impl ::private::Sealed for NetworkInsightsAnalysis {} +impl ::private::Sealed for LocalGatewayRoute {} -impl From for NetworkInsightsAnalysis { - fn from(properties: NetworkInsightsAnalysisProperties) -> NetworkInsightsAnalysis { - NetworkInsightsAnalysis { properties } +impl From for LocalGatewayRoute { + fn from(properties: LocalGatewayRouteProperties) -> LocalGatewayRoute { + LocalGatewayRoute { properties } } } -/// The [`AWS::EC2::NetworkInsightsPath`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html) resource type. +/// The [`AWS::EC2::LocalGatewayRouteTableVPCAssociation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroutetablevpcassociation.html) resource type. #[derive(Debug, Default)] -pub struct NetworkInsightsPath { - properties: NetworkInsightsPathProperties +pub struct LocalGatewayRouteTableVPCAssociation { + properties: LocalGatewayRouteTableVPCAssociationProperties } -/// Properties for the `NetworkInsightsPath` resource. +/// Properties for the `LocalGatewayRouteTableVPCAssociation` resource. #[derive(Debug, Default)] -pub struct NetworkInsightsPathProperties { - /// Property [`Destination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html#cfn-ec2-networkinsightspath-destination). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub destination: ::Value, - /// Property [`DestinationIp`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html#cfn-ec2-networkinsightspath-destinationip). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub destination_ip: Option<::Value>, - /// Property [`DestinationPort`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html#cfn-ec2-networkinsightspath-destinationport). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub destination_port: Option<::Value>, - /// Property [`Protocol`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html#cfn-ec2-networkinsightspath-protocol). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub protocol: ::Value, - /// Property [`Source`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html#cfn-ec2-networkinsightspath-source). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub source: ::Value, - /// Property [`SourceIp`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html#cfn-ec2-networkinsightspath-sourceip). +pub struct LocalGatewayRouteTableVPCAssociationProperties { + /// Property [`LocalGatewayRouteTableId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroutetablevpcassociation.html#cfn-ec2-localgatewayroutetablevpcassociation-localgatewayroutetableid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub source_ip: Option<::Value>, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html#cfn-ec2-networkinsightspath-tags). + pub local_gateway_route_table_id: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroutetablevpcassociation.html#cfn-ec2-localgatewayroutetablevpcassociation-tags). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub tags: Option<::ValueList<::Tag>>, + /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-localgatewayroutetablevpcassociation.html#cfn-ec2-localgatewayroutetablevpcassociation-vpcid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub vpc_id: ::Value, } -impl ::serde::Serialize for NetworkInsightsPathProperties { +impl ::serde::Serialize for LocalGatewayRouteTableVPCAssociationProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Destination", &self.destination)?; - if let Some(ref destination_ip) = self.destination_ip { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationIp", destination_ip)?; - } - if let Some(ref destination_port) = self.destination_port { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationPort", destination_port)?; - } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Protocol", &self.protocol)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Source", &self.source)?; - if let Some(ref source_ip) = self.source_ip { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourceIp", source_ip)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LocalGatewayRouteTableId", &self.local_gateway_route_table_id)?; if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", &self.vpc_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for NetworkInsightsPathProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for LocalGatewayRouteTableVPCAssociationProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = NetworkInsightsPathProperties; + type Value = LocalGatewayRouteTableVPCAssociationProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type NetworkInsightsPathProperties") + write!(f, "a struct of type LocalGatewayRouteTableVPCAssociationProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut destination: Option<::Value> = None; - let mut destination_ip: Option<::Value> = None; - let mut destination_port: Option<::Value> = None; - let mut protocol: Option<::Value> = None; - let mut source: Option<::Value> = None; - let mut source_ip: Option<::Value> = None; + let mut local_gateway_route_table_id: Option<::Value> = None; let mut tags: Option<::ValueList<::Tag>> = None; + let mut vpc_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Destination" => { - destination = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DestinationIp" => { - destination_ip = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DestinationPort" => { - destination_port = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Protocol" => { - protocol = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Source" => { - source = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SourceIp" => { - source_ip = ::serde::de::MapAccess::next_value(&mut map)?; + "LocalGatewayRouteTableId" => { + local_gateway_route_table_id = ::serde::de::MapAccess::next_value(&mut map)?; } "Tags" => { tags = ::serde::de::MapAccess::next_value(&mut map)?; } + "VpcId" => { + vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } - Ok(NetworkInsightsPathProperties { - destination: destination.ok_or(::serde::de::Error::missing_field("Destination"))?, - destination_ip: destination_ip, - destination_port: destination_port, - protocol: protocol.ok_or(::serde::de::Error::missing_field("Protocol"))?, - source: source.ok_or(::serde::de::Error::missing_field("Source"))?, - source_ip: source_ip, + Ok(LocalGatewayRouteTableVPCAssociationProperties { + local_gateway_route_table_id: local_gateway_route_table_id.ok_or(::serde::de::Error::missing_field("LocalGatewayRouteTableId"))?, tags: tags, + vpc_id: vpc_id.ok_or(::serde::de::Error::missing_field("VpcId"))?, }) } } @@ -3689,121 +3884,64 @@ impl<'de> ::serde::Deserialize<'de> for NetworkInsightsPathProperties { } } -impl ::Resource for NetworkInsightsPath { - type Properties = NetworkInsightsPathProperties; - const TYPE: &'static str = "AWS::EC2::NetworkInsightsPath"; - fn properties(&self) -> &NetworkInsightsPathProperties { +impl ::Resource for LocalGatewayRouteTableVPCAssociation { + type Properties = LocalGatewayRouteTableVPCAssociationProperties; + const TYPE: &'static str = "AWS::EC2::LocalGatewayRouteTableVPCAssociation"; + fn properties(&self) -> &LocalGatewayRouteTableVPCAssociationProperties { &self.properties } - fn properties_mut(&mut self) -> &mut NetworkInsightsPathProperties { + fn properties_mut(&mut self) -> &mut LocalGatewayRouteTableVPCAssociationProperties { &mut self.properties } } -impl ::private::Sealed for NetworkInsightsPath {} +impl ::private::Sealed for LocalGatewayRouteTableVPCAssociation {} -impl From for NetworkInsightsPath { - fn from(properties: NetworkInsightsPathProperties) -> NetworkInsightsPath { - NetworkInsightsPath { properties } +impl From for LocalGatewayRouteTableVPCAssociation { + fn from(properties: LocalGatewayRouteTableVPCAssociationProperties) -> LocalGatewayRouteTableVPCAssociation { + LocalGatewayRouteTableVPCAssociation { properties } } } -/// The [`AWS::EC2::NetworkInterface`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface.html) resource type. +/// The [`AWS::EC2::NatGateway`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html) resource type. #[derive(Debug, Default)] -pub struct NetworkInterface { - properties: NetworkInterfaceProperties +pub struct NatGateway { + properties: NatGatewayProperties } -/// Properties for the `NetworkInterface` resource. +/// Properties for the `NatGateway` resource. #[derive(Debug, Default)] -pub struct NetworkInterfaceProperties { - /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface.html#cfn-awsec2networkinterface-description). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub description: Option<::Value>, - /// Property [`GroupSet`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface.html#cfn-awsec2networkinterface-groupset). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub group_set: Option<::ValueList>, - /// Property [`InterfaceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface.html#cfn-ec2-networkinterface-interfacetype). +pub struct NatGatewayProperties { + /// Property [`AllocationId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html#cfn-ec2-natgateway-allocationid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub interface_type: Option<::Value>, - /// Property [`Ipv6AddressCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface.html#cfn-ec2-networkinterface-ipv6addresscount). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub ipv6_address_count: Option<::Value>, - /// Property [`Ipv6Addresses`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface.html#cfn-ec2-networkinterface-ipv6addresses). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub ipv6_addresses: Option<::ValueList>, - /// Property [`PrivateIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface.html#cfn-awsec2networkinterface-privateipaddress). + pub allocation_id: Option<::Value>, + /// Property [`ConnectivityType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html#cfn-ec2-natgateway-connectivitytype). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub private_ip_address: Option<::Value>, - /// Property [`PrivateIpAddresses`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface.html#cfn-awsec2networkinterface-privateipaddresses). - /// - /// Update type: _Conditional_. - /// Conditional updates can be mutable or immutable, depending on, for example, which other properties you updated. - /// For more information, see the relevant resource type documentation. - pub private_ip_addresses: Option<::ValueList>, - /// Property [`SecondaryPrivateIpAddressCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface.html#cfn-awsec2networkinterface-secondaryprivateipcount). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub secondary_private_ip_address_count: Option<::Value>, - /// Property [`SourceDestCheck`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface.html#cfn-awsec2networkinterface-sourcedestcheck). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub source_dest_check: Option<::Value>, - /// Property [`SubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface.html#cfn-awsec2networkinterface-subnetid). + pub connectivity_type: Option<::Value>, + /// Property [`SubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html#cfn-ec2-natgateway-subnetid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub subnet_id: ::Value, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface.html#cfn-awsec2networkinterface-tags). + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-natgateway.html#cfn-ec2-natgateway-tags). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub tags: Option<::ValueList<::Tag>>, } -impl ::serde::Serialize for NetworkInterfaceProperties { +impl ::serde::Serialize for NatGatewayProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref description) = self.description { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; - } - if let Some(ref group_set) = self.group_set { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupSet", group_set)?; - } - if let Some(ref interface_type) = self.interface_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "InterfaceType", interface_type)?; - } - if let Some(ref ipv6_address_count) = self.ipv6_address_count { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6AddressCount", ipv6_address_count)?; - } - if let Some(ref ipv6_addresses) = self.ipv6_addresses { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6Addresses", ipv6_addresses)?; - } - if let Some(ref private_ip_address) = self.private_ip_address { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateIpAddress", private_ip_address)?; - } - if let Some(ref private_ip_addresses) = self.private_ip_addresses { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateIpAddresses", private_ip_addresses)?; - } - if let Some(ref secondary_private_ip_address_count) = self.secondary_private_ip_address_count { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecondaryPrivateIpAddressCount", secondary_private_ip_address_count)?; + if let Some(ref allocation_id) = self.allocation_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AllocationId", allocation_id)?; } - if let Some(ref source_dest_check) = self.source_dest_check { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourceDestCheck", source_dest_check)?; + if let Some(ref connectivity_type) = self.connectivity_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConnectivityType", connectivity_type)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetId", &self.subnet_id)?; if let Some(ref tags) = self.tags { @@ -3813,58 +3951,30 @@ impl ::serde::Serialize for NetworkInterfaceProperties { } } -impl<'de> ::serde::Deserialize<'de> for NetworkInterfaceProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for NatGatewayProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = NetworkInterfaceProperties; + type Value = NatGatewayProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type NetworkInterfaceProperties") + write!(f, "a struct of type NatGatewayProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut description: Option<::Value> = None; - let mut group_set: Option<::ValueList> = None; - let mut interface_type: Option<::Value> = None; - let mut ipv6_address_count: Option<::Value> = None; - let mut ipv6_addresses: Option<::ValueList> = None; - let mut private_ip_address: Option<::Value> = None; - let mut private_ip_addresses: Option<::ValueList> = None; - let mut secondary_private_ip_address_count: Option<::Value> = None; - let mut source_dest_check: Option<::Value> = None; + let mut allocation_id: Option<::Value> = None; + let mut connectivity_type: Option<::Value> = None; let mut subnet_id: Option<::Value> = None; let mut tags: Option<::ValueList<::Tag>> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Description" => { - description = ::serde::de::MapAccess::next_value(&mut map)?; - } - "GroupSet" => { - group_set = ::serde::de::MapAccess::next_value(&mut map)?; - } - "InterfaceType" => { - interface_type = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Ipv6AddressCount" => { - ipv6_address_count = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Ipv6Addresses" => { - ipv6_addresses = ::serde::de::MapAccess::next_value(&mut map)?; - } - "PrivateIpAddress" => { - private_ip_address = ::serde::de::MapAccess::next_value(&mut map)?; - } - "PrivateIpAddresses" => { - private_ip_addresses = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SecondaryPrivateIpAddressCount" => { - secondary_private_ip_address_count = ::serde::de::MapAccess::next_value(&mut map)?; + "AllocationId" => { + allocation_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "SourceDestCheck" => { - source_dest_check = ::serde::de::MapAccess::next_value(&mut map)?; + "ConnectivityType" => { + connectivity_type = ::serde::de::MapAccess::next_value(&mut map)?; } "SubnetId" => { subnet_id = ::serde::de::MapAccess::next_value(&mut map)?; @@ -3876,16 +3986,9 @@ impl<'de> ::serde::Deserialize<'de> for NetworkInterfaceProperties { } } - Ok(NetworkInterfaceProperties { - description: description, - group_set: group_set, - interface_type: interface_type, - ipv6_address_count: ipv6_address_count, - ipv6_addresses: ipv6_addresses, - private_ip_address: private_ip_address, - private_ip_addresses: private_ip_addresses, - secondary_private_ip_address_count: secondary_private_ip_address_count, - source_dest_check: source_dest_check, + Ok(NatGatewayProperties { + allocation_id: allocation_id, + connectivity_type: connectivity_type, subnet_id: subnet_id.ok_or(::serde::de::Error::missing_field("SubnetId"))?, tags: tags, }) @@ -3896,109 +3999,87 @@ impl<'de> ::serde::Deserialize<'de> for NetworkInterfaceProperties { } } -impl ::Resource for NetworkInterface { - type Properties = NetworkInterfaceProperties; - const TYPE: &'static str = "AWS::EC2::NetworkInterface"; - fn properties(&self) -> &NetworkInterfaceProperties { +impl ::Resource for NatGateway { + type Properties = NatGatewayProperties; + const TYPE: &'static str = "AWS::EC2::NatGateway"; + fn properties(&self) -> &NatGatewayProperties { &self.properties } - fn properties_mut(&mut self) -> &mut NetworkInterfaceProperties { + fn properties_mut(&mut self) -> &mut NatGatewayProperties { &mut self.properties } } -impl ::private::Sealed for NetworkInterface {} +impl ::private::Sealed for NatGateway {} -impl From for NetworkInterface { - fn from(properties: NetworkInterfaceProperties) -> NetworkInterface { - NetworkInterface { properties } +impl From for NatGateway { + fn from(properties: NatGatewayProperties) -> NatGateway { + NatGateway { properties } } } -/// The [`AWS::EC2::NetworkInterfaceAttachment`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface-attachment.html) resource type. +/// The [`AWS::EC2::NetworkAcl`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkacl.html) resource type. #[derive(Debug, Default)] -pub struct NetworkInterfaceAttachment { - properties: NetworkInterfaceAttachmentProperties +pub struct NetworkAcl { + properties: NetworkAclProperties } -/// Properties for the `NetworkInterfaceAttachment` resource. +/// Properties for the `NetworkAcl` resource. #[derive(Debug, Default)] -pub struct NetworkInterfaceAttachmentProperties { - /// Property [`DeleteOnTermination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface-attachment.html#cfn-ec2-network-interface-attachment-deleteonterm). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub delete_on_termination: Option<::Value>, - /// Property [`DeviceIndex`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface-attachment.html#cfn-ec2-network-interface-attachment-deviceindex). +pub struct NetworkAclProperties { + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkacl.html#cfn-ec2-networkacl-tags). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub device_index: ::Value, - /// Property [`InstanceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface-attachment.html#cfn-ec2-network-interface-attachment-instanceid). + pub tags: Option<::ValueList<::Tag>>, + /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkacl.html#cfn-ec2-networkacl-vpcid). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub instance_id: ::Value, - /// Property [`NetworkInterfaceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface-attachment.html#cfn-ec2-network-interface-attachment-networkinterfaceid). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub network_interface_id: ::Value, + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub vpc_id: ::Value, } -impl ::serde::Serialize for NetworkInterfaceAttachmentProperties { +impl ::serde::Serialize for NetworkAclProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref delete_on_termination) = self.delete_on_termination { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeleteOnTermination", delete_on_termination)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeviceIndex", &self.device_index)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceId", &self.instance_id)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaceId", &self.network_interface_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", &self.vpc_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for NetworkInterfaceAttachmentProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for NetworkAclProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = NetworkInterfaceAttachmentProperties; + type Value = NetworkAclProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type NetworkInterfaceAttachmentProperties") + write!(f, "a struct of type NetworkAclProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut delete_on_termination: Option<::Value> = None; - let mut device_index: Option<::Value> = None; - let mut instance_id: Option<::Value> = None; - let mut network_interface_id: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut vpc_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "DeleteOnTermination" => { - delete_on_termination = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DeviceIndex" => { - device_index = ::serde::de::MapAccess::next_value(&mut map)?; - } - "InstanceId" => { - instance_id = ::serde::de::MapAccess::next_value(&mut map)?; + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; } - "NetworkInterfaceId" => { - network_interface_id = ::serde::de::MapAccess::next_value(&mut map)?; + "VpcId" => { + vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(NetworkInterfaceAttachmentProperties { - delete_on_termination: delete_on_termination, - device_index: device_index.ok_or(::serde::de::Error::missing_field("DeviceIndex"))?, - instance_id: instance_id.ok_or(::serde::de::Error::missing_field("InstanceId"))?, - network_interface_id: network_interface_id.ok_or(::serde::de::Error::missing_field("NetworkInterfaceId"))?, + Ok(NetworkAclProperties { + tags: tags, + vpc_id: vpc_id.ok_or(::serde::de::Error::missing_field("VpcId"))?, }) } } @@ -4007,96 +4088,172 @@ impl<'de> ::serde::Deserialize<'de> for NetworkInterfaceAttachmentProperties { } } -impl ::Resource for NetworkInterfaceAttachment { - type Properties = NetworkInterfaceAttachmentProperties; - const TYPE: &'static str = "AWS::EC2::NetworkInterfaceAttachment"; - fn properties(&self) -> &NetworkInterfaceAttachmentProperties { +impl ::Resource for NetworkAcl { + type Properties = NetworkAclProperties; + const TYPE: &'static str = "AWS::EC2::NetworkAcl"; + fn properties(&self) -> &NetworkAclProperties { &self.properties } - fn properties_mut(&mut self) -> &mut NetworkInterfaceAttachmentProperties { + fn properties_mut(&mut self) -> &mut NetworkAclProperties { &mut self.properties } } -impl ::private::Sealed for NetworkInterfaceAttachment {} +impl ::private::Sealed for NetworkAcl {} -impl From for NetworkInterfaceAttachment { - fn from(properties: NetworkInterfaceAttachmentProperties) -> NetworkInterfaceAttachment { - NetworkInterfaceAttachment { properties } +impl From for NetworkAcl { + fn from(properties: NetworkAclProperties) -> NetworkAcl { + NetworkAcl { properties } } } -/// The [`AWS::EC2::NetworkInterfacePermission`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterfacepermission.html) resource type. +/// The [`AWS::EC2::NetworkAclEntry`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkaclentry.html) resource type. #[derive(Debug, Default)] -pub struct NetworkInterfacePermission { - properties: NetworkInterfacePermissionProperties +pub struct NetworkAclEntry { + properties: NetworkAclEntryProperties } -/// Properties for the `NetworkInterfacePermission` resource. +/// Properties for the `NetworkAclEntry` resource. #[derive(Debug, Default)] -pub struct NetworkInterfacePermissionProperties { - /// Property [`AwsAccountId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterfacepermission.html#cfn-ec2-networkinterfacepermission-awsaccountid). +pub struct NetworkAclEntryProperties { + /// Property [`CidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkaclentry.html#cfn-ec2-networkaclentry-cidrblock). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub cidr_block: Option<::Value>, + /// Property [`Egress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkaclentry.html#cfn-ec2-networkaclentry-egress). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub aws_account_id: ::Value, - /// Property [`NetworkInterfaceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterfacepermission.html#cfn-ec2-networkinterfacepermission-networkinterfaceid). + pub egress: Option<::Value>, + /// Property [`Icmp`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkaclentry.html#cfn-ec2-networkaclentry-icmp). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub icmp: Option<::Value>, + /// Property [`Ipv6CidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkaclentry.html#cfn-ec2-networkaclentry-ipv6cidrblock). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ipv6_cidr_block: Option<::Value>, + /// Property [`NetworkAclId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkaclentry.html#cfn-ec2-networkaclentry-networkaclid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub network_interface_id: ::Value, - /// Property [`Permission`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterfacepermission.html#cfn-ec2-networkinterfacepermission-permission). + pub network_acl_id: ::Value, + /// Property [`PortRange`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkaclentry.html#cfn-ec2-networkaclentry-portrange). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub port_range: Option<::Value>, + /// Property [`Protocol`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkaclentry.html#cfn-ec2-networkaclentry-protocol). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub protocol: ::Value, + /// Property [`RuleAction`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkaclentry.html#cfn-ec2-networkaclentry-ruleaction). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub rule_action: ::Value, + /// Property [`RuleNumber`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkaclentry.html#cfn-ec2-networkaclentry-rulenumber). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub permission: ::Value, + pub rule_number: ::Value, } -impl ::serde::Serialize for NetworkInterfacePermissionProperties { +impl ::serde::Serialize for NetworkAclEntryProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AwsAccountId", &self.aws_account_id)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaceId", &self.network_interface_id)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Permission", &self.permission)?; + if let Some(ref cidr_block) = self.cidr_block { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CidrBlock", cidr_block)?; + } + if let Some(ref egress) = self.egress { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Egress", egress)?; + } + if let Some(ref icmp) = self.icmp { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Icmp", icmp)?; + } + if let Some(ref ipv6_cidr_block) = self.ipv6_cidr_block { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6CidrBlock", ipv6_cidr_block)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkAclId", &self.network_acl_id)?; + if let Some(ref port_range) = self.port_range { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PortRange", port_range)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Protocol", &self.protocol)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RuleAction", &self.rule_action)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RuleNumber", &self.rule_number)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for NetworkInterfacePermissionProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for NetworkAclEntryProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = NetworkInterfacePermissionProperties; + type Value = NetworkAclEntryProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type NetworkInterfacePermissionProperties") + write!(f, "a struct of type NetworkAclEntryProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut aws_account_id: Option<::Value> = None; - let mut network_interface_id: Option<::Value> = None; - let mut permission: Option<::Value> = None; + let mut cidr_block: Option<::Value> = None; + let mut egress: Option<::Value> = None; + let mut icmp: Option<::Value> = None; + let mut ipv6_cidr_block: Option<::Value> = None; + let mut network_acl_id: Option<::Value> = None; + let mut port_range: Option<::Value> = None; + let mut protocol: Option<::Value> = None; + let mut rule_action: Option<::Value> = None; + let mut rule_number: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "AwsAccountId" => { - aws_account_id = ::serde::de::MapAccess::next_value(&mut map)?; + "CidrBlock" => { + cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; } - "NetworkInterfaceId" => { - network_interface_id = ::serde::de::MapAccess::next_value(&mut map)?; + "Egress" => { + egress = ::serde::de::MapAccess::next_value(&mut map)?; } - "Permission" => { - permission = ::serde::de::MapAccess::next_value(&mut map)?; + "Icmp" => { + icmp = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Ipv6CidrBlock" => { + ipv6_cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NetworkAclId" => { + network_acl_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PortRange" => { + port_range = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Protocol" => { + protocol = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RuleAction" => { + rule_action = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RuleNumber" => { + rule_number = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(NetworkInterfacePermissionProperties { - aws_account_id: aws_account_id.ok_or(::serde::de::Error::missing_field("AwsAccountId"))?, - network_interface_id: network_interface_id.ok_or(::serde::de::Error::missing_field("NetworkInterfaceId"))?, - permission: permission.ok_or(::serde::de::Error::missing_field("Permission"))?, + Ok(NetworkAclEntryProperties { + cidr_block: cidr_block, + egress: egress, + icmp: icmp, + ipv6_cidr_block: ipv6_cidr_block, + network_acl_id: network_acl_id.ok_or(::serde::de::Error::missing_field("NetworkAclId"))?, + port_range: port_range, + protocol: protocol.ok_or(::serde::de::Error::missing_field("Protocol"))?, + rule_action: rule_action.ok_or(::serde::de::Error::missing_field("RuleAction"))?, + rule_number: rule_number.ok_or(::serde::de::Error::missing_field("RuleNumber"))?, }) } } @@ -4105,76 +4262,102 @@ impl<'de> ::serde::Deserialize<'de> for NetworkInterfacePermissionProperties { } } -impl ::Resource for NetworkInterfacePermission { - type Properties = NetworkInterfacePermissionProperties; - const TYPE: &'static str = "AWS::EC2::NetworkInterfacePermission"; - fn properties(&self) -> &NetworkInterfacePermissionProperties { +impl ::Resource for NetworkAclEntry { + type Properties = NetworkAclEntryProperties; + const TYPE: &'static str = "AWS::EC2::NetworkAclEntry"; + fn properties(&self) -> &NetworkAclEntryProperties { &self.properties } - fn properties_mut(&mut self) -> &mut NetworkInterfacePermissionProperties { + fn properties_mut(&mut self) -> &mut NetworkAclEntryProperties { &mut self.properties } } -impl ::private::Sealed for NetworkInterfacePermission {} +impl ::private::Sealed for NetworkAclEntry {} -impl From for NetworkInterfacePermission { - fn from(properties: NetworkInterfacePermissionProperties) -> NetworkInterfacePermission { - NetworkInterfacePermission { properties } +impl From for NetworkAclEntry { + fn from(properties: NetworkAclEntryProperties) -> NetworkAclEntry { + NetworkAclEntry { properties } } } -/// The [`AWS::EC2::PlacementGroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-placementgroup.html) resource type. +/// The [`AWS::EC2::NetworkInsightsAccessScope`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsaccessscope.html) resource type. #[derive(Debug, Default)] -pub struct PlacementGroup { - properties: PlacementGroupProperties +pub struct NetworkInsightsAccessScope { + properties: NetworkInsightsAccessScopeProperties } -/// Properties for the `PlacementGroup` resource. +/// Properties for the `NetworkInsightsAccessScope` resource. #[derive(Debug, Default)] -pub struct PlacementGroupProperties { - /// Property [`Strategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-placementgroup.html#cfn-ec2-placementgroup-strategy). +pub struct NetworkInsightsAccessScopeProperties { + /// Property [`ExcludePaths`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsaccessscope.html#cfn-ec2-networkinsightsaccessscope-excludepaths). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub strategy: Option<::Value>, + pub exclude_paths: Option<::ValueList>, + /// Property [`MatchPaths`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsaccessscope.html#cfn-ec2-networkinsightsaccessscope-matchpaths). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub match_paths: Option<::ValueList>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsaccessscope.html#cfn-ec2-networkinsightsaccessscope-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, } -impl ::serde::Serialize for PlacementGroupProperties { +impl ::serde::Serialize for NetworkInsightsAccessScopeProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref strategy) = self.strategy { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Strategy", strategy)?; + if let Some(ref exclude_paths) = self.exclude_paths { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExcludePaths", exclude_paths)?; + } + if let Some(ref match_paths) = self.match_paths { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MatchPaths", match_paths)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for PlacementGroupProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for NetworkInsightsAccessScopeProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = PlacementGroupProperties; + type Value = NetworkInsightsAccessScopeProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type PlacementGroupProperties") + write!(f, "a struct of type NetworkInsightsAccessScopeProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut strategy: Option<::Value> = None; + let mut exclude_paths: Option<::ValueList> = None; + let mut match_paths: Option<::ValueList> = None; + let mut tags: Option<::ValueList<::Tag>> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Strategy" => { - strategy = ::serde::de::MapAccess::next_value(&mut map)?; + "ExcludePaths" => { + exclude_paths = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MatchPaths" => { + match_paths = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(PlacementGroupProperties { - strategy: strategy, + Ok(NetworkInsightsAccessScopeProperties { + exclude_paths: exclude_paths, + match_paths: match_paths, + tags: tags, }) } } @@ -4183,70 +4366,50 @@ impl<'de> ::serde::Deserialize<'de> for PlacementGroupProperties { } } -impl ::Resource for PlacementGroup { - type Properties = PlacementGroupProperties; - const TYPE: &'static str = "AWS::EC2::PlacementGroup"; - fn properties(&self) -> &PlacementGroupProperties { +impl ::Resource for NetworkInsightsAccessScope { + type Properties = NetworkInsightsAccessScopeProperties; + const TYPE: &'static str = "AWS::EC2::NetworkInsightsAccessScope"; + fn properties(&self) -> &NetworkInsightsAccessScopeProperties { &self.properties } - fn properties_mut(&mut self) -> &mut PlacementGroupProperties { + fn properties_mut(&mut self) -> &mut NetworkInsightsAccessScopeProperties { &mut self.properties } } -impl ::private::Sealed for PlacementGroup {} +impl ::private::Sealed for NetworkInsightsAccessScope {} -impl From for PlacementGroup { - fn from(properties: PlacementGroupProperties) -> PlacementGroup { - PlacementGroup { properties } +impl From for NetworkInsightsAccessScope { + fn from(properties: NetworkInsightsAccessScopeProperties) -> NetworkInsightsAccessScope { + NetworkInsightsAccessScope { properties } } } -/// The [`AWS::EC2::PrefixList`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-prefixlist.html) resource type. +/// The [`AWS::EC2::NetworkInsightsAccessScopeAnalysis`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsaccessscopeanalysis.html) resource type. #[derive(Debug, Default)] -pub struct PrefixList { - properties: PrefixListProperties +pub struct NetworkInsightsAccessScopeAnalysis { + properties: NetworkInsightsAccessScopeAnalysisProperties } -/// Properties for the `PrefixList` resource. +/// Properties for the `NetworkInsightsAccessScopeAnalysis` resource. #[derive(Debug, Default)] -pub struct PrefixListProperties { - /// Property [`AddressFamily`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-prefixlist.html#cfn-ec2-prefixlist-addressfamily). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub address_family: ::Value, - /// Property [`Entries`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-prefixlist.html#cfn-ec2-prefixlist-entries). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub entries: Option<::ValueList>, - /// Property [`MaxEntries`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-prefixlist.html#cfn-ec2-prefixlist-maxentries). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub max_entries: ::Value, - /// Property [`PrefixListName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-prefixlist.html#cfn-ec2-prefixlist-prefixlistname). +pub struct NetworkInsightsAccessScopeAnalysisProperties { + /// Property [`NetworkInsightsAccessScopeId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsaccessscopeanalysis.html#cfn-ec2-networkinsightsaccessscopeanalysis-networkinsightsaccessscopeid). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub prefix_list_name: ::Value, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-prefixlist.html#cfn-ec2-prefixlist-tags). + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub network_insights_access_scope_id: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsaccessscopeanalysis.html#cfn-ec2-networkinsightsaccessscopeanalysis-tags). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub tags: Option<::ValueList<::Tag>>, } -impl ::serde::Serialize for PrefixListProperties { +impl ::serde::Serialize for NetworkInsightsAccessScopeAnalysisProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AddressFamily", &self.address_family)?; - if let Some(ref entries) = self.entries { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Entries", entries)?; - } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxEntries", &self.max_entries)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrefixListName", &self.prefix_list_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInsightsAccessScopeId", &self.network_insights_access_scope_id)?; if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } @@ -4254,37 +4417,25 @@ impl ::serde::Serialize for PrefixListProperties { } } -impl<'de> ::serde::Deserialize<'de> for PrefixListProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for NetworkInsightsAccessScopeAnalysisProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = PrefixListProperties; + type Value = NetworkInsightsAccessScopeAnalysisProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type PrefixListProperties") + write!(f, "a struct of type NetworkInsightsAccessScopeAnalysisProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut address_family: Option<::Value> = None; - let mut entries: Option<::ValueList> = None; - let mut max_entries: Option<::Value> = None; - let mut prefix_list_name: Option<::Value> = None; + let mut network_insights_access_scope_id: Option<::Value> = None; let mut tags: Option<::ValueList<::Tag>> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "AddressFamily" => { - address_family = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Entries" => { - entries = ::serde::de::MapAccess::next_value(&mut map)?; - } - "MaxEntries" => { - max_entries = ::serde::de::MapAccess::next_value(&mut map)?; - } - "PrefixListName" => { - prefix_list_name = ::serde::de::MapAccess::next_value(&mut map)?; + "NetworkInsightsAccessScopeId" => { + network_insights_access_scope_id = ::serde::de::MapAccess::next_value(&mut map)?; } "Tags" => { tags = ::serde::de::MapAccess::next_value(&mut map)?; @@ -4293,11 +4444,8 @@ impl<'de> ::serde::Deserialize<'de> for PrefixListProperties { } } - Ok(PrefixListProperties { - address_family: address_family.ok_or(::serde::de::Error::missing_field("AddressFamily"))?, - entries: entries, - max_entries: max_entries.ok_or(::serde::de::Error::missing_field("MaxEntries"))?, - prefix_list_name: prefix_list_name.ok_or(::serde::de::Error::missing_field("PrefixListName"))?, + Ok(NetworkInsightsAccessScopeAnalysisProperties { + network_insights_access_scope_id: network_insights_access_scope_id.ok_or(::serde::de::Error::missing_field("NetworkInsightsAccessScopeId"))?, tags: tags, }) } @@ -4307,230 +4455,100 @@ impl<'de> ::serde::Deserialize<'de> for PrefixListProperties { } } -impl ::Resource for PrefixList { - type Properties = PrefixListProperties; - const TYPE: &'static str = "AWS::EC2::PrefixList"; - fn properties(&self) -> &PrefixListProperties { +impl ::Resource for NetworkInsightsAccessScopeAnalysis { + type Properties = NetworkInsightsAccessScopeAnalysisProperties; + const TYPE: &'static str = "AWS::EC2::NetworkInsightsAccessScopeAnalysis"; + fn properties(&self) -> &NetworkInsightsAccessScopeAnalysisProperties { &self.properties } - fn properties_mut(&mut self) -> &mut PrefixListProperties { + fn properties_mut(&mut self) -> &mut NetworkInsightsAccessScopeAnalysisProperties { &mut self.properties } } -impl ::private::Sealed for PrefixList {} +impl ::private::Sealed for NetworkInsightsAccessScopeAnalysis {} -impl From for PrefixList { - fn from(properties: PrefixListProperties) -> PrefixList { - PrefixList { properties } +impl From for NetworkInsightsAccessScopeAnalysis { + fn from(properties: NetworkInsightsAccessScopeAnalysisProperties) -> NetworkInsightsAccessScopeAnalysis { + NetworkInsightsAccessScopeAnalysis { properties } } } -/// The [`AWS::EC2::Route`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html) resource type. +/// The [`AWS::EC2::NetworkInsightsAnalysis`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsanalysis.html) resource type. #[derive(Debug, Default)] -pub struct Route { - properties: RouteProperties +pub struct NetworkInsightsAnalysis { + properties: NetworkInsightsAnalysisProperties } -/// Properties for the `Route` resource. +/// Properties for the `NetworkInsightsAnalysis` resource. #[derive(Debug, Default)] -pub struct RouteProperties { - /// Property [`CarrierGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-carriergatewayid). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub carrier_gateway_id: Option<::Value>, - /// Property [`DestinationCidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-destinationcidrblock). +pub struct NetworkInsightsAnalysisProperties { + /// Property [`FilterInArns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsanalysis.html#cfn-ec2-networkinsightsanalysis-filterinarns). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub destination_cidr_block: Option<::Value>, - /// Property [`DestinationIpv6CidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-destinationipv6cidrblock). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub destination_ipv6_cidr_block: Option<::Value>, - /// Property [`EgressOnlyInternetGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-egressonlyinternetgatewayid). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub egress_only_internet_gateway_id: Option<::Value>, - /// Property [`GatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-gatewayid). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub gateway_id: Option<::Value>, - /// Property [`InstanceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-instanceid). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub instance_id: Option<::Value>, - /// Property [`LocalGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-localgatewayid). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub local_gateway_id: Option<::Value>, - /// Property [`NatGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-natgatewayid). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub nat_gateway_id: Option<::Value>, - /// Property [`NetworkInterfaceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-networkinterfaceid). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub network_interface_id: Option<::Value>, - /// Property [`RouteTableId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-routetableid). + pub filter_in_arns: Option<::ValueList>, + /// Property [`NetworkInsightsPathId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsanalysis.html#cfn-ec2-networkinsightsanalysis-networkinsightspathid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub route_table_id: ::Value, - /// Property [`TransitGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-transitgatewayid). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub transit_gateway_id: Option<::Value>, - /// Property [`VpcEndpointId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-vpcendpointid). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub vpc_endpoint_id: Option<::Value>, - /// Property [`VpcPeeringConnectionId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-vpcpeeringconnectionid). + pub network_insights_path_id: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightsanalysis.html#cfn-ec2-networkinsightsanalysis-tags). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub vpc_peering_connection_id: Option<::Value>, + pub tags: Option<::ValueList<::Tag>>, } -impl ::serde::Serialize for RouteProperties { +impl ::serde::Serialize for NetworkInsightsAnalysisProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref carrier_gateway_id) = self.carrier_gateway_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CarrierGatewayId", carrier_gateway_id)?; - } - if let Some(ref destination_cidr_block) = self.destination_cidr_block { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationCidrBlock", destination_cidr_block)?; - } - if let Some(ref destination_ipv6_cidr_block) = self.destination_ipv6_cidr_block { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationIpv6CidrBlock", destination_ipv6_cidr_block)?; - } - if let Some(ref egress_only_internet_gateway_id) = self.egress_only_internet_gateway_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "EgressOnlyInternetGatewayId", egress_only_internet_gateway_id)?; - } - if let Some(ref gateway_id) = self.gateway_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "GatewayId", gateway_id)?; - } - if let Some(ref instance_id) = self.instance_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceId", instance_id)?; - } - if let Some(ref local_gateway_id) = self.local_gateway_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LocalGatewayId", local_gateway_id)?; - } - if let Some(ref nat_gateway_id) = self.nat_gateway_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NatGatewayId", nat_gateway_id)?; - } - if let Some(ref network_interface_id) = self.network_interface_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaceId", network_interface_id)?; - } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "RouteTableId", &self.route_table_id)?; - if let Some(ref transit_gateway_id) = self.transit_gateway_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayId", transit_gateway_id)?; - } - if let Some(ref vpc_endpoint_id) = self.vpc_endpoint_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcEndpointId", vpc_endpoint_id)?; + if let Some(ref filter_in_arns) = self.filter_in_arns { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FilterInArns", filter_in_arns)?; } - if let Some(ref vpc_peering_connection_id) = self.vpc_peering_connection_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcPeeringConnectionId", vpc_peering_connection_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInsightsPathId", &self.network_insights_path_id)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for RouteProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for NetworkInsightsAnalysisProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = RouteProperties; + type Value = NetworkInsightsAnalysisProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type RouteProperties") + write!(f, "a struct of type NetworkInsightsAnalysisProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut carrier_gateway_id: Option<::Value> = None; - let mut destination_cidr_block: Option<::Value> = None; - let mut destination_ipv6_cidr_block: Option<::Value> = None; - let mut egress_only_internet_gateway_id: Option<::Value> = None; - let mut gateway_id: Option<::Value> = None; - let mut instance_id: Option<::Value> = None; - let mut local_gateway_id: Option<::Value> = None; - let mut nat_gateway_id: Option<::Value> = None; - let mut network_interface_id: Option<::Value> = None; - let mut route_table_id: Option<::Value> = None; - let mut transit_gateway_id: Option<::Value> = None; - let mut vpc_endpoint_id: Option<::Value> = None; - let mut vpc_peering_connection_id: Option<::Value> = None; + let mut filter_in_arns: Option<::ValueList> = None; + let mut network_insights_path_id: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "CarrierGatewayId" => { - carrier_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DestinationCidrBlock" => { - destination_cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DestinationIpv6CidrBlock" => { - destination_ipv6_cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; - } - "EgressOnlyInternetGatewayId" => { - egress_only_internet_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "GatewayId" => { - gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "InstanceId" => { - instance_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "LocalGatewayId" => { - local_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "NatGatewayId" => { - nat_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "NetworkInterfaceId" => { - network_interface_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "RouteTableId" => { - route_table_id = ::serde::de::MapAccess::next_value(&mut map)?; + "FilterInArns" => { + filter_in_arns = ::serde::de::MapAccess::next_value(&mut map)?; } - "TransitGatewayId" => { - transit_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; + "NetworkInsightsPathId" => { + network_insights_path_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "VpcEndpointId" => { - vpc_endpoint_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "VpcPeeringConnectionId" => { - vpc_peering_connection_id = ::serde::de::MapAccess::next_value(&mut map)?; + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(RouteProperties { - carrier_gateway_id: carrier_gateway_id, - destination_cidr_block: destination_cidr_block, - destination_ipv6_cidr_block: destination_ipv6_cidr_block, - egress_only_internet_gateway_id: egress_only_internet_gateway_id, - gateway_id: gateway_id, - instance_id: instance_id, - local_gateway_id: local_gateway_id, - nat_gateway_id: nat_gateway_id, - network_interface_id: network_interface_id, - route_table_id: route_table_id.ok_or(::serde::de::Error::missing_field("RouteTableId"))?, - transit_gateway_id: transit_gateway_id, - vpc_endpoint_id: vpc_endpoint_id, - vpc_peering_connection_id: vpc_peering_connection_id, + Ok(NetworkInsightsAnalysisProperties { + filter_in_arns: filter_in_arns, + network_insights_path_id: network_insights_path_id.ok_or(::serde::de::Error::missing_field("NetworkInsightsPathId"))?, + tags: tags, }) } } @@ -4539,87 +4557,148 @@ impl<'de> ::serde::Deserialize<'de> for RouteProperties { } } -impl ::Resource for Route { - type Properties = RouteProperties; - const TYPE: &'static str = "AWS::EC2::Route"; - fn properties(&self) -> &RouteProperties { +impl ::Resource for NetworkInsightsAnalysis { + type Properties = NetworkInsightsAnalysisProperties; + const TYPE: &'static str = "AWS::EC2::NetworkInsightsAnalysis"; + fn properties(&self) -> &NetworkInsightsAnalysisProperties { &self.properties } - fn properties_mut(&mut self) -> &mut RouteProperties { + fn properties_mut(&mut self) -> &mut NetworkInsightsAnalysisProperties { &mut self.properties } } -impl ::private::Sealed for Route {} +impl ::private::Sealed for NetworkInsightsAnalysis {} -impl From for Route { - fn from(properties: RouteProperties) -> Route { - Route { properties } +impl From for NetworkInsightsAnalysis { + fn from(properties: NetworkInsightsAnalysisProperties) -> NetworkInsightsAnalysis { + NetworkInsightsAnalysis { properties } } } -/// The [`AWS::EC2::RouteTable`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route-table.html) resource type. +/// The [`AWS::EC2::NetworkInsightsPath`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html) resource type. #[derive(Debug, Default)] -pub struct RouteTable { - properties: RouteTableProperties +pub struct NetworkInsightsPath { + properties: NetworkInsightsPathProperties } -/// Properties for the `RouteTable` resource. +/// Properties for the `NetworkInsightsPath` resource. #[derive(Debug, Default)] -pub struct RouteTableProperties { - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route-table.html#cfn-ec2-routetable-tags). +pub struct NetworkInsightsPathProperties { + /// Property [`Destination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html#cfn-ec2-networkinsightspath-destination). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub tags: Option<::ValueList<::Tag>>, - /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route-table.html#cfn-ec2-routetable-vpcid). + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub destination: ::Value, + /// Property [`DestinationIp`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html#cfn-ec2-networkinsightspath-destinationip). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub vpc_id: ::Value, + pub destination_ip: Option<::Value>, + /// Property [`DestinationPort`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html#cfn-ec2-networkinsightspath-destinationport). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub destination_port: Option<::Value>, + /// Property [`Protocol`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html#cfn-ec2-networkinsightspath-protocol). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub protocol: ::Value, + /// Property [`Source`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html#cfn-ec2-networkinsightspath-source). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub source: ::Value, + /// Property [`SourceIp`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html#cfn-ec2-networkinsightspath-sourceip). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub source_ip: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinsightspath.html#cfn-ec2-networkinsightspath-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, } -impl ::serde::Serialize for RouteTableProperties { +impl ::serde::Serialize for NetworkInsightsPathProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Destination", &self.destination)?; + if let Some(ref destination_ip) = self.destination_ip { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationIp", destination_ip)?; + } + if let Some(ref destination_port) = self.destination_port { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationPort", destination_port)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Protocol", &self.protocol)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Source", &self.source)?; + if let Some(ref source_ip) = self.source_ip { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourceIp", source_ip)?; + } if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", &self.vpc_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for RouteTableProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for NetworkInsightsPathProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = RouteTableProperties; + type Value = NetworkInsightsPathProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type RouteTableProperties") + write!(f, "a struct of type NetworkInsightsPathProperties") } fn visit_map>(self, mut map: A) -> Result { + let mut destination: Option<::Value> = None; + let mut destination_ip: Option<::Value> = None; + let mut destination_port: Option<::Value> = None; + let mut protocol: Option<::Value> = None; + let mut source: Option<::Value> = None; + let mut source_ip: Option<::Value> = None; let mut tags: Option<::ValueList<::Tag>> = None; - let mut vpc_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "Destination" => { + destination = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DestinationIp" => { + destination_ip = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DestinationPort" => { + destination_port = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Protocol" => { + protocol = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Source" => { + source = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SourceIp" => { + source_ip = ::serde::de::MapAccess::next_value(&mut map)?; + } "Tags" => { tags = ::serde::de::MapAccess::next_value(&mut map)?; } - "VpcId" => { - vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; - } _ => {} } } - Ok(RouteTableProperties { + Ok(NetworkInsightsPathProperties { + destination: destination.ok_or(::serde::de::Error::missing_field("Destination"))?, + destination_ip: destination_ip, + destination_port: destination_port, + protocol: protocol.ok_or(::serde::de::Error::missing_field("Protocol"))?, + source: source.ok_or(::serde::de::Error::missing_field("Source"))?, + source_ip: source_ip, tags: tags, - vpc_id: vpc_id.ok_or(::serde::de::Error::missing_field("VpcId"))?, }) } } @@ -4628,139 +4707,204 @@ impl<'de> ::serde::Deserialize<'de> for RouteTableProperties { } } -impl ::Resource for RouteTable { - type Properties = RouteTableProperties; - const TYPE: &'static str = "AWS::EC2::RouteTable"; - fn properties(&self) -> &RouteTableProperties { +impl ::Resource for NetworkInsightsPath { + type Properties = NetworkInsightsPathProperties; + const TYPE: &'static str = "AWS::EC2::NetworkInsightsPath"; + fn properties(&self) -> &NetworkInsightsPathProperties { &self.properties } - fn properties_mut(&mut self) -> &mut RouteTableProperties { + fn properties_mut(&mut self) -> &mut NetworkInsightsPathProperties { &mut self.properties } } -impl ::private::Sealed for RouteTable {} +impl ::private::Sealed for NetworkInsightsPath {} -impl From for RouteTable { - fn from(properties: RouteTableProperties) -> RouteTable { - RouteTable { properties } +impl From for NetworkInsightsPath { + fn from(properties: NetworkInsightsPathProperties) -> NetworkInsightsPath { + NetworkInsightsPath { properties } } } -/// The [`AWS::EC2::SecurityGroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html) resource type. +/// The [`AWS::EC2::NetworkInterface`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html) resource type. #[derive(Debug, Default)] -pub struct SecurityGroup { - properties: SecurityGroupProperties +pub struct NetworkInterface { + properties: NetworkInterfaceProperties } -/// Properties for the `SecurityGroup` resource. +/// Properties for the `NetworkInterface` resource. #[derive(Debug, Default)] -pub struct SecurityGroupProperties { - /// Property [`GroupDescription`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#cfn-ec2-securitygroup-groupdescription). +pub struct NetworkInterfaceProperties { + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html#cfn-ec2-networkinterface-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`GroupSet`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html#cfn-ec2-networkinterface-groupset). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub group_set: Option<::ValueList>, + /// Property [`InterfaceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html#cfn-ec2-networkinterface-interfacetype). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub group_description: ::Value, - /// Property [`GroupName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#cfn-ec2-securitygroup-groupname). + pub interface_type: Option<::Value>, + /// Property [`Ipv6AddressCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html#cfn-ec2-networkinterface-ipv6addresscount). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ipv6_address_count: Option<::Value>, + /// Property [`Ipv6Addresses`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html#cfn-ec2-networkinterface-ipv6addresses). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ipv6_addresses: Option<::ValueList>, + /// Property [`PrivateIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html#cfn-ec2-networkinterface-privateipaddress). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub group_name: Option<::Value>, - /// Property [`SecurityGroupEgress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#cfn-ec2-securitygroup-securitygroupegress). + pub private_ip_address: Option<::Value>, + /// Property [`PrivateIpAddresses`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html#cfn-ec2-networkinterface-privateipaddresses). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub security_group_egress: Option<::ValueList>, - /// Property [`SecurityGroupIngress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#cfn-ec2-securitygroup-securitygroupingress). + pub private_ip_addresses: Option<::ValueList>, + /// Property [`SecondaryPrivateIpAddressCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html#cfn-ec2-networkinterface-secondaryprivateipaddresscount). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub security_group_ingress: Option<::ValueList>, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#cfn-ec2-securitygroup-tags). + pub secondary_private_ip_address_count: Option<::Value>, + /// Property [`SourceDestCheck`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html#cfn-ec2-networkinterface-sourcedestcheck). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub tags: Option<::ValueList<::Tag>>, - /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#cfn-ec2-securitygroup-vpcid). + pub source_dest_check: Option<::Value>, + /// Property [`SubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html#cfn-ec2-networkinterface-subnetid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub vpc_id: Option<::Value>, + pub subnet_id: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterface.html#cfn-ec2-networkinterface-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, } -impl ::serde::Serialize for SecurityGroupProperties { +impl ::serde::Serialize for NetworkInterfaceProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupDescription", &self.group_description)?; - if let Some(ref group_name) = self.group_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupName", group_name)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; } - if let Some(ref security_group_egress) = self.security_group_egress { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityGroupEgress", security_group_egress)?; + if let Some(ref group_set) = self.group_set { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupSet", group_set)?; } - if let Some(ref security_group_ingress) = self.security_group_ingress { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityGroupIngress", security_group_ingress)?; + if let Some(ref interface_type) = self.interface_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InterfaceType", interface_type)?; + } + if let Some(ref ipv6_address_count) = self.ipv6_address_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6AddressCount", ipv6_address_count)?; + } + if let Some(ref ipv6_addresses) = self.ipv6_addresses { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6Addresses", ipv6_addresses)?; + } + if let Some(ref private_ip_address) = self.private_ip_address { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateIpAddress", private_ip_address)?; + } + if let Some(ref private_ip_addresses) = self.private_ip_addresses { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateIpAddresses", private_ip_addresses)?; + } + if let Some(ref secondary_private_ip_address_count) = self.secondary_private_ip_address_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecondaryPrivateIpAddressCount", secondary_private_ip_address_count)?; + } + if let Some(ref source_dest_check) = self.source_dest_check { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourceDestCheck", source_dest_check)?; } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetId", &self.subnet_id)?; if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } - if let Some(ref vpc_id) = self.vpc_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", vpc_id)?; - } ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for SecurityGroupProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for NetworkInterfaceProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = SecurityGroupProperties; + type Value = NetworkInterfaceProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type SecurityGroupProperties") + write!(f, "a struct of type NetworkInterfaceProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut group_description: Option<::Value> = None; - let mut group_name: Option<::Value> = None; - let mut security_group_egress: Option<::ValueList> = None; - let mut security_group_ingress: Option<::ValueList> = None; + let mut description: Option<::Value> = None; + let mut group_set: Option<::ValueList> = None; + let mut interface_type: Option<::Value> = None; + let mut ipv6_address_count: Option<::Value> = None; + let mut ipv6_addresses: Option<::ValueList> = None; + let mut private_ip_address: Option<::Value> = None; + let mut private_ip_addresses: Option<::ValueList> = None; + let mut secondary_private_ip_address_count: Option<::Value> = None; + let mut source_dest_check: Option<::Value> = None; + let mut subnet_id: Option<::Value> = None; let mut tags: Option<::ValueList<::Tag>> = None; - let mut vpc_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "GroupDescription" => { - group_description = ::serde::de::MapAccess::next_value(&mut map)?; + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; } - "GroupName" => { - group_name = ::serde::de::MapAccess::next_value(&mut map)?; + "GroupSet" => { + group_set = ::serde::de::MapAccess::next_value(&mut map)?; } - "SecurityGroupEgress" => { - security_group_egress = ::serde::de::MapAccess::next_value(&mut map)?; + "InterfaceType" => { + interface_type = ::serde::de::MapAccess::next_value(&mut map)?; } - "SecurityGroupIngress" => { - security_group_ingress = ::serde::de::MapAccess::next_value(&mut map)?; + "Ipv6AddressCount" => { + ipv6_address_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Ipv6Addresses" => { + ipv6_addresses = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PrivateIpAddress" => { + private_ip_address = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PrivateIpAddresses" => { + private_ip_addresses = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SecondaryPrivateIpAddressCount" => { + secondary_private_ip_address_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SourceDestCheck" => { + source_dest_check = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SubnetId" => { + subnet_id = ::serde::de::MapAccess::next_value(&mut map)?; } "Tags" => { tags = ::serde::de::MapAccess::next_value(&mut map)?; } - "VpcId" => { - vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; - } _ => {} } } - Ok(SecurityGroupProperties { - group_description: group_description.ok_or(::serde::de::Error::missing_field("GroupDescription"))?, - group_name: group_name, - security_group_egress: security_group_egress, - security_group_ingress: security_group_ingress, + Ok(NetworkInterfaceProperties { + description: description, + group_set: group_set, + interface_type: interface_type, + ipv6_address_count: ipv6_address_count, + ipv6_addresses: ipv6_addresses, + private_ip_address: private_ip_address, + private_ip_addresses: private_ip_addresses, + secondary_private_ip_address_count: secondary_private_ip_address_count, + source_dest_check: source_dest_check, + subnet_id: subnet_id.ok_or(::serde::de::Error::missing_field("SubnetId"))?, tags: tags, - vpc_id: vpc_id, }) } } @@ -4769,176 +4913,109 @@ impl<'de> ::serde::Deserialize<'de> for SecurityGroupProperties { } } -impl ::Resource for SecurityGroup { - type Properties = SecurityGroupProperties; - const TYPE: &'static str = "AWS::EC2::SecurityGroup"; - fn properties(&self) -> &SecurityGroupProperties { +impl ::Resource for NetworkInterface { + type Properties = NetworkInterfaceProperties; + const TYPE: &'static str = "AWS::EC2::NetworkInterface"; + fn properties(&self) -> &NetworkInterfaceProperties { &self.properties } - fn properties_mut(&mut self) -> &mut SecurityGroupProperties { + fn properties_mut(&mut self) -> &mut NetworkInterfaceProperties { &mut self.properties } } -impl ::private::Sealed for SecurityGroup {} +impl ::private::Sealed for NetworkInterface {} -impl From for SecurityGroup { - fn from(properties: SecurityGroupProperties) -> SecurityGroup { - SecurityGroup { properties } +impl From for NetworkInterface { + fn from(properties: NetworkInterfaceProperties) -> NetworkInterface { + NetworkInterface { properties } } } -/// The [`AWS::EC2::SecurityGroupEgress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html) resource type. +/// The [`AWS::EC2::NetworkInterfaceAttachment`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface-attachment.html) resource type. #[derive(Debug, Default)] -pub struct SecurityGroupEgress { - properties: SecurityGroupEgressProperties +pub struct NetworkInterfaceAttachment { + properties: NetworkInterfaceAttachmentProperties } -/// Properties for the `SecurityGroupEgress` resource. +/// Properties for the `NetworkInterfaceAttachment` resource. #[derive(Debug, Default)] -pub struct SecurityGroupEgressProperties { - /// Property [`CidrIp`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-cidrip). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub cidr_ip: Option<::Value>, - /// Property [`CidrIpv6`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-cidripv6). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub cidr_ipv6: Option<::Value>, - /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-description). +pub struct NetworkInterfaceAttachmentProperties { + /// Property [`DeleteOnTermination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface-attachment.html#cfn-ec2-network-interface-attachment-deleteonterm). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub description: Option<::Value>, - /// Property [`DestinationPrefixListId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-destinationprefixlistid). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub destination_prefix_list_id: Option<::Value>, - /// Property [`DestinationSecurityGroupId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-destinationsecuritygroupid). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub destination_security_group_id: Option<::Value>, - /// Property [`FromPort`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-fromport). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub from_port: Option<::Value>, - /// Property [`GroupId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-groupid). + pub delete_on_termination: Option<::Value>, + /// Property [`DeviceIndex`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface-attachment.html#cfn-ec2-network-interface-attachment-deviceindex). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub group_id: ::Value, - /// Property [`IpProtocol`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-ipprotocol). + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub device_index: ::Value, + /// Property [`InstanceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface-attachment.html#cfn-ec2-network-interface-attachment-instanceid). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub ip_protocol: ::Value, - /// Property [`ToPort`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-toport). + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub instance_id: ::Value, + /// Property [`NetworkInterfaceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-network-interface-attachment.html#cfn-ec2-network-interface-attachment-networkinterfaceid). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub to_port: Option<::Value>, + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub network_interface_id: ::Value, } -impl ::serde::Serialize for SecurityGroupEgressProperties { +impl ::serde::Serialize for NetworkInterfaceAttachmentProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref cidr_ip) = self.cidr_ip { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CidrIp", cidr_ip)?; - } - if let Some(ref cidr_ipv6) = self.cidr_ipv6 { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CidrIpv6", cidr_ipv6)?; - } - if let Some(ref description) = self.description { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; - } - if let Some(ref destination_prefix_list_id) = self.destination_prefix_list_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationPrefixListId", destination_prefix_list_id)?; - } - if let Some(ref destination_security_group_id) = self.destination_security_group_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationSecurityGroupId", destination_security_group_id)?; - } - if let Some(ref from_port) = self.from_port { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "FromPort", from_port)?; - } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupId", &self.group_id)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "IpProtocol", &self.ip_protocol)?; - if let Some(ref to_port) = self.to_port { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ToPort", to_port)?; + if let Some(ref delete_on_termination) = self.delete_on_termination { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeleteOnTermination", delete_on_termination)?; } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeviceIndex", &self.device_index)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceId", &self.instance_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaceId", &self.network_interface_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for SecurityGroupEgressProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for NetworkInterfaceAttachmentProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = SecurityGroupEgressProperties; + type Value = NetworkInterfaceAttachmentProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type SecurityGroupEgressProperties") + write!(f, "a struct of type NetworkInterfaceAttachmentProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut cidr_ip: Option<::Value> = None; - let mut cidr_ipv6: Option<::Value> = None; - let mut description: Option<::Value> = None; - let mut destination_prefix_list_id: Option<::Value> = None; - let mut destination_security_group_id: Option<::Value> = None; - let mut from_port: Option<::Value> = None; - let mut group_id: Option<::Value> = None; - let mut ip_protocol: Option<::Value> = None; - let mut to_port: Option<::Value> = None; + let mut delete_on_termination: Option<::Value> = None; + let mut device_index: Option<::Value> = None; + let mut instance_id: Option<::Value> = None; + let mut network_interface_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "CidrIp" => { - cidr_ip = ::serde::de::MapAccess::next_value(&mut map)?; - } - "CidrIpv6" => { - cidr_ipv6 = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Description" => { - description = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DestinationPrefixListId" => { - destination_prefix_list_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DestinationSecurityGroupId" => { - destination_security_group_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "FromPort" => { - from_port = ::serde::de::MapAccess::next_value(&mut map)?; + "DeleteOnTermination" => { + delete_on_termination = ::serde::de::MapAccess::next_value(&mut map)?; } - "GroupId" => { - group_id = ::serde::de::MapAccess::next_value(&mut map)?; + "DeviceIndex" => { + device_index = ::serde::de::MapAccess::next_value(&mut map)?; } - "IpProtocol" => { - ip_protocol = ::serde::de::MapAccess::next_value(&mut map)?; + "InstanceId" => { + instance_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "ToPort" => { - to_port = ::serde::de::MapAccess::next_value(&mut map)?; + "NetworkInterfaceId" => { + network_interface_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(SecurityGroupEgressProperties { - cidr_ip: cidr_ip, - cidr_ipv6: cidr_ipv6, - description: description, - destination_prefix_list_id: destination_prefix_list_id, - destination_security_group_id: destination_security_group_id, - from_port: from_port, - group_id: group_id.ok_or(::serde::de::Error::missing_field("GroupId"))?, - ip_protocol: ip_protocol.ok_or(::serde::de::Error::missing_field("IpProtocol"))?, - to_port: to_port, + Ok(NetworkInterfaceAttachmentProperties { + delete_on_termination: delete_on_termination, + device_index: device_index.ok_or(::serde::de::Error::missing_field("DeviceIndex"))?, + instance_id: instance_id.ok_or(::serde::de::Error::missing_field("InstanceId"))?, + network_interface_id: network_interface_id.ok_or(::serde::de::Error::missing_field("NetworkInterfaceId"))?, }) } } @@ -4947,217 +5024,96 @@ impl<'de> ::serde::Deserialize<'de> for SecurityGroupEgressProperties { } } -impl ::Resource for SecurityGroupEgress { - type Properties = SecurityGroupEgressProperties; - const TYPE: &'static str = "AWS::EC2::SecurityGroupEgress"; - fn properties(&self) -> &SecurityGroupEgressProperties { +impl ::Resource for NetworkInterfaceAttachment { + type Properties = NetworkInterfaceAttachmentProperties; + const TYPE: &'static str = "AWS::EC2::NetworkInterfaceAttachment"; + fn properties(&self) -> &NetworkInterfaceAttachmentProperties { &self.properties } - fn properties_mut(&mut self) -> &mut SecurityGroupEgressProperties { + fn properties_mut(&mut self) -> &mut NetworkInterfaceAttachmentProperties { &mut self.properties } } -impl ::private::Sealed for SecurityGroupEgress {} +impl ::private::Sealed for NetworkInterfaceAttachment {} -impl From for SecurityGroupEgress { - fn from(properties: SecurityGroupEgressProperties) -> SecurityGroupEgress { - SecurityGroupEgress { properties } +impl From for NetworkInterfaceAttachment { + fn from(properties: NetworkInterfaceAttachmentProperties) -> NetworkInterfaceAttachment { + NetworkInterfaceAttachment { properties } } } -/// The [`AWS::EC2::SecurityGroupIngress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html) resource type. +/// The [`AWS::EC2::NetworkInterfacePermission`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterfacepermission.html) resource type. #[derive(Debug, Default)] -pub struct SecurityGroupIngress { - properties: SecurityGroupIngressProperties +pub struct NetworkInterfacePermission { + properties: NetworkInterfacePermissionProperties } -/// Properties for the `SecurityGroupIngress` resource. +/// Properties for the `NetworkInterfacePermission` resource. #[derive(Debug, Default)] -pub struct SecurityGroupIngressProperties { - /// Property [`CidrIp`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-cidrip). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub cidr_ip: Option<::Value>, - /// Property [`CidrIpv6`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-cidripv6). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub cidr_ipv6: Option<::Value>, - /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-description). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub description: Option<::Value>, - /// Property [`FromPort`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-fromport). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub from_port: Option<::Value>, - /// Property [`GroupId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-groupid). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub group_id: Option<::Value>, - /// Property [`GroupName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-groupname). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub group_name: Option<::Value>, - /// Property [`IpProtocol`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-ipprotocol). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub ip_protocol: ::Value, - /// Property [`SourcePrefixListId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-securitygroupingress-sourceprefixlistid). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub source_prefix_list_id: Option<::Value>, - /// Property [`SourceSecurityGroupId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-sourcesecuritygroupid). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub source_security_group_id: Option<::Value>, - /// Property [`SourceSecurityGroupName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-sourcesecuritygroupname). +pub struct NetworkInterfacePermissionProperties { + /// Property [`AwsAccountId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterfacepermission.html#cfn-ec2-networkinterfacepermission-awsaccountid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub source_security_group_name: Option<::Value>, - /// Property [`SourceSecurityGroupOwnerId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-sourcesecuritygroupownerid). + pub aws_account_id: ::Value, + /// Property [`NetworkInterfaceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterfacepermission.html#cfn-ec2-networkinterfacepermission-networkinterfaceid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub source_security_group_owner_id: Option<::Value>, - /// Property [`ToPort`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-toport). + pub network_interface_id: ::Value, + /// Property [`Permission`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-networkinterfacepermission.html#cfn-ec2-networkinterfacepermission-permission). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub to_port: Option<::Value>, + pub permission: ::Value, } -impl ::serde::Serialize for SecurityGroupIngressProperties { +impl ::serde::Serialize for NetworkInterfacePermissionProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref cidr_ip) = self.cidr_ip { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CidrIp", cidr_ip)?; - } - if let Some(ref cidr_ipv6) = self.cidr_ipv6 { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CidrIpv6", cidr_ipv6)?; - } - if let Some(ref description) = self.description { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; - } - if let Some(ref from_port) = self.from_port { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "FromPort", from_port)?; - } - if let Some(ref group_id) = self.group_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupId", group_id)?; - } - if let Some(ref group_name) = self.group_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupName", group_name)?; - } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "IpProtocol", &self.ip_protocol)?; - if let Some(ref source_prefix_list_id) = self.source_prefix_list_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourcePrefixListId", source_prefix_list_id)?; - } - if let Some(ref source_security_group_id) = self.source_security_group_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourceSecurityGroupId", source_security_group_id)?; - } - if let Some(ref source_security_group_name) = self.source_security_group_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourceSecurityGroupName", source_security_group_name)?; - } - if let Some(ref source_security_group_owner_id) = self.source_security_group_owner_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourceSecurityGroupOwnerId", source_security_group_owner_id)?; - } - if let Some(ref to_port) = self.to_port { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ToPort", to_port)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AwsAccountId", &self.aws_account_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaceId", &self.network_interface_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Permission", &self.permission)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for SecurityGroupIngressProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for NetworkInterfacePermissionProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = SecurityGroupIngressProperties; + type Value = NetworkInterfacePermissionProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type SecurityGroupIngressProperties") + write!(f, "a struct of type NetworkInterfacePermissionProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut cidr_ip: Option<::Value> = None; - let mut cidr_ipv6: Option<::Value> = None; - let mut description: Option<::Value> = None; - let mut from_port: Option<::Value> = None; - let mut group_id: Option<::Value> = None; - let mut group_name: Option<::Value> = None; - let mut ip_protocol: Option<::Value> = None; - let mut source_prefix_list_id: Option<::Value> = None; - let mut source_security_group_id: Option<::Value> = None; - let mut source_security_group_name: Option<::Value> = None; - let mut source_security_group_owner_id: Option<::Value> = None; - let mut to_port: Option<::Value> = None; + let mut aws_account_id: Option<::Value> = None; + let mut network_interface_id: Option<::Value> = None; + let mut permission: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "CidrIp" => { - cidr_ip = ::serde::de::MapAccess::next_value(&mut map)?; - } - "CidrIpv6" => { - cidr_ipv6 = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Description" => { - description = ::serde::de::MapAccess::next_value(&mut map)?; - } - "FromPort" => { - from_port = ::serde::de::MapAccess::next_value(&mut map)?; - } - "GroupId" => { - group_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "GroupName" => { - group_name = ::serde::de::MapAccess::next_value(&mut map)?; - } - "IpProtocol" => { - ip_protocol = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SourcePrefixListId" => { - source_prefix_list_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SourceSecurityGroupId" => { - source_security_group_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SourceSecurityGroupName" => { - source_security_group_name = ::serde::de::MapAccess::next_value(&mut map)?; + "AwsAccountId" => { + aws_account_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "SourceSecurityGroupOwnerId" => { - source_security_group_owner_id = ::serde::de::MapAccess::next_value(&mut map)?; + "NetworkInterfaceId" => { + network_interface_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "ToPort" => { - to_port = ::serde::de::MapAccess::next_value(&mut map)?; + "Permission" => { + permission = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(SecurityGroupIngressProperties { - cidr_ip: cidr_ip, - cidr_ipv6: cidr_ipv6, - description: description, - from_port: from_port, - group_id: group_id, - group_name: group_name, - ip_protocol: ip_protocol.ok_or(::serde::de::Error::missing_field("IpProtocol"))?, - source_prefix_list_id: source_prefix_list_id, - source_security_group_id: source_security_group_id, - source_security_group_name: source_security_group_name, - source_security_group_owner_id: source_security_group_owner_id, - to_port: to_port, + Ok(NetworkInterfacePermissionProperties { + aws_account_id: aws_account_id.ok_or(::serde::de::Error::missing_field("AwsAccountId"))?, + network_interface_id: network_interface_id.ok_or(::serde::de::Error::missing_field("NetworkInterfaceId"))?, + permission: permission.ok_or(::serde::de::Error::missing_field("Permission"))?, }) } } @@ -5166,74 +5122,76 @@ impl<'de> ::serde::Deserialize<'de> for SecurityGroupIngressProperties { } } -impl ::Resource for SecurityGroupIngress { - type Properties = SecurityGroupIngressProperties; - const TYPE: &'static str = "AWS::EC2::SecurityGroupIngress"; - fn properties(&self) -> &SecurityGroupIngressProperties { +impl ::Resource for NetworkInterfacePermission { + type Properties = NetworkInterfacePermissionProperties; + const TYPE: &'static str = "AWS::EC2::NetworkInterfacePermission"; + fn properties(&self) -> &NetworkInterfacePermissionProperties { &self.properties } - fn properties_mut(&mut self) -> &mut SecurityGroupIngressProperties { + fn properties_mut(&mut self) -> &mut NetworkInterfacePermissionProperties { &mut self.properties } } -impl ::private::Sealed for SecurityGroupIngress {} +impl ::private::Sealed for NetworkInterfacePermission {} -impl From for SecurityGroupIngress { - fn from(properties: SecurityGroupIngressProperties) -> SecurityGroupIngress { - SecurityGroupIngress { properties } +impl From for NetworkInterfacePermission { + fn from(properties: NetworkInterfacePermissionProperties) -> NetworkInterfacePermission { + NetworkInterfacePermission { properties } } } -/// The [`AWS::EC2::SpotFleet`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-spotfleet.html) resource type. +/// The [`AWS::EC2::PlacementGroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-placementgroup.html) resource type. #[derive(Debug, Default)] -pub struct SpotFleet { - properties: SpotFleetProperties +pub struct PlacementGroup { + properties: PlacementGroupProperties } -/// Properties for the `SpotFleet` resource. +/// Properties for the `PlacementGroup` resource. #[derive(Debug, Default)] -pub struct SpotFleetProperties { - /// Property [`SpotFleetRequestConfigData`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-spotfleet.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata). +pub struct PlacementGroupProperties { + /// Property [`Strategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-placementgroup.html#cfn-ec2-placementgroup-strategy). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub spot_fleet_request_config_data: ::Value, + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub strategy: Option<::Value>, } -impl ::serde::Serialize for SpotFleetProperties { +impl ::serde::Serialize for PlacementGroupProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpotFleetRequestConfigData", &self.spot_fleet_request_config_data)?; + if let Some(ref strategy) = self.strategy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Strategy", strategy)?; + } ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for SpotFleetProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for PlacementGroupProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = SpotFleetProperties; + type Value = PlacementGroupProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type SpotFleetProperties") + write!(f, "a struct of type PlacementGroupProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut spot_fleet_request_config_data: Option<::Value> = None; + let mut strategy: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "SpotFleetRequestConfigData" => { - spot_fleet_request_config_data = ::serde::de::MapAccess::next_value(&mut map)?; + "Strategy" => { + strategy = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(SpotFleetProperties { - spot_fleet_request_config_data: spot_fleet_request_config_data.ok_or(::serde::de::Error::missing_field("SpotFleetRequestConfigData"))?, + Ok(PlacementGroupProperties { + strategy: strategy, }) } } @@ -5242,163 +5200,122 @@ impl<'de> ::serde::Deserialize<'de> for SpotFleetProperties { } } -impl ::Resource for SpotFleet { - type Properties = SpotFleetProperties; - const TYPE: &'static str = "AWS::EC2::SpotFleet"; - fn properties(&self) -> &SpotFleetProperties { - &self.properties - } - fn properties_mut(&mut self) -> &mut SpotFleetProperties { +impl ::Resource for PlacementGroup { + type Properties = PlacementGroupProperties; + const TYPE: &'static str = "AWS::EC2::PlacementGroup"; + fn properties(&self) -> &PlacementGroupProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut PlacementGroupProperties { &mut self.properties } } -impl ::private::Sealed for SpotFleet {} +impl ::private::Sealed for PlacementGroup {} -impl From for SpotFleet { - fn from(properties: SpotFleetProperties) -> SpotFleet { - SpotFleet { properties } +impl From for PlacementGroup { + fn from(properties: PlacementGroupProperties) -> PlacementGroup { + PlacementGroup { properties } } } -/// The [`AWS::EC2::Subnet`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html) resource type. +/// The [`AWS::EC2::PrefixList`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-prefixlist.html) resource type. #[derive(Debug, Default)] -pub struct Subnet { - properties: SubnetProperties +pub struct PrefixList { + properties: PrefixListProperties } -/// Properties for the `Subnet` resource. +/// Properties for the `PrefixList` resource. #[derive(Debug, Default)] -pub struct SubnetProperties { - /// Property [`AssignIpv6AddressOnCreation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-assignipv6addressoncreation). +pub struct PrefixListProperties { + /// Property [`AddressFamily`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-prefixlist.html#cfn-ec2-prefixlist-addressfamily). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub assign_ipv6_address_on_creation: Option<::Value>, - /// Property [`AvailabilityZone`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-availabilityzone). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub availability_zone: Option<::Value>, - /// Property [`CidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-cidrblock). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub cidr_block: ::Value, - /// Property [`Ipv6CidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-ipv6cidrblock). + pub address_family: ::Value, + /// Property [`Entries`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-prefixlist.html#cfn-ec2-prefixlist-entries). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub ipv6_cidr_block: Option<::Value>, - /// Property [`MapPublicIpOnLaunch`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-mappubliciponlaunch). + pub entries: Option<::ValueList>, + /// Property [`MaxEntries`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-prefixlist.html#cfn-ec2-prefixlist-maxentries). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub map_public_ip_on_launch: Option<::Value>, - /// Property [`OutpostArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-outpostarn). + pub max_entries: ::Value, + /// Property [`PrefixListName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-prefixlist.html#cfn-ec2-prefixlist-prefixlistname). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub outpost_arn: Option<::Value>, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-tags). + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub prefix_list_name: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-prefixlist.html#cfn-ec2-prefixlist-tags). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub tags: Option<::ValueList<::Tag>>, - /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-awsec2subnet-prop-vpcid). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub vpc_id: ::Value, } -impl ::serde::Serialize for SubnetProperties { +impl ::serde::Serialize for PrefixListProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref assign_ipv6_address_on_creation) = self.assign_ipv6_address_on_creation { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AssignIpv6AddressOnCreation", assign_ipv6_address_on_creation)?; - } - if let Some(ref availability_zone) = self.availability_zone { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AvailabilityZone", availability_zone)?; - } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CidrBlock", &self.cidr_block)?; - if let Some(ref ipv6_cidr_block) = self.ipv6_cidr_block { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6CidrBlock", ipv6_cidr_block)?; - } - if let Some(ref map_public_ip_on_launch) = self.map_public_ip_on_launch { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "MapPublicIpOnLaunch", map_public_ip_on_launch)?; - } - if let Some(ref outpost_arn) = self.outpost_arn { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "OutpostArn", outpost_arn)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AddressFamily", &self.address_family)?; + if let Some(ref entries) = self.entries { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Entries", entries)?; } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxEntries", &self.max_entries)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrefixListName", &self.prefix_list_name)?; if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", &self.vpc_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for SubnetProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for PrefixListProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = SubnetProperties; + type Value = PrefixListProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type SubnetProperties") + write!(f, "a struct of type PrefixListProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut assign_ipv6_address_on_creation: Option<::Value> = None; - let mut availability_zone: Option<::Value> = None; - let mut cidr_block: Option<::Value> = None; - let mut ipv6_cidr_block: Option<::Value> = None; - let mut map_public_ip_on_launch: Option<::Value> = None; - let mut outpost_arn: Option<::Value> = None; + let mut address_family: Option<::Value> = None; + let mut entries: Option<::ValueList> = None; + let mut max_entries: Option<::Value> = None; + let mut prefix_list_name: Option<::Value> = None; let mut tags: Option<::ValueList<::Tag>> = None; - let mut vpc_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "AssignIpv6AddressOnCreation" => { - assign_ipv6_address_on_creation = ::serde::de::MapAccess::next_value(&mut map)?; - } - "AvailabilityZone" => { - availability_zone = ::serde::de::MapAccess::next_value(&mut map)?; - } - "CidrBlock" => { - cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; + "AddressFamily" => { + address_family = ::serde::de::MapAccess::next_value(&mut map)?; } - "Ipv6CidrBlock" => { - ipv6_cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; + "Entries" => { + entries = ::serde::de::MapAccess::next_value(&mut map)?; } - "MapPublicIpOnLaunch" => { - map_public_ip_on_launch = ::serde::de::MapAccess::next_value(&mut map)?; + "MaxEntries" => { + max_entries = ::serde::de::MapAccess::next_value(&mut map)?; } - "OutpostArn" => { - outpost_arn = ::serde::de::MapAccess::next_value(&mut map)?; + "PrefixListName" => { + prefix_list_name = ::serde::de::MapAccess::next_value(&mut map)?; } "Tags" => { tags = ::serde::de::MapAccess::next_value(&mut map)?; } - "VpcId" => { - vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; - } _ => {} } } - Ok(SubnetProperties { - assign_ipv6_address_on_creation: assign_ipv6_address_on_creation, - availability_zone: availability_zone, - cidr_block: cidr_block.ok_or(::serde::de::Error::missing_field("CidrBlock"))?, - ipv6_cidr_block: ipv6_cidr_block, - map_public_ip_on_launch: map_public_ip_on_launch, - outpost_arn: outpost_arn, + Ok(PrefixListProperties { + address_family: address_family.ok_or(::serde::de::Error::missing_field("AddressFamily"))?, + entries: entries, + max_entries: max_entries.ok_or(::serde::de::Error::missing_field("MaxEntries"))?, + prefix_list_name: prefix_list_name.ok_or(::serde::de::Error::missing_field("PrefixListName"))?, tags: tags, - vpc_id: vpc_id.ok_or(::serde::de::Error::missing_field("VpcId"))?, }) } } @@ -5407,85 +5324,230 @@ impl<'de> ::serde::Deserialize<'de> for SubnetProperties { } } -impl ::Resource for Subnet { - type Properties = SubnetProperties; - const TYPE: &'static str = "AWS::EC2::Subnet"; - fn properties(&self) -> &SubnetProperties { +impl ::Resource for PrefixList { + type Properties = PrefixListProperties; + const TYPE: &'static str = "AWS::EC2::PrefixList"; + fn properties(&self) -> &PrefixListProperties { &self.properties } - fn properties_mut(&mut self) -> &mut SubnetProperties { + fn properties_mut(&mut self) -> &mut PrefixListProperties { &mut self.properties } } -impl ::private::Sealed for Subnet {} +impl ::private::Sealed for PrefixList {} -impl From for Subnet { - fn from(properties: SubnetProperties) -> Subnet { - Subnet { properties } +impl From for PrefixList { + fn from(properties: PrefixListProperties) -> PrefixList { + PrefixList { properties } } } -/// The [`AWS::EC2::SubnetCidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnetcidrblock.html) resource type. +/// The [`AWS::EC2::Route`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html) resource type. #[derive(Debug, Default)] -pub struct SubnetCidrBlock { - properties: SubnetCidrBlockProperties +pub struct Route { + properties: RouteProperties } -/// Properties for the `SubnetCidrBlock` resource. +/// Properties for the `Route` resource. #[derive(Debug, Default)] -pub struct SubnetCidrBlockProperties { - /// Property [`Ipv6CidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnetcidrblock.html#cfn-ec2-subnetcidrblock-ipv6cidrblock). +pub struct RouteProperties { + /// Property [`CarrierGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-carriergatewayid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub carrier_gateway_id: Option<::Value>, + /// Property [`DestinationCidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-destinationcidrblock). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub ipv6_cidr_block: ::Value, - /// Property [`SubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnetcidrblock.html#cfn-ec2-subnetcidrblock-subnetid). + pub destination_cidr_block: Option<::Value>, + /// Property [`DestinationIpv6CidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-destinationipv6cidrblock). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub destination_ipv6_cidr_block: Option<::Value>, + /// Property [`EgressOnlyInternetGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-egressonlyinternetgatewayid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub egress_only_internet_gateway_id: Option<::Value>, + /// Property [`GatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-gatewayid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub gateway_id: Option<::Value>, + /// Property [`InstanceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-instanceid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub instance_id: Option<::Value>, + /// Property [`LocalGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-localgatewayid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub local_gateway_id: Option<::Value>, + /// Property [`NatGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-natgatewayid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub nat_gateway_id: Option<::Value>, + /// Property [`NetworkInterfaceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-networkinterfaceid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub network_interface_id: Option<::Value>, + /// Property [`RouteTableId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-routetableid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub subnet_id: ::Value, + pub route_table_id: ::Value, + /// Property [`TransitGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-transitgatewayid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub transit_gateway_id: Option<::Value>, + /// Property [`VpcEndpointId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-vpcendpointid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub vpc_endpoint_id: Option<::Value>, + /// Property [`VpcPeeringConnectionId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-route.html#cfn-ec2-route-vpcpeeringconnectionid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub vpc_peering_connection_id: Option<::Value>, } -impl ::serde::Serialize for SubnetCidrBlockProperties { +impl ::serde::Serialize for RouteProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6CidrBlock", &self.ipv6_cidr_block)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetId", &self.subnet_id)?; - ::serde::ser::SerializeMap::end(map) - } -} - -impl<'de> ::serde::Deserialize<'de> for SubnetCidrBlockProperties { - fn deserialize>(d: D) -> Result { - struct Visitor; - - impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = SubnetCidrBlockProperties; - - fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type SubnetCidrBlockProperties") - } - - fn visit_map>(self, mut map: A) -> Result { - let mut ipv6_cidr_block: Option<::Value> = None; - let mut subnet_id: Option<::Value> = None; - - while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + if let Some(ref carrier_gateway_id) = self.carrier_gateway_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CarrierGatewayId", carrier_gateway_id)?; + } + if let Some(ref destination_cidr_block) = self.destination_cidr_block { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationCidrBlock", destination_cidr_block)?; + } + if let Some(ref destination_ipv6_cidr_block) = self.destination_ipv6_cidr_block { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationIpv6CidrBlock", destination_ipv6_cidr_block)?; + } + if let Some(ref egress_only_internet_gateway_id) = self.egress_only_internet_gateway_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EgressOnlyInternetGatewayId", egress_only_internet_gateway_id)?; + } + if let Some(ref gateway_id) = self.gateway_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GatewayId", gateway_id)?; + } + if let Some(ref instance_id) = self.instance_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceId", instance_id)?; + } + if let Some(ref local_gateway_id) = self.local_gateway_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LocalGatewayId", local_gateway_id)?; + } + if let Some(ref nat_gateway_id) = self.nat_gateway_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NatGatewayId", nat_gateway_id)?; + } + if let Some(ref network_interface_id) = self.network_interface_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaceId", network_interface_id)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RouteTableId", &self.route_table_id)?; + if let Some(ref transit_gateway_id) = self.transit_gateway_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayId", transit_gateway_id)?; + } + if let Some(ref vpc_endpoint_id) = self.vpc_endpoint_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcEndpointId", vpc_endpoint_id)?; + } + if let Some(ref vpc_peering_connection_id) = self.vpc_peering_connection_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcPeeringConnectionId", vpc_peering_connection_id)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for RouteProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = RouteProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type RouteProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut carrier_gateway_id: Option<::Value> = None; + let mut destination_cidr_block: Option<::Value> = None; + let mut destination_ipv6_cidr_block: Option<::Value> = None; + let mut egress_only_internet_gateway_id: Option<::Value> = None; + let mut gateway_id: Option<::Value> = None; + let mut instance_id: Option<::Value> = None; + let mut local_gateway_id: Option<::Value> = None; + let mut nat_gateway_id: Option<::Value> = None; + let mut network_interface_id: Option<::Value> = None; + let mut route_table_id: Option<::Value> = None; + let mut transit_gateway_id: Option<::Value> = None; + let mut vpc_endpoint_id: Option<::Value> = None; + let mut vpc_peering_connection_id: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Ipv6CidrBlock" => { - ipv6_cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; + "CarrierGatewayId" => { + carrier_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "SubnetId" => { - subnet_id = ::serde::de::MapAccess::next_value(&mut map)?; + "DestinationCidrBlock" => { + destination_cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DestinationIpv6CidrBlock" => { + destination_ipv6_cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EgressOnlyInternetGatewayId" => { + egress_only_internet_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "GatewayId" => { + gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceId" => { + instance_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LocalGatewayId" => { + local_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NatGatewayId" => { + nat_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NetworkInterfaceId" => { + network_interface_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RouteTableId" => { + route_table_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TransitGatewayId" => { + transit_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VpcEndpointId" => { + vpc_endpoint_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VpcPeeringConnectionId" => { + vpc_peering_connection_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(SubnetCidrBlockProperties { - ipv6_cidr_block: ipv6_cidr_block.ok_or(::serde::de::Error::missing_field("Ipv6CidrBlock"))?, - subnet_id: subnet_id.ok_or(::serde::de::Error::missing_field("SubnetId"))?, + Ok(RouteProperties { + carrier_gateway_id: carrier_gateway_id, + destination_cidr_block: destination_cidr_block, + destination_ipv6_cidr_block: destination_ipv6_cidr_block, + egress_only_internet_gateway_id: egress_only_internet_gateway_id, + gateway_id: gateway_id, + instance_id: instance_id, + local_gateway_id: local_gateway_id, + nat_gateway_id: nat_gateway_id, + network_interface_id: network_interface_id, + route_table_id: route_table_id.ok_or(::serde::de::Error::missing_field("RouteTableId"))?, + transit_gateway_id: transit_gateway_id, + vpc_endpoint_id: vpc_endpoint_id, + vpc_peering_connection_id: vpc_peering_connection_id, }) } } @@ -5494,85 +5556,87 @@ impl<'de> ::serde::Deserialize<'de> for SubnetCidrBlockProperties { } } -impl ::Resource for SubnetCidrBlock { - type Properties = SubnetCidrBlockProperties; - const TYPE: &'static str = "AWS::EC2::SubnetCidrBlock"; - fn properties(&self) -> &SubnetCidrBlockProperties { +impl ::Resource for Route { + type Properties = RouteProperties; + const TYPE: &'static str = "AWS::EC2::Route"; + fn properties(&self) -> &RouteProperties { &self.properties } - fn properties_mut(&mut self) -> &mut SubnetCidrBlockProperties { + fn properties_mut(&mut self) -> &mut RouteProperties { &mut self.properties } } -impl ::private::Sealed for SubnetCidrBlock {} +impl ::private::Sealed for Route {} -impl From for SubnetCidrBlock { - fn from(properties: SubnetCidrBlockProperties) -> SubnetCidrBlock { - SubnetCidrBlock { properties } +impl From for Route { + fn from(properties: RouteProperties) -> Route { + Route { properties } } } -/// The [`AWS::EC2::SubnetNetworkAclAssociation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet-network-acl-assoc.html) resource type. +/// The [`AWS::EC2::RouteTable`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-routetable.html) resource type. #[derive(Debug, Default)] -pub struct SubnetNetworkAclAssociation { - properties: SubnetNetworkAclAssociationProperties +pub struct RouteTable { + properties: RouteTableProperties } -/// Properties for the `SubnetNetworkAclAssociation` resource. +/// Properties for the `RouteTable` resource. #[derive(Debug, Default)] -pub struct SubnetNetworkAclAssociationProperties { - /// Property [`NetworkAclId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet-network-acl-assoc.html#cfn-ec2-subnetnetworkaclassociation-networkaclid). +pub struct RouteTableProperties { + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-routetable.html#cfn-ec2-routetable-tags). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub network_acl_id: ::Value, - /// Property [`SubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet-network-acl-assoc.html#cfn-ec2-subnetnetworkaclassociation-associationid). + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-routetable.html#cfn-ec2-routetable-vpcid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub subnet_id: ::Value, + pub vpc_id: ::Value, } -impl ::serde::Serialize for SubnetNetworkAclAssociationProperties { +impl ::serde::Serialize for RouteTableProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkAclId", &self.network_acl_id)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetId", &self.subnet_id)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", &self.vpc_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for SubnetNetworkAclAssociationProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for RouteTableProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = SubnetNetworkAclAssociationProperties; + type Value = RouteTableProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type SubnetNetworkAclAssociationProperties") + write!(f, "a struct of type RouteTableProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut network_acl_id: Option<::Value> = None; - let mut subnet_id: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut vpc_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "NetworkAclId" => { - network_acl_id = ::serde::de::MapAccess::next_value(&mut map)?; + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; } - "SubnetId" => { - subnet_id = ::serde::de::MapAccess::next_value(&mut map)?; + "VpcId" => { + vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(SubnetNetworkAclAssociationProperties { - network_acl_id: network_acl_id.ok_or(::serde::de::Error::missing_field("NetworkAclId"))?, - subnet_id: subnet_id.ok_or(::serde::de::Error::missing_field("SubnetId"))?, + Ok(RouteTableProperties { + tags: tags, + vpc_id: vpc_id.ok_or(::serde::de::Error::missing_field("VpcId"))?, }) } } @@ -5581,85 +5645,139 @@ impl<'de> ::serde::Deserialize<'de> for SubnetNetworkAclAssociationProperties { } } -impl ::Resource for SubnetNetworkAclAssociation { - type Properties = SubnetNetworkAclAssociationProperties; - const TYPE: &'static str = "AWS::EC2::SubnetNetworkAclAssociation"; - fn properties(&self) -> &SubnetNetworkAclAssociationProperties { +impl ::Resource for RouteTable { + type Properties = RouteTableProperties; + const TYPE: &'static str = "AWS::EC2::RouteTable"; + fn properties(&self) -> &RouteTableProperties { &self.properties } - fn properties_mut(&mut self) -> &mut SubnetNetworkAclAssociationProperties { + fn properties_mut(&mut self) -> &mut RouteTableProperties { &mut self.properties } } -impl ::private::Sealed for SubnetNetworkAclAssociation {} +impl ::private::Sealed for RouteTable {} -impl From for SubnetNetworkAclAssociation { - fn from(properties: SubnetNetworkAclAssociationProperties) -> SubnetNetworkAclAssociation { - SubnetNetworkAclAssociation { properties } +impl From for RouteTable { + fn from(properties: RouteTableProperties) -> RouteTable { + RouteTable { properties } } } -/// The [`AWS::EC2::SubnetRouteTableAssociation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet-route-table-assoc.html) resource type. +/// The [`AWS::EC2::SecurityGroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html) resource type. #[derive(Debug, Default)] -pub struct SubnetRouteTableAssociation { - properties: SubnetRouteTableAssociationProperties +pub struct SecurityGroup { + properties: SecurityGroupProperties } -/// Properties for the `SubnetRouteTableAssociation` resource. +/// Properties for the `SecurityGroup` resource. #[derive(Debug, Default)] -pub struct SubnetRouteTableAssociationProperties { - /// Property [`RouteTableId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet-route-table-assoc.html#cfn-ec2-subnetroutetableassociation-routetableid). +pub struct SecurityGroupProperties { + /// Property [`GroupDescription`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#cfn-ec2-securitygroup-groupdescription). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub group_description: ::Value, + /// Property [`GroupName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#cfn-ec2-securitygroup-groupname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub group_name: Option<::Value>, + /// Property [`SecurityGroupEgress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#cfn-ec2-securitygroup-securitygroupegress). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub route_table_id: ::Value, - /// Property [`SubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet-route-table-assoc.html#cfn-ec2-subnetroutetableassociation-subnetid). + pub security_group_egress: Option<::ValueList>, + /// Property [`SecurityGroupIngress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#cfn-ec2-securitygroup-securitygroupingress). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub security_group_ingress: Option<::ValueList>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#cfn-ec2-securitygroup-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html#cfn-ec2-securitygroup-vpcid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub subnet_id: ::Value, + pub vpc_id: Option<::Value>, } -impl ::serde::Serialize for SubnetRouteTableAssociationProperties { +impl ::serde::Serialize for SecurityGroupProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "RouteTableId", &self.route_table_id)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetId", &self.subnet_id)?; - ::serde::ser::SerializeMap::end(map) - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupDescription", &self.group_description)?; + if let Some(ref group_name) = self.group_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupName", group_name)?; + } + if let Some(ref security_group_egress) = self.security_group_egress { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityGroupEgress", security_group_egress)?; + } + if let Some(ref security_group_ingress) = self.security_group_ingress { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityGroupIngress", security_group_ingress)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + if let Some(ref vpc_id) = self.vpc_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", vpc_id)?; + } + ::serde::ser::SerializeMap::end(map) + } } -impl<'de> ::serde::Deserialize<'de> for SubnetRouteTableAssociationProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for SecurityGroupProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = SubnetRouteTableAssociationProperties; + type Value = SecurityGroupProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type SubnetRouteTableAssociationProperties") + write!(f, "a struct of type SecurityGroupProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut route_table_id: Option<::Value> = None; - let mut subnet_id: Option<::Value> = None; + let mut group_description: Option<::Value> = None; + let mut group_name: Option<::Value> = None; + let mut security_group_egress: Option<::ValueList> = None; + let mut security_group_ingress: Option<::ValueList> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut vpc_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "RouteTableId" => { - route_table_id = ::serde::de::MapAccess::next_value(&mut map)?; + "GroupDescription" => { + group_description = ::serde::de::MapAccess::next_value(&mut map)?; } - "SubnetId" => { - subnet_id = ::serde::de::MapAccess::next_value(&mut map)?; + "GroupName" => { + group_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SecurityGroupEgress" => { + security_group_egress = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SecurityGroupIngress" => { + security_group_ingress = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VpcId" => { + vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(SubnetRouteTableAssociationProperties { - route_table_id: route_table_id.ok_or(::serde::de::Error::missing_field("RouteTableId"))?, - subnet_id: subnet_id.ok_or(::serde::de::Error::missing_field("SubnetId"))?, + Ok(SecurityGroupProperties { + group_description: group_description.ok_or(::serde::de::Error::missing_field("GroupDescription"))?, + group_name: group_name, + security_group_egress: security_group_egress, + security_group_ingress: security_group_ingress, + tags: tags, + vpc_id: vpc_id, }) } } @@ -5668,102 +5786,176 @@ impl<'de> ::serde::Deserialize<'de> for SubnetRouteTableAssociationProperties { } } -impl ::Resource for SubnetRouteTableAssociation { - type Properties = SubnetRouteTableAssociationProperties; - const TYPE: &'static str = "AWS::EC2::SubnetRouteTableAssociation"; - fn properties(&self) -> &SubnetRouteTableAssociationProperties { +impl ::Resource for SecurityGroup { + type Properties = SecurityGroupProperties; + const TYPE: &'static str = "AWS::EC2::SecurityGroup"; + fn properties(&self) -> &SecurityGroupProperties { &self.properties } - fn properties_mut(&mut self) -> &mut SubnetRouteTableAssociationProperties { + fn properties_mut(&mut self) -> &mut SecurityGroupProperties { &mut self.properties } } -impl ::private::Sealed for SubnetRouteTableAssociation {} +impl ::private::Sealed for SecurityGroup {} -impl From for SubnetRouteTableAssociation { - fn from(properties: SubnetRouteTableAssociationProperties) -> SubnetRouteTableAssociation { - SubnetRouteTableAssociation { properties } +impl From for SecurityGroup { + fn from(properties: SecurityGroupProperties) -> SecurityGroup { + SecurityGroup { properties } } } -/// The [`AWS::EC2::TrafficMirrorFilter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilter.html) resource type. +/// The [`AWS::EC2::SecurityGroupEgress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html) resource type. #[derive(Debug, Default)] -pub struct TrafficMirrorFilter { - properties: TrafficMirrorFilterProperties +pub struct SecurityGroupEgress { + properties: SecurityGroupEgressProperties } -/// Properties for the `TrafficMirrorFilter` resource. +/// Properties for the `SecurityGroupEgress` resource. #[derive(Debug, Default)] -pub struct TrafficMirrorFilterProperties { - /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilter.html#cfn-ec2-trafficmirrorfilter-description). +pub struct SecurityGroupEgressProperties { + /// Property [`CidrIp`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-cidrip). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub description: Option<::Value>, - /// Property [`NetworkServices`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilter.html#cfn-ec2-trafficmirrorfilter-networkservices). + pub cidr_ip: Option<::Value>, + /// Property [`CidrIpv6`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-cidripv6). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub network_services: Option<::ValueList>, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilter.html#cfn-ec2-trafficmirrorfilter-tags). + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub cidr_ipv6: Option<::Value>, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-description). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub tags: Option<::ValueList<::Tag>>, + pub description: Option<::Value>, + /// Property [`DestinationPrefixListId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-destinationprefixlistid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub destination_prefix_list_id: Option<::Value>, + /// Property [`DestinationSecurityGroupId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-destinationsecuritygroupid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub destination_security_group_id: Option<::Value>, + /// Property [`FromPort`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-fromport). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub from_port: Option<::Value>, + /// Property [`GroupId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-groupid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub group_id: ::Value, + /// Property [`IpProtocol`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-ipprotocol). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub ip_protocol: ::Value, + /// Property [`ToPort`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-security-group-egress.html#cfn-ec2-securitygroupegress-toport). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub to_port: Option<::Value>, } -impl ::serde::Serialize for TrafficMirrorFilterProperties { +impl ::serde::Serialize for SecurityGroupEgressProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref cidr_ip) = self.cidr_ip { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CidrIp", cidr_ip)?; + } + if let Some(ref cidr_ipv6) = self.cidr_ipv6 { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CidrIpv6", cidr_ipv6)?; + } if let Some(ref description) = self.description { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; } - if let Some(ref network_services) = self.network_services { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkServices", network_services)?; + if let Some(ref destination_prefix_list_id) = self.destination_prefix_list_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationPrefixListId", destination_prefix_list_id)?; } - if let Some(ref tags) = self.tags { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + if let Some(ref destination_security_group_id) = self.destination_security_group_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationSecurityGroupId", destination_security_group_id)?; + } + if let Some(ref from_port) = self.from_port { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FromPort", from_port)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupId", &self.group_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IpProtocol", &self.ip_protocol)?; + if let Some(ref to_port) = self.to_port { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ToPort", to_port)?; } ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for TrafficMirrorFilterProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for SecurityGroupEgressProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = TrafficMirrorFilterProperties; + type Value = SecurityGroupEgressProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type TrafficMirrorFilterProperties") + write!(f, "a struct of type SecurityGroupEgressProperties") } fn visit_map>(self, mut map: A) -> Result { + let mut cidr_ip: Option<::Value> = None; + let mut cidr_ipv6: Option<::Value> = None; let mut description: Option<::Value> = None; - let mut network_services: Option<::ValueList> = None; - let mut tags: Option<::ValueList<::Tag>> = None; + let mut destination_prefix_list_id: Option<::Value> = None; + let mut destination_security_group_id: Option<::Value> = None; + let mut from_port: Option<::Value> = None; + let mut group_id: Option<::Value> = None; + let mut ip_protocol: Option<::Value> = None; + let mut to_port: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "CidrIp" => { + cidr_ip = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CidrIpv6" => { + cidr_ipv6 = ::serde::de::MapAccess::next_value(&mut map)?; + } "Description" => { description = ::serde::de::MapAccess::next_value(&mut map)?; } - "NetworkServices" => { - network_services = ::serde::de::MapAccess::next_value(&mut map)?; + "DestinationPrefixListId" => { + destination_prefix_list_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "Tags" => { - tags = ::serde::de::MapAccess::next_value(&mut map)?; + "DestinationSecurityGroupId" => { + destination_security_group_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FromPort" => { + from_port = ::serde::de::MapAccess::next_value(&mut map)?; + } + "GroupId" => { + group_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IpProtocol" => { + ip_protocol = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ToPort" => { + to_port = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(TrafficMirrorFilterProperties { + Ok(SecurityGroupEgressProperties { + cidr_ip: cidr_ip, + cidr_ipv6: cidr_ipv6, description: description, - network_services: network_services, - tags: tags, + destination_prefix_list_id: destination_prefix_list_id, + destination_security_group_id: destination_security_group_id, + from_port: from_port, + group_id: group_id.ok_or(::serde::de::Error::missing_field("GroupId"))?, + ip_protocol: ip_protocol.ok_or(::serde::de::Error::missing_field("IpProtocol"))?, + to_port: to_port, }) } } @@ -5772,181 +5964,217 @@ impl<'de> ::serde::Deserialize<'de> for TrafficMirrorFilterProperties { } } -impl ::Resource for TrafficMirrorFilter { - type Properties = TrafficMirrorFilterProperties; - const TYPE: &'static str = "AWS::EC2::TrafficMirrorFilter"; - fn properties(&self) -> &TrafficMirrorFilterProperties { +impl ::Resource for SecurityGroupEgress { + type Properties = SecurityGroupEgressProperties; + const TYPE: &'static str = "AWS::EC2::SecurityGroupEgress"; + fn properties(&self) -> &SecurityGroupEgressProperties { &self.properties } - fn properties_mut(&mut self) -> &mut TrafficMirrorFilterProperties { + fn properties_mut(&mut self) -> &mut SecurityGroupEgressProperties { &mut self.properties } } -impl ::private::Sealed for TrafficMirrorFilter {} +impl ::private::Sealed for SecurityGroupEgress {} -impl From for TrafficMirrorFilter { - fn from(properties: TrafficMirrorFilterProperties) -> TrafficMirrorFilter { - TrafficMirrorFilter { properties } +impl From for SecurityGroupEgress { + fn from(properties: SecurityGroupEgressProperties) -> SecurityGroupEgress { + SecurityGroupEgress { properties } } } -/// The [`AWS::EC2::TrafficMirrorFilterRule`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html) resource type. +/// The [`AWS::EC2::SecurityGroupIngress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html) resource type. #[derive(Debug, Default)] -pub struct TrafficMirrorFilterRule { - properties: TrafficMirrorFilterRuleProperties +pub struct SecurityGroupIngress { + properties: SecurityGroupIngressProperties } -/// Properties for the `TrafficMirrorFilterRule` resource. +/// Properties for the `SecurityGroupIngress` resource. #[derive(Debug, Default)] -pub struct TrafficMirrorFilterRuleProperties { - /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-description). +pub struct SecurityGroupIngressProperties { + /// Property [`CidrIp`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-cidrip). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub description: Option<::Value>, - /// Property [`DestinationCidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-destinationcidrblock). + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub cidr_ip: Option<::Value>, + /// Property [`CidrIpv6`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-cidripv6). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub destination_cidr_block: ::Value, - /// Property [`DestinationPortRange`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-destinationportrange). + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub cidr_ipv6: Option<::Value>, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-description). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub destination_port_range: Option<::Value>, - /// Property [`Protocol`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-protocol). + pub description: Option<::Value>, + /// Property [`FromPort`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-fromport). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub protocol: Option<::Value>, - /// Property [`RuleAction`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-ruleaction). + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub from_port: Option<::Value>, + /// Property [`GroupId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-groupid). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub rule_action: ::Value, - /// Property [`RuleNumber`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-rulenumber). + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub group_id: Option<::Value>, + /// Property [`GroupName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-groupname). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub rule_number: ::Value, - /// Property [`SourceCidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-sourcecidrblock). + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub group_name: Option<::Value>, + /// Property [`IpProtocol`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-ipprotocol). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub source_cidr_block: ::Value, - /// Property [`SourcePortRange`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-sourceportrange). + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub ip_protocol: ::Value, + /// Property [`SourcePrefixListId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-securitygroupingress-sourceprefixlistid). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub source_port_range: Option<::Value>, - /// Property [`TrafficDirection`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-trafficdirection). + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub source_prefix_list_id: Option<::Value>, + /// Property [`SourceSecurityGroupId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-sourcesecuritygroupid). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub traffic_direction: ::Value, - /// Property [`TrafficMirrorFilterId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-trafficmirrorfilterid). + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub source_security_group_id: Option<::Value>, + /// Property [`SourceSecurityGroupName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-sourcesecuritygroupname). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub traffic_mirror_filter_id: ::Value, + pub source_security_group_name: Option<::Value>, + /// Property [`SourceSecurityGroupOwnerId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-sourcesecuritygroupownerid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub source_security_group_owner_id: Option<::Value>, + /// Property [`ToPort`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html#cfn-ec2-security-group-ingress-toport). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub to_port: Option<::Value>, } -impl ::serde::Serialize for TrafficMirrorFilterRuleProperties { +impl ::serde::Serialize for SecurityGroupIngressProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref cidr_ip) = self.cidr_ip { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CidrIp", cidr_ip)?; + } + if let Some(ref cidr_ipv6) = self.cidr_ipv6 { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CidrIpv6", cidr_ipv6)?; + } if let Some(ref description) = self.description { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationCidrBlock", &self.destination_cidr_block)?; - if let Some(ref destination_port_range) = self.destination_port_range { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationPortRange", destination_port_range)?; + if let Some(ref from_port) = self.from_port { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FromPort", from_port)?; } - if let Some(ref protocol) = self.protocol { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Protocol", protocol)?; + if let Some(ref group_id) = self.group_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupId", group_id)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "RuleAction", &self.rule_action)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "RuleNumber", &self.rule_number)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourceCidrBlock", &self.source_cidr_block)?; - if let Some(ref source_port_range) = self.source_port_range { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourcePortRange", source_port_range)?; + if let Some(ref group_name) = self.group_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupName", group_name)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IpProtocol", &self.ip_protocol)?; + if let Some(ref source_prefix_list_id) = self.source_prefix_list_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourcePrefixListId", source_prefix_list_id)?; + } + if let Some(ref source_security_group_id) = self.source_security_group_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourceSecurityGroupId", source_security_group_id)?; + } + if let Some(ref source_security_group_name) = self.source_security_group_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourceSecurityGroupName", source_security_group_name)?; + } + if let Some(ref source_security_group_owner_id) = self.source_security_group_owner_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourceSecurityGroupOwnerId", source_security_group_owner_id)?; + } + if let Some(ref to_port) = self.to_port { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ToPort", to_port)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TrafficDirection", &self.traffic_direction)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TrafficMirrorFilterId", &self.traffic_mirror_filter_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for TrafficMirrorFilterRuleProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for SecurityGroupIngressProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = TrafficMirrorFilterRuleProperties; + type Value = SecurityGroupIngressProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type TrafficMirrorFilterRuleProperties") + write!(f, "a struct of type SecurityGroupIngressProperties") } fn visit_map>(self, mut map: A) -> Result { + let mut cidr_ip: Option<::Value> = None; + let mut cidr_ipv6: Option<::Value> = None; let mut description: Option<::Value> = None; - let mut destination_cidr_block: Option<::Value> = None; - let mut destination_port_range: Option<::Value> = None; - let mut protocol: Option<::Value> = None; - let mut rule_action: Option<::Value> = None; - let mut rule_number: Option<::Value> = None; - let mut source_cidr_block: Option<::Value> = None; - let mut source_port_range: Option<::Value> = None; - let mut traffic_direction: Option<::Value> = None; - let mut traffic_mirror_filter_id: Option<::Value> = None; + let mut from_port: Option<::Value> = None; + let mut group_id: Option<::Value> = None; + let mut group_name: Option<::Value> = None; + let mut ip_protocol: Option<::Value> = None; + let mut source_prefix_list_id: Option<::Value> = None; + let mut source_security_group_id: Option<::Value> = None; + let mut source_security_group_name: Option<::Value> = None; + let mut source_security_group_owner_id: Option<::Value> = None; + let mut to_port: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "CidrIp" => { + cidr_ip = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CidrIpv6" => { + cidr_ipv6 = ::serde::de::MapAccess::next_value(&mut map)?; + } "Description" => { description = ::serde::de::MapAccess::next_value(&mut map)?; } - "DestinationCidrBlock" => { - destination_cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; + "FromPort" => { + from_port = ::serde::de::MapAccess::next_value(&mut map)?; } - "DestinationPortRange" => { - destination_port_range = ::serde::de::MapAccess::next_value(&mut map)?; + "GroupId" => { + group_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "Protocol" => { - protocol = ::serde::de::MapAccess::next_value(&mut map)?; + "GroupName" => { + group_name = ::serde::de::MapAccess::next_value(&mut map)?; } - "RuleAction" => { - rule_action = ::serde::de::MapAccess::next_value(&mut map)?; + "IpProtocol" => { + ip_protocol = ::serde::de::MapAccess::next_value(&mut map)?; } - "RuleNumber" => { - rule_number = ::serde::de::MapAccess::next_value(&mut map)?; + "SourcePrefixListId" => { + source_prefix_list_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "SourceCidrBlock" => { - source_cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; + "SourceSecurityGroupId" => { + source_security_group_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "SourcePortRange" => { - source_port_range = ::serde::de::MapAccess::next_value(&mut map)?; + "SourceSecurityGroupName" => { + source_security_group_name = ::serde::de::MapAccess::next_value(&mut map)?; } - "TrafficDirection" => { - traffic_direction = ::serde::de::MapAccess::next_value(&mut map)?; + "SourceSecurityGroupOwnerId" => { + source_security_group_owner_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "TrafficMirrorFilterId" => { - traffic_mirror_filter_id = ::serde::de::MapAccess::next_value(&mut map)?; + "ToPort" => { + to_port = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(TrafficMirrorFilterRuleProperties { + Ok(SecurityGroupIngressProperties { + cidr_ip: cidr_ip, + cidr_ipv6: cidr_ipv6, description: description, - destination_cidr_block: destination_cidr_block.ok_or(::serde::de::Error::missing_field("DestinationCidrBlock"))?, - destination_port_range: destination_port_range, - protocol: protocol, - rule_action: rule_action.ok_or(::serde::de::Error::missing_field("RuleAction"))?, - rule_number: rule_number.ok_or(::serde::de::Error::missing_field("RuleNumber"))?, - source_cidr_block: source_cidr_block.ok_or(::serde::de::Error::missing_field("SourceCidrBlock"))?, - source_port_range: source_port_range, - traffic_direction: traffic_direction.ok_or(::serde::de::Error::missing_field("TrafficDirection"))?, - traffic_mirror_filter_id: traffic_mirror_filter_id.ok_or(::serde::de::Error::missing_field("TrafficMirrorFilterId"))?, + from_port: from_port, + group_id: group_id, + group_name: group_name, + ip_protocol: ip_protocol.ok_or(::serde::de::Error::missing_field("IpProtocol"))?, + source_prefix_list_id: source_prefix_list_id, + source_security_group_id: source_security_group_id, + source_security_group_name: source_security_group_name, + source_security_group_owner_id: source_security_group_owner_id, + to_port: to_port, }) } } @@ -5955,159 +6183,74 @@ impl<'de> ::serde::Deserialize<'de> for TrafficMirrorFilterRuleProperties { } } -impl ::Resource for TrafficMirrorFilterRule { - type Properties = TrafficMirrorFilterRuleProperties; - const TYPE: &'static str = "AWS::EC2::TrafficMirrorFilterRule"; - fn properties(&self) -> &TrafficMirrorFilterRuleProperties { +impl ::Resource for SecurityGroupIngress { + type Properties = SecurityGroupIngressProperties; + const TYPE: &'static str = "AWS::EC2::SecurityGroupIngress"; + fn properties(&self) -> &SecurityGroupIngressProperties { &self.properties } - fn properties_mut(&mut self) -> &mut TrafficMirrorFilterRuleProperties { + fn properties_mut(&mut self) -> &mut SecurityGroupIngressProperties { &mut self.properties } } -impl ::private::Sealed for TrafficMirrorFilterRule {} +impl ::private::Sealed for SecurityGroupIngress {} -impl From for TrafficMirrorFilterRule { - fn from(properties: TrafficMirrorFilterRuleProperties) -> TrafficMirrorFilterRule { - TrafficMirrorFilterRule { properties } +impl From for SecurityGroupIngress { + fn from(properties: SecurityGroupIngressProperties) -> SecurityGroupIngress { + SecurityGroupIngress { properties } } } -/// The [`AWS::EC2::TrafficMirrorSession`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html) resource type. +/// The [`AWS::EC2::SpotFleet`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-spotfleet.html) resource type. #[derive(Debug, Default)] -pub struct TrafficMirrorSession { - properties: TrafficMirrorSessionProperties +pub struct SpotFleet { + properties: SpotFleetProperties } -/// Properties for the `TrafficMirrorSession` resource. +/// Properties for the `SpotFleet` resource. #[derive(Debug, Default)] -pub struct TrafficMirrorSessionProperties { - /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-description). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub description: Option<::Value>, - /// Property [`NetworkInterfaceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-networkinterfaceid). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub network_interface_id: ::Value, - /// Property [`PacketLength`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-packetlength). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub packet_length: Option<::Value>, - /// Property [`SessionNumber`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-sessionnumber). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub session_number: ::Value, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-tags). +pub struct SpotFleetProperties { + /// Property [`SpotFleetRequestConfigData`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-spotfleet.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub tags: Option<::ValueList<::Tag>>, - /// Property [`TrafficMirrorFilterId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-trafficmirrorfilterid). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub traffic_mirror_filter_id: ::Value, - /// Property [`TrafficMirrorTargetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-trafficmirrortargetid). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub traffic_mirror_target_id: ::Value, - /// Property [`VirtualNetworkId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-virtualnetworkid). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub virtual_network_id: Option<::Value>, + pub spot_fleet_request_config_data: ::Value, } -impl ::serde::Serialize for TrafficMirrorSessionProperties { +impl ::serde::Serialize for SpotFleetProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref description) = self.description { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; - } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaceId", &self.network_interface_id)?; - if let Some(ref packet_length) = self.packet_length { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PacketLength", packet_length)?; - } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SessionNumber", &self.session_number)?; - if let Some(ref tags) = self.tags { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; - } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TrafficMirrorFilterId", &self.traffic_mirror_filter_id)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TrafficMirrorTargetId", &self.traffic_mirror_target_id)?; - if let Some(ref virtual_network_id) = self.virtual_network_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VirtualNetworkId", virtual_network_id)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpotFleetRequestConfigData", &self.spot_fleet_request_config_data)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for TrafficMirrorSessionProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for SpotFleetProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = TrafficMirrorSessionProperties; + type Value = SpotFleetProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type TrafficMirrorSessionProperties") + write!(f, "a struct of type SpotFleetProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut description: Option<::Value> = None; - let mut network_interface_id: Option<::Value> = None; - let mut packet_length: Option<::Value> = None; - let mut session_number: Option<::Value> = None; - let mut tags: Option<::ValueList<::Tag>> = None; - let mut traffic_mirror_filter_id: Option<::Value> = None; - let mut traffic_mirror_target_id: Option<::Value> = None; - let mut virtual_network_id: Option<::Value> = None; + let mut spot_fleet_request_config_data: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Description" => { - description = ::serde::de::MapAccess::next_value(&mut map)?; - } - "NetworkInterfaceId" => { - network_interface_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "PacketLength" => { - packet_length = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SessionNumber" => { - session_number = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Tags" => { - tags = ::serde::de::MapAccess::next_value(&mut map)?; - } - "TrafficMirrorFilterId" => { - traffic_mirror_filter_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "TrafficMirrorTargetId" => { - traffic_mirror_target_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "VirtualNetworkId" => { - virtual_network_id = ::serde::de::MapAccess::next_value(&mut map)?; + "SpotFleetRequestConfigData" => { + spot_fleet_request_config_data = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(TrafficMirrorSessionProperties { - description: description, - network_interface_id: network_interface_id.ok_or(::serde::de::Error::missing_field("NetworkInterfaceId"))?, - packet_length: packet_length, - session_number: session_number.ok_or(::serde::de::Error::missing_field("SessionNumber"))?, - tags: tags, - traffic_mirror_filter_id: traffic_mirror_filter_id.ok_or(::serde::de::Error::missing_field("TrafficMirrorFilterId"))?, - traffic_mirror_target_id: traffic_mirror_target_id.ok_or(::serde::de::Error::missing_field("TrafficMirrorTargetId"))?, - virtual_network_id: virtual_network_id, + Ok(SpotFleetProperties { + spot_fleet_request_config_data: spot_fleet_request_config_data.ok_or(::serde::de::Error::missing_field("SpotFleetRequestConfigData"))?, }) } } @@ -6116,115 +6259,217 @@ impl<'de> ::serde::Deserialize<'de> for TrafficMirrorSessionProperties { } } -impl ::Resource for TrafficMirrorSession { - type Properties = TrafficMirrorSessionProperties; - const TYPE: &'static str = "AWS::EC2::TrafficMirrorSession"; - fn properties(&self) -> &TrafficMirrorSessionProperties { +impl ::Resource for SpotFleet { + type Properties = SpotFleetProperties; + const TYPE: &'static str = "AWS::EC2::SpotFleet"; + fn properties(&self) -> &SpotFleetProperties { &self.properties } - fn properties_mut(&mut self) -> &mut TrafficMirrorSessionProperties { + fn properties_mut(&mut self) -> &mut SpotFleetProperties { &mut self.properties } } -impl ::private::Sealed for TrafficMirrorSession {} +impl ::private::Sealed for SpotFleet {} -impl From for TrafficMirrorSession { - fn from(properties: TrafficMirrorSessionProperties) -> TrafficMirrorSession { - TrafficMirrorSession { properties } +impl From for SpotFleet { + fn from(properties: SpotFleetProperties) -> SpotFleet { + SpotFleet { properties } } } -/// The [`AWS::EC2::TrafficMirrorTarget`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrortarget.html) resource type. +/// The [`AWS::EC2::Subnet`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html) resource type. #[derive(Debug, Default)] -pub struct TrafficMirrorTarget { - properties: TrafficMirrorTargetProperties +pub struct Subnet { + properties: SubnetProperties } -/// Properties for the `TrafficMirrorTarget` resource. +/// Properties for the `Subnet` resource. #[derive(Debug, Default)] -pub struct TrafficMirrorTargetProperties { - /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrortarget.html#cfn-ec2-trafficmirrortarget-description). +pub struct SubnetProperties { + /// Property [`AssignIpv6AddressOnCreation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-assignipv6addressoncreation). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub assign_ipv6_address_on_creation: Option<::Value>, + /// Property [`AvailabilityZone`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-availabilityzone). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub description: Option<::Value>, - /// Property [`NetworkInterfaceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrortarget.html#cfn-ec2-trafficmirrortarget-networkinterfaceid). + pub availability_zone: Option<::Value>, + /// Property [`AvailabilityZoneId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-availabilityzoneid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub network_interface_id: Option<::Value>, - /// Property [`NetworkLoadBalancerArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrortarget.html#cfn-ec2-trafficmirrortarget-networkloadbalancerarn). + pub availability_zone_id: Option<::Value>, + /// Property [`CidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-cidrblock). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub network_load_balancer_arn: Option<::Value>, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrortarget.html#cfn-ec2-trafficmirrortarget-tags). + pub cidr_block: Option<::Value>, + /// Property [`EnableDns64`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-enabledns64). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enable_dns64: Option<::Value>, + /// Property [`Ipv6CidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-ipv6cidrblock). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ipv6_cidr_block: Option<::Value>, + /// Property [`Ipv6Native`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-ipv6native). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub ipv6_native: Option<::Value>, + /// Property [`MapPublicIpOnLaunch`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-mappubliciponlaunch). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub map_public_ip_on_launch: Option<::Value>, + /// Property [`OutpostArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-outpostarn). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub outpost_arn: Option<::Value>, + /// Property [`PrivateDnsNameOptionsOnLaunch`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-privatednsnameoptionsonlaunch). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub private_dns_name_options_on_launch: Option<::Value<::json::Value>>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-tags). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub tags: Option<::ValueList<::Tag>>, + /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html#cfn-ec2-subnet-vpcid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub vpc_id: ::Value, } -impl ::serde::Serialize for TrafficMirrorTargetProperties { +impl ::serde::Serialize for SubnetProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref description) = self.description { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + if let Some(ref assign_ipv6_address_on_creation) = self.assign_ipv6_address_on_creation { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AssignIpv6AddressOnCreation", assign_ipv6_address_on_creation)?; } - if let Some(ref network_interface_id) = self.network_interface_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaceId", network_interface_id)?; + if let Some(ref availability_zone) = self.availability_zone { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AvailabilityZone", availability_zone)?; } - if let Some(ref network_load_balancer_arn) = self.network_load_balancer_arn { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkLoadBalancerArn", network_load_balancer_arn)?; + if let Some(ref availability_zone_id) = self.availability_zone_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AvailabilityZoneId", availability_zone_id)?; + } + if let Some(ref cidr_block) = self.cidr_block { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CidrBlock", cidr_block)?; + } + if let Some(ref enable_dns64) = self.enable_dns64 { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EnableDns64", enable_dns64)?; + } + if let Some(ref ipv6_cidr_block) = self.ipv6_cidr_block { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6CidrBlock", ipv6_cidr_block)?; + } + if let Some(ref ipv6_native) = self.ipv6_native { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6Native", ipv6_native)?; + } + if let Some(ref map_public_ip_on_launch) = self.map_public_ip_on_launch { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MapPublicIpOnLaunch", map_public_ip_on_launch)?; + } + if let Some(ref outpost_arn) = self.outpost_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OutpostArn", outpost_arn)?; + } + if let Some(ref private_dns_name_options_on_launch) = self.private_dns_name_options_on_launch { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateDnsNameOptionsOnLaunch", private_dns_name_options_on_launch)?; } if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", &self.vpc_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for TrafficMirrorTargetProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for SubnetProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = TrafficMirrorTargetProperties; + type Value = SubnetProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type TrafficMirrorTargetProperties") + write!(f, "a struct of type SubnetProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut description: Option<::Value> = None; - let mut network_interface_id: Option<::Value> = None; - let mut network_load_balancer_arn: Option<::Value> = None; + let mut assign_ipv6_address_on_creation: Option<::Value> = None; + let mut availability_zone: Option<::Value> = None; + let mut availability_zone_id: Option<::Value> = None; + let mut cidr_block: Option<::Value> = None; + let mut enable_dns64: Option<::Value> = None; + let mut ipv6_cidr_block: Option<::Value> = None; + let mut ipv6_native: Option<::Value> = None; + let mut map_public_ip_on_launch: Option<::Value> = None; + let mut outpost_arn: Option<::Value> = None; + let mut private_dns_name_options_on_launch: Option<::Value<::json::Value>> = None; let mut tags: Option<::ValueList<::Tag>> = None; + let mut vpc_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Description" => { - description = ::serde::de::MapAccess::next_value(&mut map)?; + "AssignIpv6AddressOnCreation" => { + assign_ipv6_address_on_creation = ::serde::de::MapAccess::next_value(&mut map)?; } - "NetworkInterfaceId" => { - network_interface_id = ::serde::de::MapAccess::next_value(&mut map)?; + "AvailabilityZone" => { + availability_zone = ::serde::de::MapAccess::next_value(&mut map)?; } - "NetworkLoadBalancerArn" => { - network_load_balancer_arn = ::serde::de::MapAccess::next_value(&mut map)?; + "AvailabilityZoneId" => { + availability_zone_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CidrBlock" => { + cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EnableDns64" => { + enable_dns64 = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Ipv6CidrBlock" => { + ipv6_cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Ipv6Native" => { + ipv6_native = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MapPublicIpOnLaunch" => { + map_public_ip_on_launch = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OutpostArn" => { + outpost_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PrivateDnsNameOptionsOnLaunch" => { + private_dns_name_options_on_launch = ::serde::de::MapAccess::next_value(&mut map)?; } "Tags" => { tags = ::serde::de::MapAccess::next_value(&mut map)?; } + "VpcId" => { + vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } - Ok(TrafficMirrorTargetProperties { - description: description, - network_interface_id: network_interface_id, - network_load_balancer_arn: network_load_balancer_arn, + Ok(SubnetProperties { + assign_ipv6_address_on_creation: assign_ipv6_address_on_creation, + availability_zone: availability_zone, + availability_zone_id: availability_zone_id, + cidr_block: cidr_block, + enable_dns64: enable_dns64, + ipv6_cidr_block: ipv6_cidr_block, + ipv6_native: ipv6_native, + map_public_ip_on_launch: map_public_ip_on_launch, + outpost_arn: outpost_arn, + private_dns_name_options_on_launch: private_dns_name_options_on_launch, tags: tags, + vpc_id: vpc_id.ok_or(::serde::de::Error::missing_field("VpcId"))?, }) } } @@ -6233,180 +6478,85 @@ impl<'de> ::serde::Deserialize<'de> for TrafficMirrorTargetProperties { } } -impl ::Resource for TrafficMirrorTarget { - type Properties = TrafficMirrorTargetProperties; - const TYPE: &'static str = "AWS::EC2::TrafficMirrorTarget"; - fn properties(&self) -> &TrafficMirrorTargetProperties { +impl ::Resource for Subnet { + type Properties = SubnetProperties; + const TYPE: &'static str = "AWS::EC2::Subnet"; + fn properties(&self) -> &SubnetProperties { &self.properties } - fn properties_mut(&mut self) -> &mut TrafficMirrorTargetProperties { + fn properties_mut(&mut self) -> &mut SubnetProperties { &mut self.properties } } -impl ::private::Sealed for TrafficMirrorTarget {} +impl ::private::Sealed for Subnet {} -impl From for TrafficMirrorTarget { - fn from(properties: TrafficMirrorTargetProperties) -> TrafficMirrorTarget { - TrafficMirrorTarget { properties } +impl From for Subnet { + fn from(properties: SubnetProperties) -> Subnet { + Subnet { properties } } } -/// The [`AWS::EC2::TransitGateway`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html) resource type. +/// The [`AWS::EC2::SubnetCidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnetcidrblock.html) resource type. #[derive(Debug, Default)] -pub struct TransitGateway { - properties: TransitGatewayProperties +pub struct SubnetCidrBlock { + properties: SubnetCidrBlockProperties } -/// Properties for the `TransitGateway` resource. +/// Properties for the `SubnetCidrBlock` resource. #[derive(Debug, Default)] -pub struct TransitGatewayProperties { - /// Property [`AmazonSideAsn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-amazonsideasn). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub amazon_side_asn: Option<::Value>, - /// Property [`AutoAcceptSharedAttachments`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-autoacceptsharedattachments). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub auto_accept_shared_attachments: Option<::Value>, - /// Property [`DefaultRouteTableAssociation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-defaultroutetableassociation). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub default_route_table_association: Option<::Value>, - /// Property [`DefaultRouteTablePropagation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-defaultroutetablepropagation). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub default_route_table_propagation: Option<::Value>, - /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-description). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub description: Option<::Value>, - /// Property [`DnsSupport`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-dnssupport). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub dns_support: Option<::Value>, - /// Property [`MulticastSupport`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-multicastsupport). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub multicast_support: Option<::Value>, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-tags). +pub struct SubnetCidrBlockProperties { + /// Property [`Ipv6CidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnetcidrblock.html#cfn-ec2-subnetcidrblock-ipv6cidrblock). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub tags: Option<::ValueList<::Tag>>, - /// Property [`VpnEcmpSupport`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-vpnecmpsupport). + pub ipv6_cidr_block: ::Value, + /// Property [`SubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnetcidrblock.html#cfn-ec2-subnetcidrblock-subnetid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub vpn_ecmp_support: Option<::Value>, + pub subnet_id: ::Value, } -impl ::serde::Serialize for TransitGatewayProperties { +impl ::serde::Serialize for SubnetCidrBlockProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref amazon_side_asn) = self.amazon_side_asn { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AmazonSideAsn", amazon_side_asn)?; - } - if let Some(ref auto_accept_shared_attachments) = self.auto_accept_shared_attachments { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AutoAcceptSharedAttachments", auto_accept_shared_attachments)?; - } - if let Some(ref default_route_table_association) = self.default_route_table_association { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DefaultRouteTableAssociation", default_route_table_association)?; - } - if let Some(ref default_route_table_propagation) = self.default_route_table_propagation { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DefaultRouteTablePropagation", default_route_table_propagation)?; - } - if let Some(ref description) = self.description { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; - } - if let Some(ref dns_support) = self.dns_support { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DnsSupport", dns_support)?; - } - if let Some(ref multicast_support) = self.multicast_support { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "MulticastSupport", multicast_support)?; - } - if let Some(ref tags) = self.tags { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; - } - if let Some(ref vpn_ecmp_support) = self.vpn_ecmp_support { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpnEcmpSupport", vpn_ecmp_support)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6CidrBlock", &self.ipv6_cidr_block)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetId", &self.subnet_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for TransitGatewayProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for SubnetCidrBlockProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = TransitGatewayProperties; + type Value = SubnetCidrBlockProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type TransitGatewayProperties") + write!(f, "a struct of type SubnetCidrBlockProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut amazon_side_asn: Option<::Value> = None; - let mut auto_accept_shared_attachments: Option<::Value> = None; - let mut default_route_table_association: Option<::Value> = None; - let mut default_route_table_propagation: Option<::Value> = None; - let mut description: Option<::Value> = None; - let mut dns_support: Option<::Value> = None; - let mut multicast_support: Option<::Value> = None; - let mut tags: Option<::ValueList<::Tag>> = None; - let mut vpn_ecmp_support: Option<::Value> = None; + let mut ipv6_cidr_block: Option<::Value> = None; + let mut subnet_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "AmazonSideAsn" => { - amazon_side_asn = ::serde::de::MapAccess::next_value(&mut map)?; - } - "AutoAcceptSharedAttachments" => { - auto_accept_shared_attachments = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DefaultRouteTableAssociation" => { - default_route_table_association = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DefaultRouteTablePropagation" => { - default_route_table_propagation = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Description" => { - description = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DnsSupport" => { - dns_support = ::serde::de::MapAccess::next_value(&mut map)?; - } - "MulticastSupport" => { - multicast_support = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Tags" => { - tags = ::serde::de::MapAccess::next_value(&mut map)?; + "Ipv6CidrBlock" => { + ipv6_cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; } - "VpnEcmpSupport" => { - vpn_ecmp_support = ::serde::de::MapAccess::next_value(&mut map)?; + "SubnetId" => { + subnet_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(TransitGatewayProperties { - amazon_side_asn: amazon_side_asn, - auto_accept_shared_attachments: auto_accept_shared_attachments, - default_route_table_association: default_route_table_association, - default_route_table_propagation: default_route_table_propagation, - description: description, - dns_support: dns_support, - multicast_support: multicast_support, - tags: tags, - vpn_ecmp_support: vpn_ecmp_support, + Ok(SubnetCidrBlockProperties { + ipv6_cidr_block: ipv6_cidr_block.ok_or(::serde::de::Error::missing_field("Ipv6CidrBlock"))?, + subnet_id: subnet_id.ok_or(::serde::de::Error::missing_field("SubnetId"))?, }) } } @@ -6415,109 +6565,85 @@ impl<'de> ::serde::Deserialize<'de> for TransitGatewayProperties { } } -impl ::Resource for TransitGateway { - type Properties = TransitGatewayProperties; - const TYPE: &'static str = "AWS::EC2::TransitGateway"; - fn properties(&self) -> &TransitGatewayProperties { +impl ::Resource for SubnetCidrBlock { + type Properties = SubnetCidrBlockProperties; + const TYPE: &'static str = "AWS::EC2::SubnetCidrBlock"; + fn properties(&self) -> &SubnetCidrBlockProperties { &self.properties } - fn properties_mut(&mut self) -> &mut TransitGatewayProperties { + fn properties_mut(&mut self) -> &mut SubnetCidrBlockProperties { &mut self.properties } } -impl ::private::Sealed for TransitGateway {} +impl ::private::Sealed for SubnetCidrBlock {} -impl From for TransitGateway { - fn from(properties: TransitGatewayProperties) -> TransitGateway { - TransitGateway { properties } +impl From for SubnetCidrBlock { + fn from(properties: SubnetCidrBlockProperties) -> SubnetCidrBlock { + SubnetCidrBlock { properties } } } -/// The [`AWS::EC2::TransitGatewayAttachment`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayattachment.html) resource type. +/// The [`AWS::EC2::SubnetNetworkAclAssociation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet-network-acl-assoc.html) resource type. #[derive(Debug, Default)] -pub struct TransitGatewayAttachment { - properties: TransitGatewayAttachmentProperties +pub struct SubnetNetworkAclAssociation { + properties: SubnetNetworkAclAssociationProperties } -/// Properties for the `TransitGatewayAttachment` resource. +/// Properties for the `SubnetNetworkAclAssociation` resource. #[derive(Debug, Default)] -pub struct TransitGatewayAttachmentProperties { - /// Property [`SubnetIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayattachment.html#cfn-ec2-transitgatewayattachment-subnetids). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub subnet_ids: ::ValueList, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayattachment.html#cfn-ec2-transitgatewayattachment-tags). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub tags: Option<::ValueList<::Tag>>, - /// Property [`TransitGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayattachment.html#cfn-ec2-transitgatewayattachment-transitgatewayid). +pub struct SubnetNetworkAclAssociationProperties { + /// Property [`NetworkAclId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet-network-acl-assoc.html#cfn-ec2-subnetnetworkaclassociation-networkaclid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub transit_gateway_id: ::Value, - /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayattachment.html#cfn-ec2-transitgatewayattachment-vpcid). + pub network_acl_id: ::Value, + /// Property [`SubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet-network-acl-assoc.html#cfn-ec2-subnetnetworkaclassociation-associationid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub vpc_id: ::Value, + pub subnet_id: ::Value, } -impl ::serde::Serialize for TransitGatewayAttachmentProperties { +impl ::serde::Serialize for SubnetNetworkAclAssociationProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetIds", &self.subnet_ids)?; - if let Some(ref tags) = self.tags { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; - } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayId", &self.transit_gateway_id)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", &self.vpc_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkAclId", &self.network_acl_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetId", &self.subnet_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for TransitGatewayAttachmentProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for SubnetNetworkAclAssociationProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = TransitGatewayAttachmentProperties; + type Value = SubnetNetworkAclAssociationProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type TransitGatewayAttachmentProperties") + write!(f, "a struct of type SubnetNetworkAclAssociationProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut subnet_ids: Option<::ValueList> = None; - let mut tags: Option<::ValueList<::Tag>> = None; - let mut transit_gateway_id: Option<::Value> = None; - let mut vpc_id: Option<::Value> = None; + let mut network_acl_id: Option<::Value> = None; + let mut subnet_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "SubnetIds" => { - subnet_ids = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Tags" => { - tags = ::serde::de::MapAccess::next_value(&mut map)?; - } - "TransitGatewayId" => { - transit_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; + "NetworkAclId" => { + network_acl_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "VpcId" => { - vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; + "SubnetId" => { + subnet_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(TransitGatewayAttachmentProperties { - subnet_ids: subnet_ids.ok_or(::serde::de::Error::missing_field("SubnetIds"))?, - tags: tags, - transit_gateway_id: transit_gateway_id.ok_or(::serde::de::Error::missing_field("TransitGatewayId"))?, - vpc_id: vpc_id.ok_or(::serde::de::Error::missing_field("VpcId"))?, + Ok(SubnetNetworkAclAssociationProperties { + network_acl_id: network_acl_id.ok_or(::serde::de::Error::missing_field("NetworkAclId"))?, + subnet_id: subnet_id.ok_or(::serde::de::Error::missing_field("SubnetId"))?, }) } } @@ -6526,98 +6652,85 @@ impl<'de> ::serde::Deserialize<'de> for TransitGatewayAttachmentProperties { } } -impl ::Resource for TransitGatewayAttachment { - type Properties = TransitGatewayAttachmentProperties; - const TYPE: &'static str = "AWS::EC2::TransitGatewayAttachment"; - fn properties(&self) -> &TransitGatewayAttachmentProperties { +impl ::Resource for SubnetNetworkAclAssociation { + type Properties = SubnetNetworkAclAssociationProperties; + const TYPE: &'static str = "AWS::EC2::SubnetNetworkAclAssociation"; + fn properties(&self) -> &SubnetNetworkAclAssociationProperties { &self.properties } - fn properties_mut(&mut self) -> &mut TransitGatewayAttachmentProperties { + fn properties_mut(&mut self) -> &mut SubnetNetworkAclAssociationProperties { &mut self.properties } } -impl ::private::Sealed for TransitGatewayAttachment {} +impl ::private::Sealed for SubnetNetworkAclAssociation {} -impl From for TransitGatewayAttachment { - fn from(properties: TransitGatewayAttachmentProperties) -> TransitGatewayAttachment { - TransitGatewayAttachment { properties } +impl From for SubnetNetworkAclAssociation { + fn from(properties: SubnetNetworkAclAssociationProperties) -> SubnetNetworkAclAssociation { + SubnetNetworkAclAssociation { properties } } } -/// The [`AWS::EC2::TransitGatewayConnect`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayconnect.html) resource type. +/// The [`AWS::EC2::SubnetRouteTableAssociation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnetroutetableassociation.html) resource type. #[derive(Debug, Default)] -pub struct TransitGatewayConnect { - properties: TransitGatewayConnectProperties +pub struct SubnetRouteTableAssociation { + properties: SubnetRouteTableAssociationProperties } -/// Properties for the `TransitGatewayConnect` resource. +/// Properties for the `SubnetRouteTableAssociation` resource. #[derive(Debug, Default)] -pub struct TransitGatewayConnectProperties { - /// Property [`Options`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayconnect.html#cfn-ec2-transitgatewayconnect-options). +pub struct SubnetRouteTableAssociationProperties { + /// Property [`RouteTableId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnetroutetableassociation.html#cfn-ec2-subnetroutetableassociation-routetableid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub options: ::Value, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayconnect.html#cfn-ec2-transitgatewayconnect-tags). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub tags: Option<::ValueList<::Tag>>, - /// Property [`TransportTransitGatewayAttachmentId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayconnect.html#cfn-ec2-transitgatewayconnect-transporttransitgatewayattachmentid). + pub route_table_id: ::Value, + /// Property [`SubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnetroutetableassociation.html#cfn-ec2-subnetroutetableassociation-subnetid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub transport_transit_gateway_attachment_id: ::Value, + pub subnet_id: ::Value, } -impl ::serde::Serialize for TransitGatewayConnectProperties { +impl ::serde::Serialize for SubnetRouteTableAssociationProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Options", &self.options)?; - if let Some(ref tags) = self.tags { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; - } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransportTransitGatewayAttachmentId", &self.transport_transit_gateway_attachment_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RouteTableId", &self.route_table_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetId", &self.subnet_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for TransitGatewayConnectProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for SubnetRouteTableAssociationProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = TransitGatewayConnectProperties; + type Value = SubnetRouteTableAssociationProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type TransitGatewayConnectProperties") + write!(f, "a struct of type SubnetRouteTableAssociationProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut options: Option<::Value> = None; - let mut tags: Option<::ValueList<::Tag>> = None; - let mut transport_transit_gateway_attachment_id: Option<::Value> = None; + let mut route_table_id: Option<::Value> = None; + let mut subnet_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Options" => { - options = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Tags" => { - tags = ::serde::de::MapAccess::next_value(&mut map)?; + "RouteTableId" => { + route_table_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "TransportTransitGatewayAttachmentId" => { - transport_transit_gateway_attachment_id = ::serde::de::MapAccess::next_value(&mut map)?; + "SubnetId" => { + subnet_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(TransitGatewayConnectProperties { - options: options.ok_or(::serde::de::Error::missing_field("Options"))?, - tags: tags, - transport_transit_gateway_attachment_id: transport_transit_gateway_attachment_id.ok_or(::serde::de::Error::missing_field("TransportTransitGatewayAttachmentId"))?, + Ok(SubnetRouteTableAssociationProperties { + route_table_id: route_table_id.ok_or(::serde::de::Error::missing_field("RouteTableId"))?, + subnet_id: subnet_id.ok_or(::serde::de::Error::missing_field("SubnetId"))?, }) } } @@ -6626,100 +6739,102 @@ impl<'de> ::serde::Deserialize<'de> for TransitGatewayConnectProperties { } } -impl ::Resource for TransitGatewayConnect { - type Properties = TransitGatewayConnectProperties; - const TYPE: &'static str = "AWS::EC2::TransitGatewayConnect"; - fn properties(&self) -> &TransitGatewayConnectProperties { +impl ::Resource for SubnetRouteTableAssociation { + type Properties = SubnetRouteTableAssociationProperties; + const TYPE: &'static str = "AWS::EC2::SubnetRouteTableAssociation"; + fn properties(&self) -> &SubnetRouteTableAssociationProperties { &self.properties } - fn properties_mut(&mut self) -> &mut TransitGatewayConnectProperties { + fn properties_mut(&mut self) -> &mut SubnetRouteTableAssociationProperties { &mut self.properties } } -impl ::private::Sealed for TransitGatewayConnect {} +impl ::private::Sealed for SubnetRouteTableAssociation {} -impl From for TransitGatewayConnect { - fn from(properties: TransitGatewayConnectProperties) -> TransitGatewayConnect { - TransitGatewayConnect { properties } +impl From for SubnetRouteTableAssociation { + fn from(properties: SubnetRouteTableAssociationProperties) -> SubnetRouteTableAssociation { + SubnetRouteTableAssociation { properties } } } -/// The [`AWS::EC2::TransitGatewayMulticastDomain`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomain.html) resource type. +/// The [`AWS::EC2::TrafficMirrorFilter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilter.html) resource type. #[derive(Debug, Default)] -pub struct TransitGatewayMulticastDomain { - properties: TransitGatewayMulticastDomainProperties +pub struct TrafficMirrorFilter { + properties: TrafficMirrorFilterProperties } -/// Properties for the `TransitGatewayMulticastDomain` resource. +/// Properties for the `TrafficMirrorFilter` resource. #[derive(Debug, Default)] -pub struct TransitGatewayMulticastDomainProperties { - /// Property [`Options`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomain.html#cfn-ec2-transitgatewaymulticastdomain-options). +pub struct TrafficMirrorFilterProperties { + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilter.html#cfn-ec2-trafficmirrorfilter-description). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub description: Option<::Value>, + /// Property [`NetworkServices`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilter.html#cfn-ec2-trafficmirrorfilter-networkservices). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub options: Option<::Value<::json::Value>>, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomain.html#cfn-ec2-transitgatewaymulticastdomain-tags). + pub network_services: Option<::ValueList>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilter.html#cfn-ec2-trafficmirrorfilter-tags). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub tags: Option<::ValueList<::Tag>>, - /// Property [`TransitGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomain.html#cfn-ec2-transitgatewaymulticastdomain-transitgatewayid). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub transit_gateway_id: ::Value, } -impl ::serde::Serialize for TransitGatewayMulticastDomainProperties { +impl ::serde::Serialize for TrafficMirrorFilterProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref options) = self.options { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Options", options)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + if let Some(ref network_services) = self.network_services { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkServices", network_services)?; } if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayId", &self.transit_gateway_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for TransitGatewayMulticastDomainProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for TrafficMirrorFilterProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = TransitGatewayMulticastDomainProperties; + type Value = TrafficMirrorFilterProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type TransitGatewayMulticastDomainProperties") + write!(f, "a struct of type TrafficMirrorFilterProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut options: Option<::Value<::json::Value>> = None; + let mut description: Option<::Value> = None; + let mut network_services: Option<::ValueList> = None; let mut tags: Option<::ValueList<::Tag>> = None; - let mut transit_gateway_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Options" => { - options = ::serde::de::MapAccess::next_value(&mut map)?; + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NetworkServices" => { + network_services = ::serde::de::MapAccess::next_value(&mut map)?; } "Tags" => { tags = ::serde::de::MapAccess::next_value(&mut map)?; } - "TransitGatewayId" => { - transit_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; - } _ => {} } } - Ok(TransitGatewayMulticastDomainProperties { - options: options, + Ok(TrafficMirrorFilterProperties { + description: description, + network_services: network_services, tags: tags, - transit_gateway_id: transit_gateway_id.ok_or(::serde::de::Error::missing_field("TransitGatewayId"))?, }) } } @@ -6728,96 +6843,181 @@ impl<'de> ::serde::Deserialize<'de> for TransitGatewayMulticastDomainProperties } } -impl ::Resource for TransitGatewayMulticastDomain { - type Properties = TransitGatewayMulticastDomainProperties; - const TYPE: &'static str = "AWS::EC2::TransitGatewayMulticastDomain"; - fn properties(&self) -> &TransitGatewayMulticastDomainProperties { +impl ::Resource for TrafficMirrorFilter { + type Properties = TrafficMirrorFilterProperties; + const TYPE: &'static str = "AWS::EC2::TrafficMirrorFilter"; + fn properties(&self) -> &TrafficMirrorFilterProperties { &self.properties } - fn properties_mut(&mut self) -> &mut TransitGatewayMulticastDomainProperties { + fn properties_mut(&mut self) -> &mut TrafficMirrorFilterProperties { &mut self.properties } } -impl ::private::Sealed for TransitGatewayMulticastDomain {} +impl ::private::Sealed for TrafficMirrorFilter {} -impl From for TransitGatewayMulticastDomain { - fn from(properties: TransitGatewayMulticastDomainProperties) -> TransitGatewayMulticastDomain { - TransitGatewayMulticastDomain { properties } +impl From for TrafficMirrorFilter { + fn from(properties: TrafficMirrorFilterProperties) -> TrafficMirrorFilter { + TrafficMirrorFilter { properties } } } -/// The [`AWS::EC2::TransitGatewayMulticastDomainAssociation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomainassociation.html) resource type. +/// The [`AWS::EC2::TrafficMirrorFilterRule`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html) resource type. #[derive(Debug, Default)] -pub struct TransitGatewayMulticastDomainAssociation { - properties: TransitGatewayMulticastDomainAssociationProperties +pub struct TrafficMirrorFilterRule { + properties: TrafficMirrorFilterRuleProperties } -/// Properties for the `TransitGatewayMulticastDomainAssociation` resource. +/// Properties for the `TrafficMirrorFilterRule` resource. #[derive(Debug, Default)] -pub struct TransitGatewayMulticastDomainAssociationProperties { - /// Property [`SubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomainassociation.html#cfn-ec2-transitgatewaymulticastdomainassociation-subnetid). +pub struct TrafficMirrorFilterRuleProperties { + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-description). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub subnet_id: ::Value, - /// Property [`TransitGatewayAttachmentId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomainassociation.html#cfn-ec2-transitgatewaymulticastdomainassociation-transitgatewayattachmentid). + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`DestinationCidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-destinationcidrblock). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub transit_gateway_attachment_id: ::Value, - /// Property [`TransitGatewayMulticastDomainId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomainassociation.html#cfn-ec2-transitgatewaymulticastdomainassociation-transitgatewaymulticastdomainid). + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub destination_cidr_block: ::Value, + /// Property [`DestinationPortRange`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-destinationportrange). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub destination_port_range: Option<::Value>, + /// Property [`Protocol`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-protocol). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub protocol: Option<::Value>, + /// Property [`RuleAction`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-ruleaction). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub rule_action: ::Value, + /// Property [`RuleNumber`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-rulenumber). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub rule_number: ::Value, + /// Property [`SourceCidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-sourcecidrblock). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub source_cidr_block: ::Value, + /// Property [`SourcePortRange`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-sourceportrange). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub source_port_range: Option<::Value>, + /// Property [`TrafficDirection`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-trafficdirection). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub traffic_direction: ::Value, + /// Property [`TrafficMirrorFilterId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorfilterrule.html#cfn-ec2-trafficmirrorfilterrule-trafficmirrorfilterid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub transit_gateway_multicast_domain_id: ::Value, + pub traffic_mirror_filter_id: ::Value, } -impl ::serde::Serialize for TransitGatewayMulticastDomainAssociationProperties { +impl ::serde::Serialize for TrafficMirrorFilterRuleProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetId", &self.subnet_id)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayAttachmentId", &self.transit_gateway_attachment_id)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayMulticastDomainId", &self.transit_gateway_multicast_domain_id)?; - ::serde::ser::SerializeMap::end(map) - } -} - -impl<'de> ::serde::Deserialize<'de> for TransitGatewayMulticastDomainAssociationProperties { - fn deserialize>(d: D) -> Result { - struct Visitor; - - impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = TransitGatewayMulticastDomainAssociationProperties; - - fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type TransitGatewayMulticastDomainAssociationProperties") - } - - fn visit_map>(self, mut map: A) -> Result { - let mut subnet_id: Option<::Value> = None; - let mut transit_gateway_attachment_id: Option<::Value> = None; - let mut transit_gateway_multicast_domain_id: Option<::Value> = None; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationCidrBlock", &self.destination_cidr_block)?; + if let Some(ref destination_port_range) = self.destination_port_range { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationPortRange", destination_port_range)?; + } + if let Some(ref protocol) = self.protocol { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Protocol", protocol)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RuleAction", &self.rule_action)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RuleNumber", &self.rule_number)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourceCidrBlock", &self.source_cidr_block)?; + if let Some(ref source_port_range) = self.source_port_range { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourcePortRange", source_port_range)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TrafficDirection", &self.traffic_direction)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TrafficMirrorFilterId", &self.traffic_mirror_filter_id)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for TrafficMirrorFilterRuleProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = TrafficMirrorFilterRuleProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type TrafficMirrorFilterRuleProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut description: Option<::Value> = None; + let mut destination_cidr_block: Option<::Value> = None; + let mut destination_port_range: Option<::Value> = None; + let mut protocol: Option<::Value> = None; + let mut rule_action: Option<::Value> = None; + let mut rule_number: Option<::Value> = None; + let mut source_cidr_block: Option<::Value> = None; + let mut source_port_range: Option<::Value> = None; + let mut traffic_direction: Option<::Value> = None; + let mut traffic_mirror_filter_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "SubnetId" => { - subnet_id = ::serde::de::MapAccess::next_value(&mut map)?; + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; } - "TransitGatewayAttachmentId" => { - transit_gateway_attachment_id = ::serde::de::MapAccess::next_value(&mut map)?; + "DestinationCidrBlock" => { + destination_cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; } - "TransitGatewayMulticastDomainId" => { - transit_gateway_multicast_domain_id = ::serde::de::MapAccess::next_value(&mut map)?; + "DestinationPortRange" => { + destination_port_range = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Protocol" => { + protocol = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RuleAction" => { + rule_action = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RuleNumber" => { + rule_number = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SourceCidrBlock" => { + source_cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SourcePortRange" => { + source_port_range = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TrafficDirection" => { + traffic_direction = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TrafficMirrorFilterId" => { + traffic_mirror_filter_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(TransitGatewayMulticastDomainAssociationProperties { - subnet_id: subnet_id.ok_or(::serde::de::Error::missing_field("SubnetId"))?, - transit_gateway_attachment_id: transit_gateway_attachment_id.ok_or(::serde::de::Error::missing_field("TransitGatewayAttachmentId"))?, - transit_gateway_multicast_domain_id: transit_gateway_multicast_domain_id.ok_or(::serde::de::Error::missing_field("TransitGatewayMulticastDomainId"))?, + Ok(TrafficMirrorFilterRuleProperties { + description: description, + destination_cidr_block: destination_cidr_block.ok_or(::serde::de::Error::missing_field("DestinationCidrBlock"))?, + destination_port_range: destination_port_range, + protocol: protocol, + rule_action: rule_action.ok_or(::serde::de::Error::missing_field("RuleAction"))?, + rule_number: rule_number.ok_or(::serde::de::Error::missing_field("RuleNumber"))?, + source_cidr_block: source_cidr_block.ok_or(::serde::de::Error::missing_field("SourceCidrBlock"))?, + source_port_range: source_port_range, + traffic_direction: traffic_direction.ok_or(::serde::de::Error::missing_field("TrafficDirection"))?, + traffic_mirror_filter_id: traffic_mirror_filter_id.ok_or(::serde::de::Error::missing_field("TrafficMirrorFilterId"))?, }) } } @@ -6826,96 +7026,159 @@ impl<'de> ::serde::Deserialize<'de> for TransitGatewayMulticastDomainAssociation } } -impl ::Resource for TransitGatewayMulticastDomainAssociation { - type Properties = TransitGatewayMulticastDomainAssociationProperties; - const TYPE: &'static str = "AWS::EC2::TransitGatewayMulticastDomainAssociation"; - fn properties(&self) -> &TransitGatewayMulticastDomainAssociationProperties { +impl ::Resource for TrafficMirrorFilterRule { + type Properties = TrafficMirrorFilterRuleProperties; + const TYPE: &'static str = "AWS::EC2::TrafficMirrorFilterRule"; + fn properties(&self) -> &TrafficMirrorFilterRuleProperties { &self.properties } - fn properties_mut(&mut self) -> &mut TransitGatewayMulticastDomainAssociationProperties { + fn properties_mut(&mut self) -> &mut TrafficMirrorFilterRuleProperties { &mut self.properties } } -impl ::private::Sealed for TransitGatewayMulticastDomainAssociation {} +impl ::private::Sealed for TrafficMirrorFilterRule {} -impl From for TransitGatewayMulticastDomainAssociation { - fn from(properties: TransitGatewayMulticastDomainAssociationProperties) -> TransitGatewayMulticastDomainAssociation { - TransitGatewayMulticastDomainAssociation { properties } +impl From for TrafficMirrorFilterRule { + fn from(properties: TrafficMirrorFilterRuleProperties) -> TrafficMirrorFilterRule { + TrafficMirrorFilterRule { properties } } } -/// The [`AWS::EC2::TransitGatewayMulticastGroupMember`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupmember.html) resource type. +/// The [`AWS::EC2::TrafficMirrorSession`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html) resource type. #[derive(Debug, Default)] -pub struct TransitGatewayMulticastGroupMember { - properties: TransitGatewayMulticastGroupMemberProperties +pub struct TrafficMirrorSession { + properties: TrafficMirrorSessionProperties } -/// Properties for the `TransitGatewayMulticastGroupMember` resource. +/// Properties for the `TrafficMirrorSession` resource. #[derive(Debug, Default)] -pub struct TransitGatewayMulticastGroupMemberProperties { - /// Property [`GroupIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupmember.html#cfn-ec2-transitgatewaymulticastgroupmember-groupipaddress). +pub struct TrafficMirrorSessionProperties { + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-description). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub group_ip_address: ::Value, - /// Property [`NetworkInterfaceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupmember.html#cfn-ec2-transitgatewaymulticastgroupmember-networkinterfaceid). + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`NetworkInterfaceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-networkinterfaceid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub network_interface_id: ::Value, - /// Property [`TransitGatewayMulticastDomainId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupmember.html#cfn-ec2-transitgatewaymulticastgroupmember-transitgatewaymulticastdomainid). + /// Property [`PacketLength`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-packetlength). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub transit_gateway_multicast_domain_id: ::Value, + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub packet_length: Option<::Value>, + /// Property [`SessionNumber`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-sessionnumber). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub session_number: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`TrafficMirrorFilterId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-trafficmirrorfilterid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub traffic_mirror_filter_id: ::Value, + /// Property [`TrafficMirrorTargetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-trafficmirrortargetid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub traffic_mirror_target_id: ::Value, + /// Property [`VirtualNetworkId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrorsession.html#cfn-ec2-trafficmirrorsession-virtualnetworkid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub virtual_network_id: Option<::Value>, } -impl ::serde::Serialize for TransitGatewayMulticastGroupMemberProperties { +impl ::serde::Serialize for TrafficMirrorSessionProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupIpAddress", &self.group_ip_address)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaceId", &self.network_interface_id)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayMulticastDomainId", &self.transit_gateway_multicast_domain_id)?; + if let Some(ref packet_length) = self.packet_length { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PacketLength", packet_length)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SessionNumber", &self.session_number)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TrafficMirrorFilterId", &self.traffic_mirror_filter_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TrafficMirrorTargetId", &self.traffic_mirror_target_id)?; + if let Some(ref virtual_network_id) = self.virtual_network_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VirtualNetworkId", virtual_network_id)?; + } ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for TransitGatewayMulticastGroupMemberProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for TrafficMirrorSessionProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = TransitGatewayMulticastGroupMemberProperties; + type Value = TrafficMirrorSessionProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type TransitGatewayMulticastGroupMemberProperties") + write!(f, "a struct of type TrafficMirrorSessionProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut group_ip_address: Option<::Value> = None; + let mut description: Option<::Value> = None; let mut network_interface_id: Option<::Value> = None; - let mut transit_gateway_multicast_domain_id: Option<::Value> = None; + let mut packet_length: Option<::Value> = None; + let mut session_number: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut traffic_mirror_filter_id: Option<::Value> = None; + let mut traffic_mirror_target_id: Option<::Value> = None; + let mut virtual_network_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "GroupIpAddress" => { - group_ip_address = ::serde::de::MapAccess::next_value(&mut map)?; + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; } "NetworkInterfaceId" => { network_interface_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "TransitGatewayMulticastDomainId" => { - transit_gateway_multicast_domain_id = ::serde::de::MapAccess::next_value(&mut map)?; + "PacketLength" => { + packet_length = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SessionNumber" => { + session_number = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TrafficMirrorFilterId" => { + traffic_mirror_filter_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TrafficMirrorTargetId" => { + traffic_mirror_target_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VirtualNetworkId" => { + virtual_network_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(TransitGatewayMulticastGroupMemberProperties { - group_ip_address: group_ip_address.ok_or(::serde::de::Error::missing_field("GroupIpAddress"))?, + Ok(TrafficMirrorSessionProperties { + description: description, network_interface_id: network_interface_id.ok_or(::serde::de::Error::missing_field("NetworkInterfaceId"))?, - transit_gateway_multicast_domain_id: transit_gateway_multicast_domain_id.ok_or(::serde::de::Error::missing_field("TransitGatewayMulticastDomainId"))?, + packet_length: packet_length, + session_number: session_number.ok_or(::serde::de::Error::missing_field("SessionNumber"))?, + tags: tags, + traffic_mirror_filter_id: traffic_mirror_filter_id.ok_or(::serde::de::Error::missing_field("TrafficMirrorFilterId"))?, + traffic_mirror_target_id: traffic_mirror_target_id.ok_or(::serde::de::Error::missing_field("TrafficMirrorTargetId"))?, + virtual_network_id: virtual_network_id, }) } } @@ -6924,96 +7187,128 @@ impl<'de> ::serde::Deserialize<'de> for TransitGatewayMulticastGroupMemberProper } } -impl ::Resource for TransitGatewayMulticastGroupMember { - type Properties = TransitGatewayMulticastGroupMemberProperties; - const TYPE: &'static str = "AWS::EC2::TransitGatewayMulticastGroupMember"; - fn properties(&self) -> &TransitGatewayMulticastGroupMemberProperties { +impl ::Resource for TrafficMirrorSession { + type Properties = TrafficMirrorSessionProperties; + const TYPE: &'static str = "AWS::EC2::TrafficMirrorSession"; + fn properties(&self) -> &TrafficMirrorSessionProperties { &self.properties } - fn properties_mut(&mut self) -> &mut TransitGatewayMulticastGroupMemberProperties { + fn properties_mut(&mut self) -> &mut TrafficMirrorSessionProperties { &mut self.properties } } -impl ::private::Sealed for TransitGatewayMulticastGroupMember {} +impl ::private::Sealed for TrafficMirrorSession {} -impl From for TransitGatewayMulticastGroupMember { - fn from(properties: TransitGatewayMulticastGroupMemberProperties) -> TransitGatewayMulticastGroupMember { - TransitGatewayMulticastGroupMember { properties } +impl From for TrafficMirrorSession { + fn from(properties: TrafficMirrorSessionProperties) -> TrafficMirrorSession { + TrafficMirrorSession { properties } } } -/// The [`AWS::EC2::TransitGatewayMulticastGroupSource`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupsource.html) resource type. +/// The [`AWS::EC2::TrafficMirrorTarget`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrortarget.html) resource type. #[derive(Debug, Default)] -pub struct TransitGatewayMulticastGroupSource { - properties: TransitGatewayMulticastGroupSourceProperties +pub struct TrafficMirrorTarget { + properties: TrafficMirrorTargetProperties } -/// Properties for the `TransitGatewayMulticastGroupSource` resource. +/// Properties for the `TrafficMirrorTarget` resource. #[derive(Debug, Default)] -pub struct TransitGatewayMulticastGroupSourceProperties { - /// Property [`GroupIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupsource.html#cfn-ec2-transitgatewaymulticastgroupsource-groupipaddress). +pub struct TrafficMirrorTargetProperties { + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrortarget.html#cfn-ec2-trafficmirrortarget-description). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub group_ip_address: ::Value, - /// Property [`NetworkInterfaceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupsource.html#cfn-ec2-transitgatewaymulticastgroupsource-networkinterfaceid). + pub description: Option<::Value>, + /// Property [`GatewayLoadBalancerEndpointId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrortarget.html#cfn-ec2-trafficmirrortarget-gatewayloadbalancerendpointid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub network_interface_id: ::Value, - /// Property [`TransitGatewayMulticastDomainId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupsource.html#cfn-ec2-transitgatewaymulticastgroupsource-transitgatewaymulticastdomainid). + pub gateway_load_balancer_endpoint_id: Option<::Value>, + /// Property [`NetworkInterfaceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrortarget.html#cfn-ec2-trafficmirrortarget-networkinterfaceid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub transit_gateway_multicast_domain_id: ::Value, + pub network_interface_id: Option<::Value>, + /// Property [`NetworkLoadBalancerArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrortarget.html#cfn-ec2-trafficmirrortarget-networkloadbalancerarn). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub network_load_balancer_arn: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-trafficmirrortarget.html#cfn-ec2-trafficmirrortarget-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, } -impl ::serde::Serialize for TransitGatewayMulticastGroupSourceProperties { +impl ::serde::Serialize for TrafficMirrorTargetProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupIpAddress", &self.group_ip_address)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaceId", &self.network_interface_id)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayMulticastDomainId", &self.transit_gateway_multicast_domain_id)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + if let Some(ref gateway_load_balancer_endpoint_id) = self.gateway_load_balancer_endpoint_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GatewayLoadBalancerEndpointId", gateway_load_balancer_endpoint_id)?; + } + if let Some(ref network_interface_id) = self.network_interface_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaceId", network_interface_id)?; + } + if let Some(ref network_load_balancer_arn) = self.network_load_balancer_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkLoadBalancerArn", network_load_balancer_arn)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for TransitGatewayMulticastGroupSourceProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for TrafficMirrorTargetProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = TransitGatewayMulticastGroupSourceProperties; + type Value = TrafficMirrorTargetProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type TransitGatewayMulticastGroupSourceProperties") + write!(f, "a struct of type TrafficMirrorTargetProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut group_ip_address: Option<::Value> = None; + let mut description: Option<::Value> = None; + let mut gateway_load_balancer_endpoint_id: Option<::Value> = None; let mut network_interface_id: Option<::Value> = None; - let mut transit_gateway_multicast_domain_id: Option<::Value> = None; + let mut network_load_balancer_arn: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "GroupIpAddress" => { - group_ip_address = ::serde::de::MapAccess::next_value(&mut map)?; + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "GatewayLoadBalancerEndpointId" => { + gateway_load_balancer_endpoint_id = ::serde::de::MapAccess::next_value(&mut map)?; } "NetworkInterfaceId" => { network_interface_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "TransitGatewayMulticastDomainId" => { - transit_gateway_multicast_domain_id = ::serde::de::MapAccess::next_value(&mut map)?; + "NetworkLoadBalancerArn" => { + network_load_balancer_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(TransitGatewayMulticastGroupSourceProperties { - group_ip_address: group_ip_address.ok_or(::serde::de::Error::missing_field("GroupIpAddress"))?, - network_interface_id: network_interface_id.ok_or(::serde::de::Error::missing_field("NetworkInterfaceId"))?, - transit_gateway_multicast_domain_id: transit_gateway_multicast_domain_id.ok_or(::serde::de::Error::missing_field("TransitGatewayMulticastDomainId"))?, + Ok(TrafficMirrorTargetProperties { + description: description, + gateway_load_balancer_endpoint_id: gateway_load_balancer_endpoint_id, + network_interface_id: network_interface_id, + network_load_balancer_arn: network_load_balancer_arn, + tags: tags, }) } } @@ -7022,235 +7317,330 @@ impl<'de> ::serde::Deserialize<'de> for TransitGatewayMulticastGroupSourceProper } } -impl ::Resource for TransitGatewayMulticastGroupSource { - type Properties = TransitGatewayMulticastGroupSourceProperties; - const TYPE: &'static str = "AWS::EC2::TransitGatewayMulticastGroupSource"; - fn properties(&self) -> &TransitGatewayMulticastGroupSourceProperties { +impl ::Resource for TrafficMirrorTarget { + type Properties = TrafficMirrorTargetProperties; + const TYPE: &'static str = "AWS::EC2::TrafficMirrorTarget"; + fn properties(&self) -> &TrafficMirrorTargetProperties { &self.properties } - fn properties_mut(&mut self) -> &mut TransitGatewayMulticastGroupSourceProperties { + fn properties_mut(&mut self) -> &mut TrafficMirrorTargetProperties { &mut self.properties } } -impl ::private::Sealed for TransitGatewayMulticastGroupSource {} +impl ::private::Sealed for TrafficMirrorTarget {} -impl From for TransitGatewayMulticastGroupSource { - fn from(properties: TransitGatewayMulticastGroupSourceProperties) -> TransitGatewayMulticastGroupSource { - TransitGatewayMulticastGroupSource { properties } +impl From for TrafficMirrorTarget { + fn from(properties: TrafficMirrorTargetProperties) -> TrafficMirrorTarget { + TrafficMirrorTarget { properties } } } -/// The [`AWS::EC2::TransitGatewayPeeringAttachment`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaypeeringattachment.html) resource type. +/// The [`AWS::EC2::TransitGateway`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html) resource type. #[derive(Debug, Default)] -pub struct TransitGatewayPeeringAttachment { - properties: TransitGatewayPeeringAttachmentProperties +pub struct TransitGateway { + properties: TransitGatewayProperties } -/// Properties for the `TransitGatewayPeeringAttachment` resource. +/// Properties for the `TransitGateway` resource. #[derive(Debug, Default)] -pub struct TransitGatewayPeeringAttachmentProperties { - /// Property [`PeerAccountId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaypeeringattachment.html#cfn-ec2-transitgatewaypeeringattachment-peeraccountid). +pub struct TransitGatewayProperties { + /// Property [`AmazonSideAsn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-amazonsideasn). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub peer_account_id: ::Value, - /// Property [`PeerRegion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaypeeringattachment.html#cfn-ec2-transitgatewaypeeringattachment-peerregion). + pub amazon_side_asn: Option<::Value>, + /// Property [`AssociationDefaultRouteTableId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-associationdefaultroutetableid). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub peer_region: ::Value, - /// Property [`PeerTransitGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaypeeringattachment.html#cfn-ec2-transitgatewaypeeringattachment-peertransitgatewayid). + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub association_default_route_table_id: Option<::Value>, + /// Property [`AutoAcceptSharedAttachments`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-autoacceptsharedattachments). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub auto_accept_shared_attachments: Option<::Value>, + /// Property [`DefaultRouteTableAssociation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-defaultroutetableassociation). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub default_route_table_association: Option<::Value>, + /// Property [`DefaultRouteTablePropagation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-defaultroutetablepropagation). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub default_route_table_propagation: Option<::Value>, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`DnsSupport`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-dnssupport). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub dns_support: Option<::Value>, + /// Property [`MulticastSupport`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-multicastsupport). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub peer_transit_gateway_id: ::Value, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaypeeringattachment.html#cfn-ec2-transitgatewaypeeringattachment-tags). + pub multicast_support: Option<::Value>, + /// Property [`PropagationDefaultRouteTableId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-propagationdefaultroutetableid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub propagation_default_route_table_id: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-tags). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub tags: Option<::ValueList<::Tag>>, - /// Property [`TransitGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaypeeringattachment.html#cfn-ec2-transitgatewaypeeringattachment-transitgatewayid). + /// Property [`TransitGatewayCidrBlocks`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-transitgatewaycidrblocks). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub transit_gateway_id: ::Value, + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub transit_gateway_cidr_blocks: Option<::ValueList>, + /// Property [`VpnEcmpSupport`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgateway.html#cfn-ec2-transitgateway-vpnecmpsupport). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub vpn_ecmp_support: Option<::Value>, } -impl ::serde::Serialize for TransitGatewayPeeringAttachmentProperties { +impl ::serde::Serialize for TransitGatewayProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PeerAccountId", &self.peer_account_id)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PeerRegion", &self.peer_region)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PeerTransitGatewayId", &self.peer_transit_gateway_id)?; + if let Some(ref amazon_side_asn) = self.amazon_side_asn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AmazonSideAsn", amazon_side_asn)?; + } + if let Some(ref association_default_route_table_id) = self.association_default_route_table_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AssociationDefaultRouteTableId", association_default_route_table_id)?; + } + if let Some(ref auto_accept_shared_attachments) = self.auto_accept_shared_attachments { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AutoAcceptSharedAttachments", auto_accept_shared_attachments)?; + } + if let Some(ref default_route_table_association) = self.default_route_table_association { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DefaultRouteTableAssociation", default_route_table_association)?; + } + if let Some(ref default_route_table_propagation) = self.default_route_table_propagation { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DefaultRouteTablePropagation", default_route_table_propagation)?; + } + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + if let Some(ref dns_support) = self.dns_support { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DnsSupport", dns_support)?; + } + if let Some(ref multicast_support) = self.multicast_support { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MulticastSupport", multicast_support)?; + } + if let Some(ref propagation_default_route_table_id) = self.propagation_default_route_table_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PropagationDefaultRouteTableId", propagation_default_route_table_id)?; + } if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayId", &self.transit_gateway_id)?; + if let Some(ref transit_gateway_cidr_blocks) = self.transit_gateway_cidr_blocks { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayCidrBlocks", transit_gateway_cidr_blocks)?; + } + if let Some(ref vpn_ecmp_support) = self.vpn_ecmp_support { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpnEcmpSupport", vpn_ecmp_support)?; + } ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for TransitGatewayPeeringAttachmentProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for TransitGatewayProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = TransitGatewayPeeringAttachmentProperties; + type Value = TransitGatewayProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type TransitGatewayPeeringAttachmentProperties") + write!(f, "a struct of type TransitGatewayProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut peer_account_id: Option<::Value> = None; - let mut peer_region: Option<::Value> = None; - let mut peer_transit_gateway_id: Option<::Value> = None; + let mut amazon_side_asn: Option<::Value> = None; + let mut association_default_route_table_id: Option<::Value> = None; + let mut auto_accept_shared_attachments: Option<::Value> = None; + let mut default_route_table_association: Option<::Value> = None; + let mut default_route_table_propagation: Option<::Value> = None; + let mut description: Option<::Value> = None; + let mut dns_support: Option<::Value> = None; + let mut multicast_support: Option<::Value> = None; + let mut propagation_default_route_table_id: Option<::Value> = None; let mut tags: Option<::ValueList<::Tag>> = None; - let mut transit_gateway_id: Option<::Value> = None; + let mut transit_gateway_cidr_blocks: Option<::ValueList> = None; + let mut vpn_ecmp_support: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "PeerAccountId" => { - peer_account_id = ::serde::de::MapAccess::next_value(&mut map)?; + "AmazonSideAsn" => { + amazon_side_asn = ::serde::de::MapAccess::next_value(&mut map)?; } - "PeerRegion" => { - peer_region = ::serde::de::MapAccess::next_value(&mut map)?; + "AssociationDefaultRouteTableId" => { + association_default_route_table_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "PeerTransitGatewayId" => { - peer_transit_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; + "AutoAcceptSharedAttachments" => { + auto_accept_shared_attachments = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DefaultRouteTableAssociation" => { + default_route_table_association = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DefaultRouteTablePropagation" => { + default_route_table_propagation = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DnsSupport" => { + dns_support = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MulticastSupport" => { + multicast_support = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PropagationDefaultRouteTableId" => { + propagation_default_route_table_id = ::serde::de::MapAccess::next_value(&mut map)?; } "Tags" => { tags = ::serde::de::MapAccess::next_value(&mut map)?; } - "TransitGatewayId" => { - transit_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; + "TransitGatewayCidrBlocks" => { + transit_gateway_cidr_blocks = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VpnEcmpSupport" => { + vpn_ecmp_support = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(TransitGatewayPeeringAttachmentProperties { - peer_account_id: peer_account_id.ok_or(::serde::de::Error::missing_field("PeerAccountId"))?, - peer_region: peer_region.ok_or(::serde::de::Error::missing_field("PeerRegion"))?, - peer_transit_gateway_id: peer_transit_gateway_id.ok_or(::serde::de::Error::missing_field("PeerTransitGatewayId"))?, - tags: tags, - transit_gateway_id: transit_gateway_id.ok_or(::serde::de::Error::missing_field("TransitGatewayId"))?, - }) - } - } - + Ok(TransitGatewayProperties { + amazon_side_asn: amazon_side_asn, + association_default_route_table_id: association_default_route_table_id, + auto_accept_shared_attachments: auto_accept_shared_attachments, + default_route_table_association: default_route_table_association, + default_route_table_propagation: default_route_table_propagation, + description: description, + dns_support: dns_support, + multicast_support: multicast_support, + propagation_default_route_table_id: propagation_default_route_table_id, + tags: tags, + transit_gateway_cidr_blocks: transit_gateway_cidr_blocks, + vpn_ecmp_support: vpn_ecmp_support, + }) + } + } + d.deserialize_map(Visitor) } } -impl ::Resource for TransitGatewayPeeringAttachment { - type Properties = TransitGatewayPeeringAttachmentProperties; - const TYPE: &'static str = "AWS::EC2::TransitGatewayPeeringAttachment"; - fn properties(&self) -> &TransitGatewayPeeringAttachmentProperties { +impl ::Resource for TransitGateway { + type Properties = TransitGatewayProperties; + const TYPE: &'static str = "AWS::EC2::TransitGateway"; + fn properties(&self) -> &TransitGatewayProperties { &self.properties } - fn properties_mut(&mut self) -> &mut TransitGatewayPeeringAttachmentProperties { + fn properties_mut(&mut self) -> &mut TransitGatewayProperties { &mut self.properties } } -impl ::private::Sealed for TransitGatewayPeeringAttachment {} +impl ::private::Sealed for TransitGateway {} -impl From for TransitGatewayPeeringAttachment { - fn from(properties: TransitGatewayPeeringAttachmentProperties) -> TransitGatewayPeeringAttachment { - TransitGatewayPeeringAttachment { properties } +impl From for TransitGateway { + fn from(properties: TransitGatewayProperties) -> TransitGateway { + TransitGateway { properties } } } -/// The [`AWS::EC2::TransitGatewayRoute`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroute.html) resource type. +/// The [`AWS::EC2::TransitGatewayAttachment`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayattachment.html) resource type. #[derive(Debug, Default)] -pub struct TransitGatewayRoute { - properties: TransitGatewayRouteProperties +pub struct TransitGatewayAttachment { + properties: TransitGatewayAttachmentProperties } -/// Properties for the `TransitGatewayRoute` resource. +/// Properties for the `TransitGatewayAttachment` resource. #[derive(Debug, Default)] -pub struct TransitGatewayRouteProperties { - /// Property [`Blackhole`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroute.html#cfn-ec2-transitgatewayroute-blackhole). +pub struct TransitGatewayAttachmentProperties { + /// Property [`SubnetIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayattachment.html#cfn-ec2-transitgatewayattachment-subnetids). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub blackhole: Option<::Value>, - /// Property [`DestinationCidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroute.html#cfn-ec2-transitgatewayroute-destinationcidrblock). + pub subnet_ids: ::ValueList, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayattachment.html#cfn-ec2-transitgatewayattachment-tags). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub destination_cidr_block: Option<::Value>, - /// Property [`TransitGatewayAttachmentId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroute.html#cfn-ec2-transitgatewayroute-transitgatewayattachmentid). + pub tags: Option<::ValueList<::Tag>>, + /// Property [`TransitGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayattachment.html#cfn-ec2-transitgatewayattachment-transitgatewayid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub transit_gateway_attachment_id: Option<::Value>, - /// Property [`TransitGatewayRouteTableId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroute.html#cfn-ec2-transitgatewayroute-transitgatewayroutetableid). + pub transit_gateway_id: ::Value, + /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayattachment.html#cfn-ec2-transitgatewayattachment-vpcid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub transit_gateway_route_table_id: ::Value, + pub vpc_id: ::Value, } -impl ::serde::Serialize for TransitGatewayRouteProperties { +impl ::serde::Serialize for TransitGatewayAttachmentProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref blackhole) = self.blackhole { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Blackhole", blackhole)?; - } - if let Some(ref destination_cidr_block) = self.destination_cidr_block { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationCidrBlock", destination_cidr_block)?; - } - if let Some(ref transit_gateway_attachment_id) = self.transit_gateway_attachment_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayAttachmentId", transit_gateway_attachment_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetIds", &self.subnet_ids)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayRouteTableId", &self.transit_gateway_route_table_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayId", &self.transit_gateway_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", &self.vpc_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for TransitGatewayRouteProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for TransitGatewayAttachmentProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = TransitGatewayRouteProperties; + type Value = TransitGatewayAttachmentProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type TransitGatewayRouteProperties") + write!(f, "a struct of type TransitGatewayAttachmentProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut blackhole: Option<::Value> = None; - let mut destination_cidr_block: Option<::Value> = None; - let mut transit_gateway_attachment_id: Option<::Value> = None; - let mut transit_gateway_route_table_id: Option<::Value> = None; + let mut subnet_ids: Option<::ValueList> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut transit_gateway_id: Option<::Value> = None; + let mut vpc_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Blackhole" => { - blackhole = ::serde::de::MapAccess::next_value(&mut map)?; + "SubnetIds" => { + subnet_ids = ::serde::de::MapAccess::next_value(&mut map)?; } - "DestinationCidrBlock" => { - destination_cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; } - "TransitGatewayAttachmentId" => { - transit_gateway_attachment_id = ::serde::de::MapAccess::next_value(&mut map)?; + "TransitGatewayId" => { + transit_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "TransitGatewayRouteTableId" => { - transit_gateway_route_table_id = ::serde::de::MapAccess::next_value(&mut map)?; + "VpcId" => { + vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(TransitGatewayRouteProperties { - blackhole: blackhole, - destination_cidr_block: destination_cidr_block, - transit_gateway_attachment_id: transit_gateway_attachment_id, - transit_gateway_route_table_id: transit_gateway_route_table_id.ok_or(::serde::de::Error::missing_field("TransitGatewayRouteTableId"))?, + Ok(TransitGatewayAttachmentProperties { + subnet_ids: subnet_ids.ok_or(::serde::de::Error::missing_field("SubnetIds"))?, + tags: tags, + transit_gateway_id: transit_gateway_id.ok_or(::serde::de::Error::missing_field("TransitGatewayId"))?, + vpc_id: vpc_id.ok_or(::serde::de::Error::missing_field("VpcId"))?, }) } } @@ -7259,87 +7649,98 @@ impl<'de> ::serde::Deserialize<'de> for TransitGatewayRouteProperties { } } -impl ::Resource for TransitGatewayRoute { - type Properties = TransitGatewayRouteProperties; - const TYPE: &'static str = "AWS::EC2::TransitGatewayRoute"; - fn properties(&self) -> &TransitGatewayRouteProperties { +impl ::Resource for TransitGatewayAttachment { + type Properties = TransitGatewayAttachmentProperties; + const TYPE: &'static str = "AWS::EC2::TransitGatewayAttachment"; + fn properties(&self) -> &TransitGatewayAttachmentProperties { &self.properties } - fn properties_mut(&mut self) -> &mut TransitGatewayRouteProperties { + fn properties_mut(&mut self) -> &mut TransitGatewayAttachmentProperties { &mut self.properties } } -impl ::private::Sealed for TransitGatewayRoute {} +impl ::private::Sealed for TransitGatewayAttachment {} -impl From for TransitGatewayRoute { - fn from(properties: TransitGatewayRouteProperties) -> TransitGatewayRoute { - TransitGatewayRoute { properties } +impl From for TransitGatewayAttachment { + fn from(properties: TransitGatewayAttachmentProperties) -> TransitGatewayAttachment { + TransitGatewayAttachment { properties } } } -/// The [`AWS::EC2::TransitGatewayRouteTable`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetable.html) resource type. +/// The [`AWS::EC2::TransitGatewayConnect`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayconnect.html) resource type. #[derive(Debug, Default)] -pub struct TransitGatewayRouteTable { - properties: TransitGatewayRouteTableProperties +pub struct TransitGatewayConnect { + properties: TransitGatewayConnectProperties } -/// Properties for the `TransitGatewayRouteTable` resource. +/// Properties for the `TransitGatewayConnect` resource. #[derive(Debug, Default)] -pub struct TransitGatewayRouteTableProperties { - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetable.html#cfn-ec2-transitgatewayroutetable-tags). +pub struct TransitGatewayConnectProperties { + /// Property [`Options`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayconnect.html#cfn-ec2-transitgatewayconnect-options). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. + pub options: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayconnect.html#cfn-ec2-transitgatewayconnect-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub tags: Option<::ValueList<::Tag>>, - /// Property [`TransitGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetable.html#cfn-ec2-transitgatewayroutetable-transitgatewayid). + /// Property [`TransportTransitGatewayAttachmentId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayconnect.html#cfn-ec2-transitgatewayconnect-transporttransitgatewayattachmentid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub transit_gateway_id: ::Value, + pub transport_transit_gateway_attachment_id: ::Value, } -impl ::serde::Serialize for TransitGatewayRouteTableProperties { +impl ::serde::Serialize for TransitGatewayConnectProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Options", &self.options)?; if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayId", &self.transit_gateway_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransportTransitGatewayAttachmentId", &self.transport_transit_gateway_attachment_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for TransitGatewayRouteTableProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for TransitGatewayConnectProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = TransitGatewayRouteTableProperties; + type Value = TransitGatewayConnectProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type TransitGatewayRouteTableProperties") + write!(f, "a struct of type TransitGatewayConnectProperties") } fn visit_map>(self, mut map: A) -> Result { + let mut options: Option<::Value> = None; let mut tags: Option<::ValueList<::Tag>> = None; - let mut transit_gateway_id: Option<::Value> = None; + let mut transport_transit_gateway_attachment_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "Options" => { + options = ::serde::de::MapAccess::next_value(&mut map)?; + } "Tags" => { tags = ::serde::de::MapAccess::next_value(&mut map)?; } - "TransitGatewayId" => { - transit_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; + "TransportTransitGatewayAttachmentId" => { + transport_transit_gateway_attachment_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(TransitGatewayRouteTableProperties { + Ok(TransitGatewayConnectProperties { + options: options.ok_or(::serde::de::Error::missing_field("Options"))?, tags: tags, - transit_gateway_id: transit_gateway_id.ok_or(::serde::de::Error::missing_field("TransitGatewayId"))?, + transport_transit_gateway_attachment_id: transport_transit_gateway_attachment_id.ok_or(::serde::de::Error::missing_field("TransportTransitGatewayAttachmentId"))?, }) } } @@ -7348,85 +7749,100 @@ impl<'de> ::serde::Deserialize<'de> for TransitGatewayRouteTableProperties { } } -impl ::Resource for TransitGatewayRouteTable { - type Properties = TransitGatewayRouteTableProperties; - const TYPE: &'static str = "AWS::EC2::TransitGatewayRouteTable"; - fn properties(&self) -> &TransitGatewayRouteTableProperties { +impl ::Resource for TransitGatewayConnect { + type Properties = TransitGatewayConnectProperties; + const TYPE: &'static str = "AWS::EC2::TransitGatewayConnect"; + fn properties(&self) -> &TransitGatewayConnectProperties { &self.properties } - fn properties_mut(&mut self) -> &mut TransitGatewayRouteTableProperties { + fn properties_mut(&mut self) -> &mut TransitGatewayConnectProperties { &mut self.properties } } -impl ::private::Sealed for TransitGatewayRouteTable {} +impl ::private::Sealed for TransitGatewayConnect {} -impl From for TransitGatewayRouteTable { - fn from(properties: TransitGatewayRouteTableProperties) -> TransitGatewayRouteTable { - TransitGatewayRouteTable { properties } +impl From for TransitGatewayConnect { + fn from(properties: TransitGatewayConnectProperties) -> TransitGatewayConnect { + TransitGatewayConnect { properties } } } -/// The [`AWS::EC2::TransitGatewayRouteTableAssociation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetableassociation.html) resource type. +/// The [`AWS::EC2::TransitGatewayMulticastDomain`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomain.html) resource type. #[derive(Debug, Default)] -pub struct TransitGatewayRouteTableAssociation { - properties: TransitGatewayRouteTableAssociationProperties +pub struct TransitGatewayMulticastDomain { + properties: TransitGatewayMulticastDomainProperties } -/// Properties for the `TransitGatewayRouteTableAssociation` resource. +/// Properties for the `TransitGatewayMulticastDomain` resource. #[derive(Debug, Default)] -pub struct TransitGatewayRouteTableAssociationProperties { - /// Property [`TransitGatewayAttachmentId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetableassociation.html#cfn-ec2-transitgatewayroutetableassociation-transitgatewayattachmentid). +pub struct TransitGatewayMulticastDomainProperties { + /// Property [`Options`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomain.html#cfn-ec2-transitgatewaymulticastdomain-options). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub transit_gateway_attachment_id: ::Value, - /// Property [`TransitGatewayRouteTableId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetableassociation.html#cfn-ec2-transitgatewayroutetableassociation-transitgatewayroutetableid). + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub options: Option<::Value<::json::Value>>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomain.html#cfn-ec2-transitgatewaymulticastdomain-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`TransitGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomain.html#cfn-ec2-transitgatewaymulticastdomain-transitgatewayid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub transit_gateway_route_table_id: ::Value, + pub transit_gateway_id: ::Value, } -impl ::serde::Serialize for TransitGatewayRouteTableAssociationProperties { +impl ::serde::Serialize for TransitGatewayMulticastDomainProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayAttachmentId", &self.transit_gateway_attachment_id)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayRouteTableId", &self.transit_gateway_route_table_id)?; + if let Some(ref options) = self.options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Options", options)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayId", &self.transit_gateway_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for TransitGatewayRouteTableAssociationProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for TransitGatewayMulticastDomainProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = TransitGatewayRouteTableAssociationProperties; + type Value = TransitGatewayMulticastDomainProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type TransitGatewayRouteTableAssociationProperties") + write!(f, "a struct of type TransitGatewayMulticastDomainProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut transit_gateway_attachment_id: Option<::Value> = None; - let mut transit_gateway_route_table_id: Option<::Value> = None; + let mut options: Option<::Value<::json::Value>> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut transit_gateway_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "TransitGatewayAttachmentId" => { - transit_gateway_attachment_id = ::serde::de::MapAccess::next_value(&mut map)?; + "Options" => { + options = ::serde::de::MapAccess::next_value(&mut map)?; } - "TransitGatewayRouteTableId" => { - transit_gateway_route_table_id = ::serde::de::MapAccess::next_value(&mut map)?; + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TransitGatewayId" => { + transit_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(TransitGatewayRouteTableAssociationProperties { - transit_gateway_attachment_id: transit_gateway_attachment_id.ok_or(::serde::de::Error::missing_field("TransitGatewayAttachmentId"))?, - transit_gateway_route_table_id: transit_gateway_route_table_id.ok_or(::serde::de::Error::missing_field("TransitGatewayRouteTableId"))?, + Ok(TransitGatewayMulticastDomainProperties { + options: options, + tags: tags, + transit_gateway_id: transit_gateway_id.ok_or(::serde::de::Error::missing_field("TransitGatewayId"))?, }) } } @@ -7435,85 +7851,96 @@ impl<'de> ::serde::Deserialize<'de> for TransitGatewayRouteTableAssociationPrope } } -impl ::Resource for TransitGatewayRouteTableAssociation { - type Properties = TransitGatewayRouteTableAssociationProperties; - const TYPE: &'static str = "AWS::EC2::TransitGatewayRouteTableAssociation"; - fn properties(&self) -> &TransitGatewayRouteTableAssociationProperties { +impl ::Resource for TransitGatewayMulticastDomain { + type Properties = TransitGatewayMulticastDomainProperties; + const TYPE: &'static str = "AWS::EC2::TransitGatewayMulticastDomain"; + fn properties(&self) -> &TransitGatewayMulticastDomainProperties { &self.properties } - fn properties_mut(&mut self) -> &mut TransitGatewayRouteTableAssociationProperties { + fn properties_mut(&mut self) -> &mut TransitGatewayMulticastDomainProperties { &mut self.properties } } -impl ::private::Sealed for TransitGatewayRouteTableAssociation {} +impl ::private::Sealed for TransitGatewayMulticastDomain {} -impl From for TransitGatewayRouteTableAssociation { - fn from(properties: TransitGatewayRouteTableAssociationProperties) -> TransitGatewayRouteTableAssociation { - TransitGatewayRouteTableAssociation { properties } +impl From for TransitGatewayMulticastDomain { + fn from(properties: TransitGatewayMulticastDomainProperties) -> TransitGatewayMulticastDomain { + TransitGatewayMulticastDomain { properties } } } -/// The [`AWS::EC2::TransitGatewayRouteTablePropagation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetablepropagation.html) resource type. +/// The [`AWS::EC2::TransitGatewayMulticastDomainAssociation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomainassociation.html) resource type. #[derive(Debug, Default)] -pub struct TransitGatewayRouteTablePropagation { - properties: TransitGatewayRouteTablePropagationProperties +pub struct TransitGatewayMulticastDomainAssociation { + properties: TransitGatewayMulticastDomainAssociationProperties } -/// Properties for the `TransitGatewayRouteTablePropagation` resource. +/// Properties for the `TransitGatewayMulticastDomainAssociation` resource. #[derive(Debug, Default)] -pub struct TransitGatewayRouteTablePropagationProperties { - /// Property [`TransitGatewayAttachmentId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetablepropagation.html#cfn-ec2-transitgatewayroutetablepropagation-transitgatewayattachmentid). +pub struct TransitGatewayMulticastDomainAssociationProperties { + /// Property [`SubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomainassociation.html#cfn-ec2-transitgatewaymulticastdomainassociation-subnetid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub subnet_id: ::Value, + /// Property [`TransitGatewayAttachmentId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomainassociation.html#cfn-ec2-transitgatewaymulticastdomainassociation-transitgatewayattachmentid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub transit_gateway_attachment_id: ::Value, - /// Property [`TransitGatewayRouteTableId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetablepropagation.html#cfn-ec2-transitgatewayroutetablepropagation-transitgatewayroutetableid). + /// Property [`TransitGatewayMulticastDomainId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastdomainassociation.html#cfn-ec2-transitgatewaymulticastdomainassociation-transitgatewaymulticastdomainid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub transit_gateway_route_table_id: ::Value, + pub transit_gateway_multicast_domain_id: ::Value, } -impl ::serde::Serialize for TransitGatewayRouteTablePropagationProperties { +impl ::serde::Serialize for TransitGatewayMulticastDomainAssociationProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetId", &self.subnet_id)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayAttachmentId", &self.transit_gateway_attachment_id)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayRouteTableId", &self.transit_gateway_route_table_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayMulticastDomainId", &self.transit_gateway_multicast_domain_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for TransitGatewayRouteTablePropagationProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for TransitGatewayMulticastDomainAssociationProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = TransitGatewayRouteTablePropagationProperties; + type Value = TransitGatewayMulticastDomainAssociationProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type TransitGatewayRouteTablePropagationProperties") + write!(f, "a struct of type TransitGatewayMulticastDomainAssociationProperties") } fn visit_map>(self, mut map: A) -> Result { + let mut subnet_id: Option<::Value> = None; let mut transit_gateway_attachment_id: Option<::Value> = None; - let mut transit_gateway_route_table_id: Option<::Value> = None; + let mut transit_gateway_multicast_domain_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "SubnetId" => { + subnet_id = ::serde::de::MapAccess::next_value(&mut map)?; + } "TransitGatewayAttachmentId" => { transit_gateway_attachment_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "TransitGatewayRouteTableId" => { - transit_gateway_route_table_id = ::serde::de::MapAccess::next_value(&mut map)?; + "TransitGatewayMulticastDomainId" => { + transit_gateway_multicast_domain_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(TransitGatewayRouteTablePropagationProperties { + Ok(TransitGatewayMulticastDomainAssociationProperties { + subnet_id: subnet_id.ok_or(::serde::de::Error::missing_field("SubnetId"))?, transit_gateway_attachment_id: transit_gateway_attachment_id.ok_or(::serde::de::Error::missing_field("TransitGatewayAttachmentId"))?, - transit_gateway_route_table_id: transit_gateway_route_table_id.ok_or(::serde::de::Error::missing_field("TransitGatewayRouteTableId"))?, + transit_gateway_multicast_domain_id: transit_gateway_multicast_domain_id.ok_or(::serde::de::Error::missing_field("TransitGatewayMulticastDomainId"))?, }) } } @@ -7522,126 +7949,96 @@ impl<'de> ::serde::Deserialize<'de> for TransitGatewayRouteTablePropagationPrope } } -impl ::Resource for TransitGatewayRouteTablePropagation { - type Properties = TransitGatewayRouteTablePropagationProperties; - const TYPE: &'static str = "AWS::EC2::TransitGatewayRouteTablePropagation"; - fn properties(&self) -> &TransitGatewayRouteTablePropagationProperties { +impl ::Resource for TransitGatewayMulticastDomainAssociation { + type Properties = TransitGatewayMulticastDomainAssociationProperties; + const TYPE: &'static str = "AWS::EC2::TransitGatewayMulticastDomainAssociation"; + fn properties(&self) -> &TransitGatewayMulticastDomainAssociationProperties { &self.properties } - fn properties_mut(&mut self) -> &mut TransitGatewayRouteTablePropagationProperties { + fn properties_mut(&mut self) -> &mut TransitGatewayMulticastDomainAssociationProperties { &mut self.properties } } -impl ::private::Sealed for TransitGatewayRouteTablePropagation {} +impl ::private::Sealed for TransitGatewayMulticastDomainAssociation {} -impl From for TransitGatewayRouteTablePropagation { - fn from(properties: TransitGatewayRouteTablePropagationProperties) -> TransitGatewayRouteTablePropagation { - TransitGatewayRouteTablePropagation { properties } +impl From for TransitGatewayMulticastDomainAssociation { + fn from(properties: TransitGatewayMulticastDomainAssociationProperties) -> TransitGatewayMulticastDomainAssociation { + TransitGatewayMulticastDomainAssociation { properties } } } -/// The [`AWS::EC2::VPC`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html) resource type. +/// The [`AWS::EC2::TransitGatewayMulticastGroupMember`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupmember.html) resource type. #[derive(Debug, Default)] -pub struct VPC { - properties: VPCProperties +pub struct TransitGatewayMulticastGroupMember { + properties: TransitGatewayMulticastGroupMemberProperties } -/// Properties for the `VPC` resource. +/// Properties for the `TransitGatewayMulticastGroupMember` resource. #[derive(Debug, Default)] -pub struct VPCProperties { - /// Property [`CidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html#cfn-aws-ec2-vpc-cidrblock). +pub struct TransitGatewayMulticastGroupMemberProperties { + /// Property [`GroupIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupmember.html#cfn-ec2-transitgatewaymulticastgroupmember-groupipaddress). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub cidr_block: ::Value, - /// Property [`EnableDnsHostnames`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html#cfn-aws-ec2-vpc-EnableDnsHostnames). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub enable_dns_hostnames: Option<::Value>, - /// Property [`EnableDnsSupport`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html#cfn-aws-ec2-vpc-EnableDnsSupport). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub enable_dns_support: Option<::Value>, - /// Property [`InstanceTenancy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html#cfn-aws-ec2-vpc-instancetenancy). + pub group_ip_address: ::Value, + /// Property [`NetworkInterfaceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupmember.html#cfn-ec2-transitgatewaymulticastgroupmember-networkinterfaceid). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub instance_tenancy: Option<::Value>, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html#cfn-aws-ec2-vpc-tags). + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub network_interface_id: ::Value, + /// Property [`TransitGatewayMulticastDomainId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupmember.html#cfn-ec2-transitgatewaymulticastgroupmember-transitgatewaymulticastdomainid). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub tags: Option<::ValueList<::Tag>>, + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub transit_gateway_multicast_domain_id: ::Value, } -impl ::serde::Serialize for VPCProperties { +impl ::serde::Serialize for TransitGatewayMulticastGroupMemberProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CidrBlock", &self.cidr_block)?; - if let Some(ref enable_dns_hostnames) = self.enable_dns_hostnames { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "EnableDnsHostnames", enable_dns_hostnames)?; - } - if let Some(ref enable_dns_support) = self.enable_dns_support { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "EnableDnsSupport", enable_dns_support)?; - } - if let Some(ref instance_tenancy) = self.instance_tenancy { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceTenancy", instance_tenancy)?; - } - if let Some(ref tags) = self.tags { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupIpAddress", &self.group_ip_address)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaceId", &self.network_interface_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayMulticastDomainId", &self.transit_gateway_multicast_domain_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for VPCProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for TransitGatewayMulticastGroupMemberProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = VPCProperties; + type Value = TransitGatewayMulticastGroupMemberProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type VPCProperties") + write!(f, "a struct of type TransitGatewayMulticastGroupMemberProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut cidr_block: Option<::Value> = None; - let mut enable_dns_hostnames: Option<::Value> = None; - let mut enable_dns_support: Option<::Value> = None; - let mut instance_tenancy: Option<::Value> = None; - let mut tags: Option<::ValueList<::Tag>> = None; + let mut group_ip_address: Option<::Value> = None; + let mut network_interface_id: Option<::Value> = None; + let mut transit_gateway_multicast_domain_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "CidrBlock" => { - cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; - } - "EnableDnsHostnames" => { - enable_dns_hostnames = ::serde::de::MapAccess::next_value(&mut map)?; - } - "EnableDnsSupport" => { - enable_dns_support = ::serde::de::MapAccess::next_value(&mut map)?; + "GroupIpAddress" => { + group_ip_address = ::serde::de::MapAccess::next_value(&mut map)?; } - "InstanceTenancy" => { - instance_tenancy = ::serde::de::MapAccess::next_value(&mut map)?; + "NetworkInterfaceId" => { + network_interface_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "Tags" => { - tags = ::serde::de::MapAccess::next_value(&mut map)?; + "TransitGatewayMulticastDomainId" => { + transit_gateway_multicast_domain_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(VPCProperties { - cidr_block: cidr_block.ok_or(::serde::de::Error::missing_field("CidrBlock"))?, - enable_dns_hostnames: enable_dns_hostnames, - enable_dns_support: enable_dns_support, - instance_tenancy: instance_tenancy, - tags: tags, + Ok(TransitGatewayMulticastGroupMemberProperties { + group_ip_address: group_ip_address.ok_or(::serde::de::Error::missing_field("GroupIpAddress"))?, + network_interface_id: network_interface_id.ok_or(::serde::de::Error::missing_field("NetworkInterfaceId"))?, + transit_gateway_multicast_domain_id: transit_gateway_multicast_domain_id.ok_or(::serde::de::Error::missing_field("TransitGatewayMulticastDomainId"))?, }) } } @@ -7650,100 +8047,96 @@ impl<'de> ::serde::Deserialize<'de> for VPCProperties { } } -impl ::Resource for VPC { - type Properties = VPCProperties; - const TYPE: &'static str = "AWS::EC2::VPC"; - fn properties(&self) -> &VPCProperties { +impl ::Resource for TransitGatewayMulticastGroupMember { + type Properties = TransitGatewayMulticastGroupMemberProperties; + const TYPE: &'static str = "AWS::EC2::TransitGatewayMulticastGroupMember"; + fn properties(&self) -> &TransitGatewayMulticastGroupMemberProperties { &self.properties } - fn properties_mut(&mut self) -> &mut VPCProperties { + fn properties_mut(&mut self) -> &mut TransitGatewayMulticastGroupMemberProperties { &mut self.properties } } -impl ::private::Sealed for VPC {} +impl ::private::Sealed for TransitGatewayMulticastGroupMember {} -impl From for VPC { - fn from(properties: VPCProperties) -> VPC { - VPC { properties } +impl From for TransitGatewayMulticastGroupMember { + fn from(properties: TransitGatewayMulticastGroupMemberProperties) -> TransitGatewayMulticastGroupMember { + TransitGatewayMulticastGroupMember { properties } } } -/// The [`AWS::EC2::VPCCidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html) resource type. +/// The [`AWS::EC2::TransitGatewayMulticastGroupSource`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupsource.html) resource type. #[derive(Debug, Default)] -pub struct VPCCidrBlock { - properties: VPCCidrBlockProperties +pub struct TransitGatewayMulticastGroupSource { + properties: TransitGatewayMulticastGroupSourceProperties } -/// Properties for the `VPCCidrBlock` resource. +/// Properties for the `TransitGatewayMulticastGroupSource` resource. #[derive(Debug, Default)] -pub struct VPCCidrBlockProperties { - /// Property [`AmazonProvidedIpv6CidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html#cfn-ec2-vpccidrblock-amazonprovidedipv6cidrblock). +pub struct TransitGatewayMulticastGroupSourceProperties { + /// Property [`GroupIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupsource.html#cfn-ec2-transitgatewaymulticastgroupsource-groupipaddress). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub amazon_provided_ipv6_cidr_block: Option<::Value>, - /// Property [`CidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html#cfn-ec2-vpccidrblock-cidrblock). + pub group_ip_address: ::Value, + /// Property [`NetworkInterfaceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupsource.html#cfn-ec2-transitgatewaymulticastgroupsource-networkinterfaceid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub cidr_block: Option<::Value>, - /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html#cfn-ec2-vpccidrblock-vpcid). + pub network_interface_id: ::Value, + /// Property [`TransitGatewayMulticastDomainId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaymulticastgroupsource.html#cfn-ec2-transitgatewaymulticastgroupsource-transitgatewaymulticastdomainid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub vpc_id: ::Value, + pub transit_gateway_multicast_domain_id: ::Value, } -impl ::serde::Serialize for VPCCidrBlockProperties { +impl ::serde::Serialize for TransitGatewayMulticastGroupSourceProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref amazon_provided_ipv6_cidr_block) = self.amazon_provided_ipv6_cidr_block { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AmazonProvidedIpv6CidrBlock", amazon_provided_ipv6_cidr_block)?; - } - if let Some(ref cidr_block) = self.cidr_block { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CidrBlock", cidr_block)?; - } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", &self.vpc_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupIpAddress", &self.group_ip_address)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaceId", &self.network_interface_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayMulticastDomainId", &self.transit_gateway_multicast_domain_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for VPCCidrBlockProperties { - fn deserialize>(d: D) -> Result { - struct Visitor; +impl<'de> ::serde::Deserialize<'de> for TransitGatewayMulticastGroupSourceProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = VPCCidrBlockProperties; + type Value = TransitGatewayMulticastGroupSourceProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type VPCCidrBlockProperties") + write!(f, "a struct of type TransitGatewayMulticastGroupSourceProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut amazon_provided_ipv6_cidr_block: Option<::Value> = None; - let mut cidr_block: Option<::Value> = None; - let mut vpc_id: Option<::Value> = None; + let mut group_ip_address: Option<::Value> = None; + let mut network_interface_id: Option<::Value> = None; + let mut transit_gateway_multicast_domain_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "AmazonProvidedIpv6CidrBlock" => { - amazon_provided_ipv6_cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; + "GroupIpAddress" => { + group_ip_address = ::serde::de::MapAccess::next_value(&mut map)?; } - "CidrBlock" => { - cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; + "NetworkInterfaceId" => { + network_interface_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "VpcId" => { - vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; + "TransitGatewayMulticastDomainId" => { + transit_gateway_multicast_domain_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(VPCCidrBlockProperties { - amazon_provided_ipv6_cidr_block: amazon_provided_ipv6_cidr_block, - cidr_block: cidr_block, - vpc_id: vpc_id.ok_or(::serde::de::Error::missing_field("VpcId"))?, + Ok(TransitGatewayMulticastGroupSourceProperties { + group_ip_address: group_ip_address.ok_or(::serde::de::Error::missing_field("GroupIpAddress"))?, + network_interface_id: network_interface_id.ok_or(::serde::de::Error::missing_field("NetworkInterfaceId"))?, + transit_gateway_multicast_domain_id: transit_gateway_multicast_domain_id.ok_or(::serde::de::Error::missing_field("TransitGatewayMulticastDomainId"))?, }) } } @@ -7752,85 +8145,120 @@ impl<'de> ::serde::Deserialize<'de> for VPCCidrBlockProperties { } } -impl ::Resource for VPCCidrBlock { - type Properties = VPCCidrBlockProperties; - const TYPE: &'static str = "AWS::EC2::VPCCidrBlock"; - fn properties(&self) -> &VPCCidrBlockProperties { +impl ::Resource for TransitGatewayMulticastGroupSource { + type Properties = TransitGatewayMulticastGroupSourceProperties; + const TYPE: &'static str = "AWS::EC2::TransitGatewayMulticastGroupSource"; + fn properties(&self) -> &TransitGatewayMulticastGroupSourceProperties { &self.properties } - fn properties_mut(&mut self) -> &mut VPCCidrBlockProperties { + fn properties_mut(&mut self) -> &mut TransitGatewayMulticastGroupSourceProperties { &mut self.properties } } -impl ::private::Sealed for VPCCidrBlock {} +impl ::private::Sealed for TransitGatewayMulticastGroupSource {} -impl From for VPCCidrBlock { - fn from(properties: VPCCidrBlockProperties) -> VPCCidrBlock { - VPCCidrBlock { properties } +impl From for TransitGatewayMulticastGroupSource { + fn from(properties: TransitGatewayMulticastGroupSourceProperties) -> TransitGatewayMulticastGroupSource { + TransitGatewayMulticastGroupSource { properties } } } -/// The [`AWS::EC2::VPCDHCPOptionsAssociation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc-dhcp-options-assoc.html) resource type. +/// The [`AWS::EC2::TransitGatewayPeeringAttachment`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaypeeringattachment.html) resource type. #[derive(Debug, Default)] -pub struct VPCDHCPOptionsAssociation { - properties: VPCDHCPOptionsAssociationProperties +pub struct TransitGatewayPeeringAttachment { + properties: TransitGatewayPeeringAttachmentProperties } -/// Properties for the `VPCDHCPOptionsAssociation` resource. +/// Properties for the `TransitGatewayPeeringAttachment` resource. #[derive(Debug, Default)] -pub struct VPCDHCPOptionsAssociationProperties { - /// Property [`DhcpOptionsId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc-dhcp-options-assoc.html#cfn-ec2-vpcdhcpoptionsassociation-dhcpoptionsid). +pub struct TransitGatewayPeeringAttachmentProperties { + /// Property [`PeerAccountId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaypeeringattachment.html#cfn-ec2-transitgatewaypeeringattachment-peeraccountid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub peer_account_id: ::Value, + /// Property [`PeerRegion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaypeeringattachment.html#cfn-ec2-transitgatewaypeeringattachment-peerregion). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub peer_region: ::Value, + /// Property [`PeerTransitGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaypeeringattachment.html#cfn-ec2-transitgatewaypeeringattachment-peertransitgatewayid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub peer_transit_gateway_id: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaypeeringattachment.html#cfn-ec2-transitgatewaypeeringattachment-tags). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub dhcp_options_id: ::Value, - /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc-dhcp-options-assoc.html#cfn-ec2-vpcdhcpoptionsassociation-vpcid). + pub tags: Option<::ValueList<::Tag>>, + /// Property [`TransitGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewaypeeringattachment.html#cfn-ec2-transitgatewaypeeringattachment-transitgatewayid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub vpc_id: ::Value, + pub transit_gateway_id: ::Value, } -impl ::serde::Serialize for VPCDHCPOptionsAssociationProperties { +impl ::serde::Serialize for TransitGatewayPeeringAttachmentProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DhcpOptionsId", &self.dhcp_options_id)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", &self.vpc_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PeerAccountId", &self.peer_account_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PeerRegion", &self.peer_region)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PeerTransitGatewayId", &self.peer_transit_gateway_id)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayId", &self.transit_gateway_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for VPCDHCPOptionsAssociationProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for TransitGatewayPeeringAttachmentProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = VPCDHCPOptionsAssociationProperties; + type Value = TransitGatewayPeeringAttachmentProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type VPCDHCPOptionsAssociationProperties") + write!(f, "a struct of type TransitGatewayPeeringAttachmentProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut dhcp_options_id: Option<::Value> = None; - let mut vpc_id: Option<::Value> = None; + let mut peer_account_id: Option<::Value> = None; + let mut peer_region: Option<::Value> = None; + let mut peer_transit_gateway_id: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut transit_gateway_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "DhcpOptionsId" => { - dhcp_options_id = ::serde::de::MapAccess::next_value(&mut map)?; + "PeerAccountId" => { + peer_account_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "VpcId" => { - vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; + "PeerRegion" => { + peer_region = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PeerTransitGatewayId" => { + peer_transit_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TransitGatewayId" => { + transit_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(VPCDHCPOptionsAssociationProperties { - dhcp_options_id: dhcp_options_id.ok_or(::serde::de::Error::missing_field("DhcpOptionsId"))?, - vpc_id: vpc_id.ok_or(::serde::de::Error::missing_field("VpcId"))?, + Ok(TransitGatewayPeeringAttachmentProperties { + peer_account_id: peer_account_id.ok_or(::serde::de::Error::missing_field("PeerAccountId"))?, + peer_region: peer_region.ok_or(::serde::de::Error::missing_field("PeerRegion"))?, + peer_transit_gateway_id: peer_transit_gateway_id.ok_or(::serde::de::Error::missing_field("PeerTransitGatewayId"))?, + tags: tags, + transit_gateway_id: transit_gateway_id.ok_or(::serde::de::Error::missing_field("TransitGatewayId"))?, }) } } @@ -7839,163 +8267,113 @@ impl<'de> ::serde::Deserialize<'de> for VPCDHCPOptionsAssociationProperties { } } -impl ::Resource for VPCDHCPOptionsAssociation { - type Properties = VPCDHCPOptionsAssociationProperties; - const TYPE: &'static str = "AWS::EC2::VPCDHCPOptionsAssociation"; - fn properties(&self) -> &VPCDHCPOptionsAssociationProperties { +impl ::Resource for TransitGatewayPeeringAttachment { + type Properties = TransitGatewayPeeringAttachmentProperties; + const TYPE: &'static str = "AWS::EC2::TransitGatewayPeeringAttachment"; + fn properties(&self) -> &TransitGatewayPeeringAttachmentProperties { &self.properties } - fn properties_mut(&mut self) -> &mut VPCDHCPOptionsAssociationProperties { + fn properties_mut(&mut self) -> &mut TransitGatewayPeeringAttachmentProperties { &mut self.properties } } -impl ::private::Sealed for VPCDHCPOptionsAssociation {} +impl ::private::Sealed for TransitGatewayPeeringAttachment {} -impl From for VPCDHCPOptionsAssociation { - fn from(properties: VPCDHCPOptionsAssociationProperties) -> VPCDHCPOptionsAssociation { - VPCDHCPOptionsAssociation { properties } +impl From for TransitGatewayPeeringAttachment { + fn from(properties: TransitGatewayPeeringAttachmentProperties) -> TransitGatewayPeeringAttachment { + TransitGatewayPeeringAttachment { properties } } } -/// The [`AWS::EC2::VPCEndpoint`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html) resource type. +/// The [`AWS::EC2::TransitGatewayRoute`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroute.html) resource type. #[derive(Debug, Default)] -pub struct VPCEndpoint { - properties: VPCEndpointProperties +pub struct TransitGatewayRoute { + properties: TransitGatewayRouteProperties } -/// Properties for the `VPCEndpoint` resource. +/// Properties for the `TransitGatewayRoute` resource. #[derive(Debug, Default)] -pub struct VPCEndpointProperties { - /// Property [`PolicyDocument`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-policydocument). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub policy_document: Option<::Value<::json::Value>>, - /// Property [`PrivateDnsEnabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-privatednsenabled). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub private_dns_enabled: Option<::Value>, - /// Property [`RouteTableIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-routetableids). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub route_table_ids: Option<::ValueList>, - /// Property [`SecurityGroupIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-securitygroupids). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub security_group_ids: Option<::ValueList>, - /// Property [`ServiceName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-servicename). +pub struct TransitGatewayRouteProperties { + /// Property [`Blackhole`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroute.html#cfn-ec2-transitgatewayroute-blackhole). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub service_name: ::Value, - /// Property [`SubnetIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-subnetids). + pub blackhole: Option<::Value>, + /// Property [`DestinationCidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroute.html#cfn-ec2-transitgatewayroute-destinationcidrblock). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub subnet_ids: Option<::ValueList>, - /// Property [`VpcEndpointType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-vpcendpointtype). + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub destination_cidr_block: Option<::Value>, + /// Property [`TransitGatewayAttachmentId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroute.html#cfn-ec2-transitgatewayroute-transitgatewayattachmentid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub vpc_endpoint_type: Option<::Value>, - /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-vpcid). + pub transit_gateway_attachment_id: Option<::Value>, + /// Property [`TransitGatewayRouteTableId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroute.html#cfn-ec2-transitgatewayroute-transitgatewayroutetableid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub vpc_id: ::Value, + pub transit_gateway_route_table_id: ::Value, } -impl ::serde::Serialize for VPCEndpointProperties { +impl ::serde::Serialize for TransitGatewayRouteProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref policy_document) = self.policy_document { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PolicyDocument", policy_document)?; - } - if let Some(ref private_dns_enabled) = self.private_dns_enabled { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateDnsEnabled", private_dns_enabled)?; - } - if let Some(ref route_table_ids) = self.route_table_ids { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "RouteTableIds", route_table_ids)?; - } - if let Some(ref security_group_ids) = self.security_group_ids { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityGroupIds", security_group_ids)?; + if let Some(ref blackhole) = self.blackhole { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Blackhole", blackhole)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServiceName", &self.service_name)?; - if let Some(ref subnet_ids) = self.subnet_ids { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetIds", subnet_ids)?; + if let Some(ref destination_cidr_block) = self.destination_cidr_block { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationCidrBlock", destination_cidr_block)?; } - if let Some(ref vpc_endpoint_type) = self.vpc_endpoint_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcEndpointType", vpc_endpoint_type)?; + if let Some(ref transit_gateway_attachment_id) = self.transit_gateway_attachment_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayAttachmentId", transit_gateway_attachment_id)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", &self.vpc_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayRouteTableId", &self.transit_gateway_route_table_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for VPCEndpointProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for TransitGatewayRouteProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = VPCEndpointProperties; + type Value = TransitGatewayRouteProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type VPCEndpointProperties") + write!(f, "a struct of type TransitGatewayRouteProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut policy_document: Option<::Value<::json::Value>> = None; - let mut private_dns_enabled: Option<::Value> = None; - let mut route_table_ids: Option<::ValueList> = None; - let mut security_group_ids: Option<::ValueList> = None; - let mut service_name: Option<::Value> = None; - let mut subnet_ids: Option<::ValueList> = None; - let mut vpc_endpoint_type: Option<::Value> = None; - let mut vpc_id: Option<::Value> = None; + let mut blackhole: Option<::Value> = None; + let mut destination_cidr_block: Option<::Value> = None; + let mut transit_gateway_attachment_id: Option<::Value> = None; + let mut transit_gateway_route_table_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "PolicyDocument" => { - policy_document = ::serde::de::MapAccess::next_value(&mut map)?; + "Blackhole" => { + blackhole = ::serde::de::MapAccess::next_value(&mut map)?; } - "PrivateDnsEnabled" => { - private_dns_enabled = ::serde::de::MapAccess::next_value(&mut map)?; + "DestinationCidrBlock" => { + destination_cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; } - "RouteTableIds" => { - route_table_ids = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SecurityGroupIds" => { - security_group_ids = ::serde::de::MapAccess::next_value(&mut map)?; - } - "ServiceName" => { - service_name = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SubnetIds" => { - subnet_ids = ::serde::de::MapAccess::next_value(&mut map)?; - } - "VpcEndpointType" => { - vpc_endpoint_type = ::serde::de::MapAccess::next_value(&mut map)?; + "TransitGatewayAttachmentId" => { + transit_gateway_attachment_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "VpcId" => { - vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; + "TransitGatewayRouteTableId" => { + transit_gateway_route_table_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(VPCEndpointProperties { - policy_document: policy_document, - private_dns_enabled: private_dns_enabled, - route_table_ids: route_table_ids, - security_group_ids: security_group_ids, - service_name: service_name.ok_or(::serde::de::Error::missing_field("ServiceName"))?, - subnet_ids: subnet_ids, - vpc_endpoint_type: vpc_endpoint_type, - vpc_id: vpc_id.ok_or(::serde::de::Error::missing_field("VpcId"))?, + Ok(TransitGatewayRouteProperties { + blackhole: blackhole, + destination_cidr_block: destination_cidr_block, + transit_gateway_attachment_id: transit_gateway_attachment_id, + transit_gateway_route_table_id: transit_gateway_route_table_id.ok_or(::serde::de::Error::missing_field("TransitGatewayRouteTableId"))?, }) } } @@ -8004,111 +8382,87 @@ impl<'de> ::serde::Deserialize<'de> for VPCEndpointProperties { } } -impl ::Resource for VPCEndpoint { - type Properties = VPCEndpointProperties; - const TYPE: &'static str = "AWS::EC2::VPCEndpoint"; - fn properties(&self) -> &VPCEndpointProperties { +impl ::Resource for TransitGatewayRoute { + type Properties = TransitGatewayRouteProperties; + const TYPE: &'static str = "AWS::EC2::TransitGatewayRoute"; + fn properties(&self) -> &TransitGatewayRouteProperties { &self.properties } - fn properties_mut(&mut self) -> &mut VPCEndpointProperties { + fn properties_mut(&mut self) -> &mut TransitGatewayRouteProperties { &mut self.properties } } -impl ::private::Sealed for VPCEndpoint {} +impl ::private::Sealed for TransitGatewayRoute {} -impl From for VPCEndpoint { - fn from(properties: VPCEndpointProperties) -> VPCEndpoint { - VPCEndpoint { properties } +impl From for TransitGatewayRoute { + fn from(properties: TransitGatewayRouteProperties) -> TransitGatewayRoute { + TransitGatewayRoute { properties } } } -/// The [`AWS::EC2::VPCEndpointConnectionNotification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointconnectionnotification.html) resource type. +/// The [`AWS::EC2::TransitGatewayRouteTable`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetable.html) resource type. #[derive(Debug, Default)] -pub struct VPCEndpointConnectionNotification { - properties: VPCEndpointConnectionNotificationProperties +pub struct TransitGatewayRouteTable { + properties: TransitGatewayRouteTableProperties } -/// Properties for the `VPCEndpointConnectionNotification` resource. +/// Properties for the `TransitGatewayRouteTable` resource. #[derive(Debug, Default)] -pub struct VPCEndpointConnectionNotificationProperties { - /// Property [`ConnectionEvents`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointconnectionnotification.html#cfn-ec2-vpcendpointconnectionnotification-connectionevents). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub connection_events: ::ValueList, - /// Property [`ConnectionNotificationArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointconnectionnotification.html#cfn-ec2-vpcendpointconnectionnotification-connectionnotificationarn). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub connection_notification_arn: ::Value, - /// Property [`ServiceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointconnectionnotification.html#cfn-ec2-vpcendpointconnectionnotification-serviceid). +pub struct TransitGatewayRouteTableProperties { + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetable.html#cfn-ec2-transitgatewayroutetable-tags). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub service_id: Option<::Value>, - /// Property [`VPCEndpointId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointconnectionnotification.html#cfn-ec2-vpcendpointconnectionnotification-vpcendpointid). + pub tags: Option<::ValueList<::Tag>>, + /// Property [`TransitGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetable.html#cfn-ec2-transitgatewayroutetable-transitgatewayid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub vpc_endpoint_id: Option<::Value>, + pub transit_gateway_id: ::Value, } -impl ::serde::Serialize for VPCEndpointConnectionNotificationProperties { +impl ::serde::Serialize for TransitGatewayRouteTableProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConnectionEvents", &self.connection_events)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConnectionNotificationArn", &self.connection_notification_arn)?; - if let Some(ref service_id) = self.service_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServiceId", service_id)?; - } - if let Some(ref vpc_endpoint_id) = self.vpc_endpoint_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VPCEndpointId", vpc_endpoint_id)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayId", &self.transit_gateway_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for VPCEndpointConnectionNotificationProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for TransitGatewayRouteTableProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = VPCEndpointConnectionNotificationProperties; + type Value = TransitGatewayRouteTableProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type VPCEndpointConnectionNotificationProperties") + write!(f, "a struct of type TransitGatewayRouteTableProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut connection_events: Option<::ValueList> = None; - let mut connection_notification_arn: Option<::Value> = None; - let mut service_id: Option<::Value> = None; - let mut vpc_endpoint_id: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut transit_gateway_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "ConnectionEvents" => { - connection_events = ::serde::de::MapAccess::next_value(&mut map)?; - } - "ConnectionNotificationArn" => { - connection_notification_arn = ::serde::de::MapAccess::next_value(&mut map)?; - } - "ServiceId" => { - service_id = ::serde::de::MapAccess::next_value(&mut map)?; + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; } - "VPCEndpointId" => { - vpc_endpoint_id = ::serde::de::MapAccess::next_value(&mut map)?; + "TransitGatewayId" => { + transit_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(VPCEndpointConnectionNotificationProperties { - connection_events: connection_events.ok_or(::serde::de::Error::missing_field("ConnectionEvents"))?, - connection_notification_arn: connection_notification_arn.ok_or(::serde::de::Error::missing_field("ConnectionNotificationArn"))?, - service_id: service_id, - vpc_endpoint_id: vpc_endpoint_id, + Ok(TransitGatewayRouteTableProperties { + tags: tags, + transit_gateway_id: transit_gateway_id.ok_or(::serde::de::Error::missing_field("TransitGatewayId"))?, }) } } @@ -8117,102 +8471,85 @@ impl<'de> ::serde::Deserialize<'de> for VPCEndpointConnectionNotificationPropert } } -impl ::Resource for VPCEndpointConnectionNotification { - type Properties = VPCEndpointConnectionNotificationProperties; - const TYPE: &'static str = "AWS::EC2::VPCEndpointConnectionNotification"; - fn properties(&self) -> &VPCEndpointConnectionNotificationProperties { +impl ::Resource for TransitGatewayRouteTable { + type Properties = TransitGatewayRouteTableProperties; + const TYPE: &'static str = "AWS::EC2::TransitGatewayRouteTable"; + fn properties(&self) -> &TransitGatewayRouteTableProperties { &self.properties } - fn properties_mut(&mut self) -> &mut VPCEndpointConnectionNotificationProperties { + fn properties_mut(&mut self) -> &mut TransitGatewayRouteTableProperties { &mut self.properties } } -impl ::private::Sealed for VPCEndpointConnectionNotification {} +impl ::private::Sealed for TransitGatewayRouteTable {} -impl From for VPCEndpointConnectionNotification { - fn from(properties: VPCEndpointConnectionNotificationProperties) -> VPCEndpointConnectionNotification { - VPCEndpointConnectionNotification { properties } +impl From for TransitGatewayRouteTable { + fn from(properties: TransitGatewayRouteTableProperties) -> TransitGatewayRouteTable { + TransitGatewayRouteTable { properties } } } -/// The [`AWS::EC2::VPCEndpointService`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservice.html) resource type. +/// The [`AWS::EC2::TransitGatewayRouteTableAssociation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetableassociation.html) resource type. #[derive(Debug, Default)] -pub struct VPCEndpointService { - properties: VPCEndpointServiceProperties +pub struct TransitGatewayRouteTableAssociation { + properties: TransitGatewayRouteTableAssociationProperties } -/// Properties for the `VPCEndpointService` resource. +/// Properties for the `TransitGatewayRouteTableAssociation` resource. #[derive(Debug, Default)] -pub struct VPCEndpointServiceProperties { - /// Property [`AcceptanceRequired`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservice.html#cfn-ec2-vpcendpointservice-acceptancerequired). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub acceptance_required: Option<::Value>, - /// Property [`GatewayLoadBalancerArns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservice.html#cfn-ec2-vpcendpointservice-gatewayloadbalancerarns). +pub struct TransitGatewayRouteTableAssociationProperties { + /// Property [`TransitGatewayAttachmentId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetableassociation.html#cfn-ec2-transitgatewayroutetableassociation-transitgatewayattachmentid). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub gateway_load_balancer_arns: Option<::ValueList>, - /// Property [`NetworkLoadBalancerArns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservice.html#cfn-ec2-vpcendpointservice-networkloadbalancerarns). + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub transit_gateway_attachment_id: ::Value, + /// Property [`TransitGatewayRouteTableId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetableassociation.html#cfn-ec2-transitgatewayroutetableassociation-transitgatewayroutetableid). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub network_load_balancer_arns: Option<::ValueList>, + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub transit_gateway_route_table_id: ::Value, } -impl ::serde::Serialize for VPCEndpointServiceProperties { +impl ::serde::Serialize for TransitGatewayRouteTableAssociationProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref acceptance_required) = self.acceptance_required { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcceptanceRequired", acceptance_required)?; - } - if let Some(ref gateway_load_balancer_arns) = self.gateway_load_balancer_arns { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "GatewayLoadBalancerArns", gateway_load_balancer_arns)?; - } - if let Some(ref network_load_balancer_arns) = self.network_load_balancer_arns { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkLoadBalancerArns", network_load_balancer_arns)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayAttachmentId", &self.transit_gateway_attachment_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayRouteTableId", &self.transit_gateway_route_table_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for VPCEndpointServiceProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for TransitGatewayRouteTableAssociationProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = VPCEndpointServiceProperties; + type Value = TransitGatewayRouteTableAssociationProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type VPCEndpointServiceProperties") + write!(f, "a struct of type TransitGatewayRouteTableAssociationProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut acceptance_required: Option<::Value> = None; - let mut gateway_load_balancer_arns: Option<::ValueList> = None; - let mut network_load_balancer_arns: Option<::ValueList> = None; + let mut transit_gateway_attachment_id: Option<::Value> = None; + let mut transit_gateway_route_table_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "AcceptanceRequired" => { - acceptance_required = ::serde::de::MapAccess::next_value(&mut map)?; - } - "GatewayLoadBalancerArns" => { - gateway_load_balancer_arns = ::serde::de::MapAccess::next_value(&mut map)?; + "TransitGatewayAttachmentId" => { + transit_gateway_attachment_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "NetworkLoadBalancerArns" => { - network_load_balancer_arns = ::serde::de::MapAccess::next_value(&mut map)?; + "TransitGatewayRouteTableId" => { + transit_gateway_route_table_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(VPCEndpointServiceProperties { - acceptance_required: acceptance_required, - gateway_load_balancer_arns: gateway_load_balancer_arns, - network_load_balancer_arns: network_load_balancer_arns, + Ok(TransitGatewayRouteTableAssociationProperties { + transit_gateway_attachment_id: transit_gateway_attachment_id.ok_or(::serde::de::Error::missing_field("TransitGatewayAttachmentId"))?, + transit_gateway_route_table_id: transit_gateway_route_table_id.ok_or(::serde::de::Error::missing_field("TransitGatewayRouteTableId"))?, }) } } @@ -8221,87 +8558,85 @@ impl<'de> ::serde::Deserialize<'de> for VPCEndpointServiceProperties { } } -impl ::Resource for VPCEndpointService { - type Properties = VPCEndpointServiceProperties; - const TYPE: &'static str = "AWS::EC2::VPCEndpointService"; - fn properties(&self) -> &VPCEndpointServiceProperties { +impl ::Resource for TransitGatewayRouteTableAssociation { + type Properties = TransitGatewayRouteTableAssociationProperties; + const TYPE: &'static str = "AWS::EC2::TransitGatewayRouteTableAssociation"; + fn properties(&self) -> &TransitGatewayRouteTableAssociationProperties { &self.properties } - fn properties_mut(&mut self) -> &mut VPCEndpointServiceProperties { + fn properties_mut(&mut self) -> &mut TransitGatewayRouteTableAssociationProperties { &mut self.properties } } -impl ::private::Sealed for VPCEndpointService {} +impl ::private::Sealed for TransitGatewayRouteTableAssociation {} -impl From for VPCEndpointService { - fn from(properties: VPCEndpointServiceProperties) -> VPCEndpointService { - VPCEndpointService { properties } +impl From for TransitGatewayRouteTableAssociation { + fn from(properties: TransitGatewayRouteTableAssociationProperties) -> TransitGatewayRouteTableAssociation { + TransitGatewayRouteTableAssociation { properties } } } -/// The [`AWS::EC2::VPCEndpointServicePermissions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservicepermissions.html) resource type. +/// The [`AWS::EC2::TransitGatewayRouteTablePropagation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetablepropagation.html) resource type. #[derive(Debug, Default)] -pub struct VPCEndpointServicePermissions { - properties: VPCEndpointServicePermissionsProperties +pub struct TransitGatewayRouteTablePropagation { + properties: TransitGatewayRouteTablePropagationProperties } -/// Properties for the `VPCEndpointServicePermissions` resource. +/// Properties for the `TransitGatewayRouteTablePropagation` resource. #[derive(Debug, Default)] -pub struct VPCEndpointServicePermissionsProperties { - /// Property [`AllowedPrincipals`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservicepermissions.html#cfn-ec2-vpcendpointservicepermissions-allowedprincipals). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub allowed_principals: Option<::ValueList>, - /// Property [`ServiceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservicepermissions.html#cfn-ec2-vpcendpointservicepermissions-serviceid). +pub struct TransitGatewayRouteTablePropagationProperties { + /// Property [`TransitGatewayAttachmentId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetablepropagation.html#cfn-ec2-transitgatewayroutetablepropagation-transitgatewayattachmentid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub service_id: ::Value, + pub transit_gateway_attachment_id: ::Value, + /// Property [`TransitGatewayRouteTableId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayroutetablepropagation.html#cfn-ec2-transitgatewayroutetablepropagation-transitgatewayroutetableid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub transit_gateway_route_table_id: ::Value, } -impl ::serde::Serialize for VPCEndpointServicePermissionsProperties { +impl ::serde::Serialize for TransitGatewayRouteTablePropagationProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref allowed_principals) = self.allowed_principals { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AllowedPrincipals", allowed_principals)?; - } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServiceId", &self.service_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayAttachmentId", &self.transit_gateway_attachment_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayRouteTableId", &self.transit_gateway_route_table_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for VPCEndpointServicePermissionsProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for TransitGatewayRouteTablePropagationProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = VPCEndpointServicePermissionsProperties; + type Value = TransitGatewayRouteTablePropagationProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type VPCEndpointServicePermissionsProperties") + write!(f, "a struct of type TransitGatewayRouteTablePropagationProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut allowed_principals: Option<::ValueList> = None; - let mut service_id: Option<::Value> = None; + let mut transit_gateway_attachment_id: Option<::Value> = None; + let mut transit_gateway_route_table_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "AllowedPrincipals" => { - allowed_principals = ::serde::de::MapAccess::next_value(&mut map)?; + "TransitGatewayAttachmentId" => { + transit_gateway_attachment_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "ServiceId" => { - service_id = ::serde::de::MapAccess::next_value(&mut map)?; + "TransitGatewayRouteTableId" => { + transit_gateway_route_table_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(VPCEndpointServicePermissionsProperties { - allowed_principals: allowed_principals, - service_id: service_id.ok_or(::serde::de::Error::missing_field("ServiceId"))?, + Ok(TransitGatewayRouteTablePropagationProperties { + transit_gateway_attachment_id: transit_gateway_attachment_id.ok_or(::serde::de::Error::missing_field("TransitGatewayAttachmentId"))?, + transit_gateway_route_table_id: transit_gateway_route_table_id.ok_or(::serde::de::Error::missing_field("TransitGatewayRouteTableId"))?, }) } } @@ -8310,100 +8645,148 @@ impl<'de> ::serde::Deserialize<'de> for VPCEndpointServicePermissionsProperties } } -impl ::Resource for VPCEndpointServicePermissions { - type Properties = VPCEndpointServicePermissionsProperties; - const TYPE: &'static str = "AWS::EC2::VPCEndpointServicePermissions"; - fn properties(&self) -> &VPCEndpointServicePermissionsProperties { +impl ::Resource for TransitGatewayRouteTablePropagation { + type Properties = TransitGatewayRouteTablePropagationProperties; + const TYPE: &'static str = "AWS::EC2::TransitGatewayRouteTablePropagation"; + fn properties(&self) -> &TransitGatewayRouteTablePropagationProperties { &self.properties } - fn properties_mut(&mut self) -> &mut VPCEndpointServicePermissionsProperties { + fn properties_mut(&mut self) -> &mut TransitGatewayRouteTablePropagationProperties { &mut self.properties } } -impl ::private::Sealed for VPCEndpointServicePermissions {} +impl ::private::Sealed for TransitGatewayRouteTablePropagation {} -impl From for VPCEndpointServicePermissions { - fn from(properties: VPCEndpointServicePermissionsProperties) -> VPCEndpointServicePermissions { - VPCEndpointServicePermissions { properties } +impl From for TransitGatewayRouteTablePropagation { + fn from(properties: TransitGatewayRouteTablePropagationProperties) -> TransitGatewayRouteTablePropagation { + TransitGatewayRouteTablePropagation { properties } } } -/// The [`AWS::EC2::VPCGatewayAttachment`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc-gateway-attachment.html) resource type. +/// The [`AWS::EC2::TransitGatewayVpcAttachment`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayvpcattachment.html) resource type. #[derive(Debug, Default)] -pub struct VPCGatewayAttachment { - properties: VPCGatewayAttachmentProperties +pub struct TransitGatewayVpcAttachment { + properties: TransitGatewayVpcAttachmentProperties } -/// Properties for the `VPCGatewayAttachment` resource. +/// Properties for the `TransitGatewayVpcAttachment` resource. #[derive(Debug, Default)] -pub struct VPCGatewayAttachmentProperties { - /// Property [`InternetGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc-gateway-attachment.html#cfn-ec2-vpcgatewayattachment-internetgatewayid). +pub struct TransitGatewayVpcAttachmentProperties { + /// Property [`AddSubnetIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayvpcattachment.html#cfn-ec2-transitgatewayvpcattachment-addsubnetids). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub internet_gateway_id: Option<::Value>, - /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc-gateway-attachment.html#cfn-ec2-vpcgatewayattachment-vpcid). + pub add_subnet_ids: Option<::ValueList>, + /// Property [`Options`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayvpcattachment.html#cfn-ec2-transitgatewayvpcattachment-options). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub vpc_id: ::Value, - /// Property [`VpnGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc-gateway-attachment.html#cfn-ec2-vpcgatewayattachment-vpngatewayid). + pub options: Option<::Value<::json::Value>>, + /// Property [`RemoveSubnetIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayvpcattachment.html#cfn-ec2-transitgatewayvpcattachment-removesubnetids). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub vpn_gateway_id: Option<::Value>, + pub remove_subnet_ids: Option<::ValueList>, + /// Property [`SubnetIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayvpcattachment.html#cfn-ec2-transitgatewayvpcattachment-subnetids). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub subnet_ids: ::ValueList, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayvpcattachment.html#cfn-ec2-transitgatewayvpcattachment-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`TransitGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayvpcattachment.html#cfn-ec2-transitgatewayvpcattachment-transitgatewayid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub transit_gateway_id: ::Value, + /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-transitgatewayvpcattachment.html#cfn-ec2-transitgatewayvpcattachment-vpcid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub vpc_id: ::Value, } -impl ::serde::Serialize for VPCGatewayAttachmentProperties { +impl ::serde::Serialize for TransitGatewayVpcAttachmentProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref internet_gateway_id) = self.internet_gateway_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "InternetGatewayId", internet_gateway_id)?; + if let Some(ref add_subnet_ids) = self.add_subnet_ids { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AddSubnetIds", add_subnet_ids)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", &self.vpc_id)?; - if let Some(ref vpn_gateway_id) = self.vpn_gateway_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpnGatewayId", vpn_gateway_id)?; + if let Some(ref options) = self.options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Options", options)?; + } + if let Some(ref remove_subnet_ids) = self.remove_subnet_ids { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RemoveSubnetIds", remove_subnet_ids)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetIds", &self.subnet_ids)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayId", &self.transit_gateway_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", &self.vpc_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for VPCGatewayAttachmentProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for TransitGatewayVpcAttachmentProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = VPCGatewayAttachmentProperties; + type Value = TransitGatewayVpcAttachmentProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type VPCGatewayAttachmentProperties") + write!(f, "a struct of type TransitGatewayVpcAttachmentProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut internet_gateway_id: Option<::Value> = None; + let mut add_subnet_ids: Option<::ValueList> = None; + let mut options: Option<::Value<::json::Value>> = None; + let mut remove_subnet_ids: Option<::ValueList> = None; + let mut subnet_ids: Option<::ValueList> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut transit_gateway_id: Option<::Value> = None; let mut vpc_id: Option<::Value> = None; - let mut vpn_gateway_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "InternetGatewayId" => { - internet_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; + "AddSubnetIds" => { + add_subnet_ids = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Options" => { + options = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RemoveSubnetIds" => { + remove_subnet_ids = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SubnetIds" => { + subnet_ids = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TransitGatewayId" => { + transit_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; } "VpcId" => { vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "VpnGatewayId" => { - vpn_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; - } _ => {} } } - Ok(VPCGatewayAttachmentProperties { - internet_gateway_id: internet_gateway_id, + Ok(TransitGatewayVpcAttachmentProperties { + add_subnet_ids: add_subnet_ids, + options: options, + remove_subnet_ids: remove_subnet_ids, + subnet_ids: subnet_ids.ok_or(::serde::de::Error::missing_field("SubnetIds"))?, + tags: tags, + transit_gateway_id: transit_gateway_id.ok_or(::serde::de::Error::missing_field("TransitGatewayId"))?, vpc_id: vpc_id.ok_or(::serde::de::Error::missing_field("VpcId"))?, - vpn_gateway_id: vpn_gateway_id, }) } } @@ -8412,137 +8795,152 @@ impl<'de> ::serde::Deserialize<'de> for VPCGatewayAttachmentProperties { } } -impl ::Resource for VPCGatewayAttachment { - type Properties = VPCGatewayAttachmentProperties; - const TYPE: &'static str = "AWS::EC2::VPCGatewayAttachment"; - fn properties(&self) -> &VPCGatewayAttachmentProperties { +impl ::Resource for TransitGatewayVpcAttachment { + type Properties = TransitGatewayVpcAttachmentProperties; + const TYPE: &'static str = "AWS::EC2::TransitGatewayVpcAttachment"; + fn properties(&self) -> &TransitGatewayVpcAttachmentProperties { &self.properties } - fn properties_mut(&mut self) -> &mut VPCGatewayAttachmentProperties { + fn properties_mut(&mut self) -> &mut TransitGatewayVpcAttachmentProperties { &mut self.properties } } -impl ::private::Sealed for VPCGatewayAttachment {} +impl ::private::Sealed for TransitGatewayVpcAttachment {} -impl From for VPCGatewayAttachment { - fn from(properties: VPCGatewayAttachmentProperties) -> VPCGatewayAttachment { - VPCGatewayAttachment { properties } +impl From for TransitGatewayVpcAttachment { + fn from(properties: TransitGatewayVpcAttachmentProperties) -> TransitGatewayVpcAttachment { + TransitGatewayVpcAttachment { properties } } } -/// The [`AWS::EC2::VPCPeeringConnection`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcpeeringconnection.html) resource type. +/// The [`AWS::EC2::VPC`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html) resource type. #[derive(Debug, Default)] -pub struct VPCPeeringConnection { - properties: VPCPeeringConnectionProperties +pub struct VPC { + properties: VPCProperties } -/// Properties for the `VPCPeeringConnection` resource. +/// Properties for the `VPC` resource. #[derive(Debug, Default)] -pub struct VPCPeeringConnectionProperties { - /// Property [`PeerOwnerId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcpeeringconnection.html#cfn-ec2-vpcpeeringconnection-peerownerid). +pub struct VPCProperties { + /// Property [`CidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html#cfn-aws-ec2-vpc-cidrblock). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub peer_owner_id: Option<::Value>, - /// Property [`PeerRegion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcpeeringconnection.html#cfn-ec2-vpcpeeringconnection-peerregion). + pub cidr_block: ::Value, + /// Property [`EnableDnsHostnames`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html#cfn-aws-ec2-vpc-EnableDnsHostnames). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub peer_region: Option<::Value>, - /// Property [`PeerRoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcpeeringconnection.html#cfn-ec2-vpcpeeringconnection-peerrolearn). + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enable_dns_hostnames: Option<::Value>, + /// Property [`EnableDnsSupport`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html#cfn-aws-ec2-vpc-EnableDnsSupport). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enable_dns_support: Option<::Value>, + /// Property [`InstanceTenancy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html#cfn-aws-ec2-vpc-instancetenancy). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub instance_tenancy: Option<::Value>, + /// Property [`Ipv4IpamPoolId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html#cfn-ec2-vpc-ipv4ipampoolid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub peer_role_arn: Option<::Value>, - /// Property [`PeerVpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcpeeringconnection.html#cfn-ec2-vpcpeeringconnection-peervpcid). + pub ipv4_ipam_pool_id: Option<::Value>, + /// Property [`Ipv4NetmaskLength`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html#cfn-ec2-vpc-ipv4netmasklength). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub peer_vpc_id: ::Value, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcpeeringconnection.html#cfn-ec2-vpcpeeringconnection-tags). + pub ipv4_netmask_length: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html#cfn-aws-ec2-vpc-tags). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub tags: Option<::ValueList<::Tag>>, - /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcpeeringconnection.html#cfn-ec2-vpcpeeringconnection-vpcid). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub vpc_id: ::Value, } -impl ::serde::Serialize for VPCPeeringConnectionProperties { +impl ::serde::Serialize for VPCProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref peer_owner_id) = self.peer_owner_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PeerOwnerId", peer_owner_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CidrBlock", &self.cidr_block)?; + if let Some(ref enable_dns_hostnames) = self.enable_dns_hostnames { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EnableDnsHostnames", enable_dns_hostnames)?; } - if let Some(ref peer_region) = self.peer_region { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PeerRegion", peer_region)?; + if let Some(ref enable_dns_support) = self.enable_dns_support { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EnableDnsSupport", enable_dns_support)?; } - if let Some(ref peer_role_arn) = self.peer_role_arn { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PeerRoleArn", peer_role_arn)?; + if let Some(ref instance_tenancy) = self.instance_tenancy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceTenancy", instance_tenancy)?; + } + if let Some(ref ipv4_ipam_pool_id) = self.ipv4_ipam_pool_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv4IpamPoolId", ipv4_ipam_pool_id)?; + } + if let Some(ref ipv4_netmask_length) = self.ipv4_netmask_length { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv4NetmaskLength", ipv4_netmask_length)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PeerVpcId", &self.peer_vpc_id)?; if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", &self.vpc_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for VPCPeeringConnectionProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for VPCProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = VPCPeeringConnectionProperties; + type Value = VPCProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type VPCPeeringConnectionProperties") + write!(f, "a struct of type VPCProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut peer_owner_id: Option<::Value> = None; - let mut peer_region: Option<::Value> = None; - let mut peer_role_arn: Option<::Value> = None; - let mut peer_vpc_id: Option<::Value> = None; + let mut cidr_block: Option<::Value> = None; + let mut enable_dns_hostnames: Option<::Value> = None; + let mut enable_dns_support: Option<::Value> = None; + let mut instance_tenancy: Option<::Value> = None; + let mut ipv4_ipam_pool_id: Option<::Value> = None; + let mut ipv4_netmask_length: Option<::Value> = None; let mut tags: Option<::ValueList<::Tag>> = None; - let mut vpc_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "PeerOwnerId" => { - peer_owner_id = ::serde::de::MapAccess::next_value(&mut map)?; + "CidrBlock" => { + cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; } - "PeerRegion" => { - peer_region = ::serde::de::MapAccess::next_value(&mut map)?; + "EnableDnsHostnames" => { + enable_dns_hostnames = ::serde::de::MapAccess::next_value(&mut map)?; } - "PeerRoleArn" => { - peer_role_arn = ::serde::de::MapAccess::next_value(&mut map)?; + "EnableDnsSupport" => { + enable_dns_support = ::serde::de::MapAccess::next_value(&mut map)?; } - "PeerVpcId" => { - peer_vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; + "InstanceTenancy" => { + instance_tenancy = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Ipv4IpamPoolId" => { + ipv4_ipam_pool_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Ipv4NetmaskLength" => { + ipv4_netmask_length = ::serde::de::MapAccess::next_value(&mut map)?; } "Tags" => { tags = ::serde::de::MapAccess::next_value(&mut map)?; } - "VpcId" => { - vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; - } _ => {} } } - Ok(VPCPeeringConnectionProperties { - peer_owner_id: peer_owner_id, - peer_region: peer_region, - peer_role_arn: peer_role_arn, - peer_vpc_id: peer_vpc_id.ok_or(::serde::de::Error::missing_field("PeerVpcId"))?, + Ok(VPCProperties { + cidr_block: cidr_block.ok_or(::serde::de::Error::missing_field("CidrBlock"))?, + enable_dns_hostnames: enable_dns_hostnames, + enable_dns_support: enable_dns_support, + instance_tenancy: instance_tenancy, + ipv4_ipam_pool_id: ipv4_ipam_pool_id, + ipv4_netmask_length: ipv4_netmask_length, tags: tags, - vpc_id: vpc_id.ok_or(::serde::de::Error::missing_field("VpcId"))?, }) } } @@ -8551,150 +8949,178 @@ impl<'de> ::serde::Deserialize<'de> for VPCPeeringConnectionProperties { } } -impl ::Resource for VPCPeeringConnection { - type Properties = VPCPeeringConnectionProperties; - const TYPE: &'static str = "AWS::EC2::VPCPeeringConnection"; - fn properties(&self) -> &VPCPeeringConnectionProperties { +impl ::Resource for VPC { + type Properties = VPCProperties; + const TYPE: &'static str = "AWS::EC2::VPC"; + fn properties(&self) -> &VPCProperties { &self.properties } - fn properties_mut(&mut self) -> &mut VPCPeeringConnectionProperties { + fn properties_mut(&mut self) -> &mut VPCProperties { &mut self.properties } } -impl ::private::Sealed for VPCPeeringConnection {} +impl ::private::Sealed for VPC {} -impl From for VPCPeeringConnection { - fn from(properties: VPCPeeringConnectionProperties) -> VPCPeeringConnection { - VPCPeeringConnection { properties } +impl From for VPC { + fn from(properties: VPCProperties) -> VPC { + VPC { properties } } } -/// The [`AWS::EC2::VPNConnection`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection.html) resource type. +/// The [`AWS::EC2::VPCCidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html) resource type. #[derive(Debug, Default)] -pub struct VPNConnection { - properties: VPNConnectionProperties +pub struct VPCCidrBlock { + properties: VPCCidrBlockProperties } -/// Properties for the `VPNConnection` resource. +/// Properties for the `VPCCidrBlock` resource. #[derive(Debug, Default)] -pub struct VPNConnectionProperties { - /// Property [`CustomerGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection.html#cfn-ec2-vpnconnection-customergatewayid). +pub struct VPCCidrBlockProperties { + /// Property [`AmazonProvidedIpv6CidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html#cfn-ec2-vpccidrblock-amazonprovidedipv6cidrblock). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub customer_gateway_id: ::Value, - /// Property [`StaticRoutesOnly`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection.html#cfn-ec2-vpnconnection-StaticRoutesOnly). + pub amazon_provided_ipv6_cidr_block: Option<::Value>, + /// Property [`CidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html#cfn-ec2-vpccidrblock-cidrblock). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub static_routes_only: Option<::Value>, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection.html#cfn-ec2-vpnconnection-tags). + pub cidr_block: Option<::Value>, + /// Property [`Ipv4IpamPoolId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html#cfn-ec2-vpccidrblock-ipv4ipampoolid). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub tags: Option<::ValueList<::Tag>>, - /// Property [`TransitGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection.html#cfn-ec2-vpnconnection-transitgatewayid). + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub ipv4_ipam_pool_id: Option<::Value>, + /// Property [`Ipv4NetmaskLength`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html#cfn-ec2-vpccidrblock-ipv4netmasklength). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub transit_gateway_id: Option<::Value>, - /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection.html#cfn-ec2-vpnconnection-type). + pub ipv4_netmask_length: Option<::Value>, + /// Property [`Ipv6CidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html#cfn-ec2-vpccidrblock-ipv6cidrblock). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub r#type: ::Value, - /// Property [`VpnGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection.html#cfn-ec2-vpnconnection-vpngatewayid). + pub ipv6_cidr_block: Option<::Value>, + /// Property [`Ipv6IpamPoolId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html#cfn-ec2-vpccidrblock-ipv6ipampoolid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub vpn_gateway_id: Option<::Value>, - /// Property [`VpnTunnelOptionsSpecifications`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection.html#cfn-ec2-vpnconnection-vpntunneloptionsspecifications). + pub ipv6_ipam_pool_id: Option<::Value>, + /// Property [`Ipv6NetmaskLength`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html#cfn-ec2-vpccidrblock-ipv6netmasklength). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub vpn_tunnel_options_specifications: Option<::ValueList>, + pub ipv6_netmask_length: Option<::Value>, + /// Property [`Ipv6Pool`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html#cfn-ec2-vpccidrblock-ipv6pool). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub ipv6_pool: Option<::Value>, + /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpccidrblock.html#cfn-ec2-vpccidrblock-vpcid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub vpc_id: ::Value, } -impl ::serde::Serialize for VPNConnectionProperties { +impl ::serde::Serialize for VPCCidrBlockProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CustomerGatewayId", &self.customer_gateway_id)?; - if let Some(ref static_routes_only) = self.static_routes_only { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "StaticRoutesOnly", static_routes_only)?; + if let Some(ref amazon_provided_ipv6_cidr_block) = self.amazon_provided_ipv6_cidr_block { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AmazonProvidedIpv6CidrBlock", amazon_provided_ipv6_cidr_block)?; } - if let Some(ref tags) = self.tags { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + if let Some(ref cidr_block) = self.cidr_block { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CidrBlock", cidr_block)?; } - if let Some(ref transit_gateway_id) = self.transit_gateway_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayId", transit_gateway_id)?; + if let Some(ref ipv4_ipam_pool_id) = self.ipv4_ipam_pool_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv4IpamPoolId", ipv4_ipam_pool_id)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?; - if let Some(ref vpn_gateway_id) = self.vpn_gateway_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpnGatewayId", vpn_gateway_id)?; + if let Some(ref ipv4_netmask_length) = self.ipv4_netmask_length { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv4NetmaskLength", ipv4_netmask_length)?; } - if let Some(ref vpn_tunnel_options_specifications) = self.vpn_tunnel_options_specifications { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpnTunnelOptionsSpecifications", vpn_tunnel_options_specifications)?; + if let Some(ref ipv6_cidr_block) = self.ipv6_cidr_block { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6CidrBlock", ipv6_cidr_block)?; + } + if let Some(ref ipv6_ipam_pool_id) = self.ipv6_ipam_pool_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6IpamPoolId", ipv6_ipam_pool_id)?; } + if let Some(ref ipv6_netmask_length) = self.ipv6_netmask_length { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6NetmaskLength", ipv6_netmask_length)?; + } + if let Some(ref ipv6_pool) = self.ipv6_pool { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6Pool", ipv6_pool)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", &self.vpc_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for VPNConnectionProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for VPCCidrBlockProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = VPNConnectionProperties; + type Value = VPCCidrBlockProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type VPNConnectionProperties") + write!(f, "a struct of type VPCCidrBlockProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut customer_gateway_id: Option<::Value> = None; - let mut static_routes_only: Option<::Value> = None; - let mut tags: Option<::ValueList<::Tag>> = None; - let mut transit_gateway_id: Option<::Value> = None; - let mut r#type: Option<::Value> = None; - let mut vpn_gateway_id: Option<::Value> = None; - let mut vpn_tunnel_options_specifications: Option<::ValueList> = None; + let mut amazon_provided_ipv6_cidr_block: Option<::Value> = None; + let mut cidr_block: Option<::Value> = None; + let mut ipv4_ipam_pool_id: Option<::Value> = None; + let mut ipv4_netmask_length: Option<::Value> = None; + let mut ipv6_cidr_block: Option<::Value> = None; + let mut ipv6_ipam_pool_id: Option<::Value> = None; + let mut ipv6_netmask_length: Option<::Value> = None; + let mut ipv6_pool: Option<::Value> = None; + let mut vpc_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "CustomerGatewayId" => { - customer_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; + "AmazonProvidedIpv6CidrBlock" => { + amazon_provided_ipv6_cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; } - "StaticRoutesOnly" => { - static_routes_only = ::serde::de::MapAccess::next_value(&mut map)?; + "CidrBlock" => { + cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; } - "Tags" => { - tags = ::serde::de::MapAccess::next_value(&mut map)?; + "Ipv4IpamPoolId" => { + ipv4_ipam_pool_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "TransitGatewayId" => { - transit_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; + "Ipv4NetmaskLength" => { + ipv4_netmask_length = ::serde::de::MapAccess::next_value(&mut map)?; } - "Type" => { - r#type = ::serde::de::MapAccess::next_value(&mut map)?; + "Ipv6CidrBlock" => { + ipv6_cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; } - "VpnGatewayId" => { - vpn_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; + "Ipv6IpamPoolId" => { + ipv6_ipam_pool_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "VpnTunnelOptionsSpecifications" => { - vpn_tunnel_options_specifications = ::serde::de::MapAccess::next_value(&mut map)?; + "Ipv6NetmaskLength" => { + ipv6_netmask_length = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Ipv6Pool" => { + ipv6_pool = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VpcId" => { + vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(VPNConnectionProperties { - customer_gateway_id: customer_gateway_id.ok_or(::serde::de::Error::missing_field("CustomerGatewayId"))?, - static_routes_only: static_routes_only, - tags: tags, - transit_gateway_id: transit_gateway_id, - r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?, - vpn_gateway_id: vpn_gateway_id, - vpn_tunnel_options_specifications: vpn_tunnel_options_specifications, + Ok(VPCCidrBlockProperties { + amazon_provided_ipv6_cidr_block: amazon_provided_ipv6_cidr_block, + cidr_block: cidr_block, + ipv4_ipam_pool_id: ipv4_ipam_pool_id, + ipv4_netmask_length: ipv4_netmask_length, + ipv6_cidr_block: ipv6_cidr_block, + ipv6_ipam_pool_id: ipv6_ipam_pool_id, + ipv6_netmask_length: ipv6_netmask_length, + ipv6_pool: ipv6_pool, + vpc_id: vpc_id.ok_or(::serde::de::Error::missing_field("VpcId"))?, }) } } @@ -8703,85 +9129,85 @@ impl<'de> ::serde::Deserialize<'de> for VPNConnectionProperties { } } -impl ::Resource for VPNConnection { - type Properties = VPNConnectionProperties; - const TYPE: &'static str = "AWS::EC2::VPNConnection"; - fn properties(&self) -> &VPNConnectionProperties { +impl ::Resource for VPCCidrBlock { + type Properties = VPCCidrBlockProperties; + const TYPE: &'static str = "AWS::EC2::VPCCidrBlock"; + fn properties(&self) -> &VPCCidrBlockProperties { &self.properties } - fn properties_mut(&mut self) -> &mut VPNConnectionProperties { + fn properties_mut(&mut self) -> &mut VPCCidrBlockProperties { &mut self.properties } } -impl ::private::Sealed for VPNConnection {} +impl ::private::Sealed for VPCCidrBlock {} -impl From for VPNConnection { - fn from(properties: VPNConnectionProperties) -> VPNConnection { - VPNConnection { properties } +impl From for VPCCidrBlock { + fn from(properties: VPCCidrBlockProperties) -> VPCCidrBlock { + VPCCidrBlock { properties } } } -/// The [`AWS::EC2::VPNConnectionRoute`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection-route.html) resource type. +/// The [`AWS::EC2::VPCDHCPOptionsAssociation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcdhcpoptionsassociation.html) resource type. #[derive(Debug, Default)] -pub struct VPNConnectionRoute { - properties: VPNConnectionRouteProperties +pub struct VPCDHCPOptionsAssociation { + properties: VPCDHCPOptionsAssociationProperties } -/// Properties for the `VPNConnectionRoute` resource. +/// Properties for the `VPCDHCPOptionsAssociation` resource. #[derive(Debug, Default)] -pub struct VPNConnectionRouteProperties { - /// Property [`DestinationCidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection-route.html#cfn-ec2-vpnconnectionroute-cidrblock). +pub struct VPCDHCPOptionsAssociationProperties { + /// Property [`DhcpOptionsId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcdhcpoptionsassociation.html#cfn-ec2-vpcdhcpoptionsassociation-dhcpoptionsid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub destination_cidr_block: ::Value, - /// Property [`VpnConnectionId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection-route.html#cfn-ec2-vpnconnectionroute-connectionid). + pub dhcp_options_id: ::Value, + /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcdhcpoptionsassociation.html#cfn-ec2-vpcdhcpoptionsassociation-vpcid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub vpn_connection_id: ::Value, + pub vpc_id: ::Value, } -impl ::serde::Serialize for VPNConnectionRouteProperties { +impl ::serde::Serialize for VPCDHCPOptionsAssociationProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationCidrBlock", &self.destination_cidr_block)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpnConnectionId", &self.vpn_connection_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DhcpOptionsId", &self.dhcp_options_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", &self.vpc_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for VPNConnectionRouteProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for VPCDHCPOptionsAssociationProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = VPNConnectionRouteProperties; + type Value = VPCDHCPOptionsAssociationProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type VPNConnectionRouteProperties") + write!(f, "a struct of type VPCDHCPOptionsAssociationProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut destination_cidr_block: Option<::Value> = None; - let mut vpn_connection_id: Option<::Value> = None; + let mut dhcp_options_id: Option<::Value> = None; + let mut vpc_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "DestinationCidrBlock" => { - destination_cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; + "DhcpOptionsId" => { + dhcp_options_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "VpnConnectionId" => { - vpn_connection_id = ::serde::de::MapAccess::next_value(&mut map)?; + "VpcId" => { + vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(VPNConnectionRouteProperties { - destination_cidr_block: destination_cidr_block.ok_or(::serde::de::Error::missing_field("DestinationCidrBlock"))?, - vpn_connection_id: vpn_connection_id.ok_or(::serde::de::Error::missing_field("VpnConnectionId"))?, + Ok(VPCDHCPOptionsAssociationProperties { + dhcp_options_id: dhcp_options_id.ok_or(::serde::de::Error::missing_field("DhcpOptionsId"))?, + vpc_id: vpc_id.ok_or(::serde::de::Error::missing_field("VpcId"))?, }) } } @@ -8790,100 +9216,163 @@ impl<'de> ::serde::Deserialize<'de> for VPNConnectionRouteProperties { } } -impl ::Resource for VPNConnectionRoute { - type Properties = VPNConnectionRouteProperties; - const TYPE: &'static str = "AWS::EC2::VPNConnectionRoute"; - fn properties(&self) -> &VPNConnectionRouteProperties { +impl ::Resource for VPCDHCPOptionsAssociation { + type Properties = VPCDHCPOptionsAssociationProperties; + const TYPE: &'static str = "AWS::EC2::VPCDHCPOptionsAssociation"; + fn properties(&self) -> &VPCDHCPOptionsAssociationProperties { &self.properties } - fn properties_mut(&mut self) -> &mut VPNConnectionRouteProperties { + fn properties_mut(&mut self) -> &mut VPCDHCPOptionsAssociationProperties { &mut self.properties } } -impl ::private::Sealed for VPNConnectionRoute {} +impl ::private::Sealed for VPCDHCPOptionsAssociation {} -impl From for VPNConnectionRoute { - fn from(properties: VPNConnectionRouteProperties) -> VPNConnectionRoute { - VPNConnectionRoute { properties } +impl From for VPCDHCPOptionsAssociation { + fn from(properties: VPCDHCPOptionsAssociationProperties) -> VPCDHCPOptionsAssociation { + VPCDHCPOptionsAssociation { properties } } } -/// The [`AWS::EC2::VPNGateway`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-gateway.html) resource type. +/// The [`AWS::EC2::VPCEndpoint`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html) resource type. #[derive(Debug, Default)] -pub struct VPNGateway { - properties: VPNGatewayProperties +pub struct VPCEndpoint { + properties: VPCEndpointProperties } -/// Properties for the `VPNGateway` resource. +/// Properties for the `VPCEndpoint` resource. #[derive(Debug, Default)] -pub struct VPNGatewayProperties { - /// Property [`AmazonSideAsn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-gateway.html#cfn-ec2-vpngateway-amazonsideasn). +pub struct VPCEndpointProperties { + /// Property [`PolicyDocument`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-policydocument). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub amazon_side_asn: Option<::Value>, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-gateway.html#cfn-ec2-vpngateway-tags). + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub policy_document: Option<::Value<::json::Value>>, + /// Property [`PrivateDnsEnabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-privatednsenabled). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub tags: Option<::ValueList<::Tag>>, - /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-gateway.html#cfn-ec2-vpngateway-type). + pub private_dns_enabled: Option<::Value>, + /// Property [`RouteTableIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-routetableids). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub route_table_ids: Option<::ValueList>, + /// Property [`SecurityGroupIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-securitygroupids). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub security_group_ids: Option<::ValueList>, + /// Property [`ServiceName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-servicename). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub r#type: ::Value, + pub service_name: ::Value, + /// Property [`SubnetIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-subnetids). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub subnet_ids: Option<::ValueList>, + /// Property [`VpcEndpointType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-vpcendpointtype). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub vpc_endpoint_type: Option<::Value>, + /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html#cfn-ec2-vpcendpoint-vpcid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub vpc_id: ::Value, } -impl ::serde::Serialize for VPNGatewayProperties { +impl ::serde::Serialize for VPCEndpointProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref amazon_side_asn) = self.amazon_side_asn { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AmazonSideAsn", amazon_side_asn)?; + if let Some(ref policy_document) = self.policy_document { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PolicyDocument", policy_document)?; } - if let Some(ref tags) = self.tags { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + if let Some(ref private_dns_enabled) = self.private_dns_enabled { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateDnsEnabled", private_dns_enabled)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?; + if let Some(ref route_table_ids) = self.route_table_ids { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RouteTableIds", route_table_ids)?; + } + if let Some(ref security_group_ids) = self.security_group_ids { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityGroupIds", security_group_ids)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServiceName", &self.service_name)?; + if let Some(ref subnet_ids) = self.subnet_ids { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetIds", subnet_ids)?; + } + if let Some(ref vpc_endpoint_type) = self.vpc_endpoint_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcEndpointType", vpc_endpoint_type)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", &self.vpc_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for VPNGatewayProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for VPCEndpointProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = VPNGatewayProperties; + type Value = VPCEndpointProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type VPNGatewayProperties") + write!(f, "a struct of type VPCEndpointProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut amazon_side_asn: Option<::Value> = None; - let mut tags: Option<::ValueList<::Tag>> = None; - let mut r#type: Option<::Value> = None; + let mut policy_document: Option<::Value<::json::Value>> = None; + let mut private_dns_enabled: Option<::Value> = None; + let mut route_table_ids: Option<::ValueList> = None; + let mut security_group_ids: Option<::ValueList> = None; + let mut service_name: Option<::Value> = None; + let mut subnet_ids: Option<::ValueList> = None; + let mut vpc_endpoint_type: Option<::Value> = None; + let mut vpc_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "AmazonSideAsn" => { - amazon_side_asn = ::serde::de::MapAccess::next_value(&mut map)?; + "PolicyDocument" => { + policy_document = ::serde::de::MapAccess::next_value(&mut map)?; } - "Tags" => { - tags = ::serde::de::MapAccess::next_value(&mut map)?; + "PrivateDnsEnabled" => { + private_dns_enabled = ::serde::de::MapAccess::next_value(&mut map)?; } - "Type" => { - r#type = ::serde::de::MapAccess::next_value(&mut map)?; + "RouteTableIds" => { + route_table_ids = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SecurityGroupIds" => { + security_group_ids = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ServiceName" => { + service_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SubnetIds" => { + subnet_ids = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VpcEndpointType" => { + vpc_endpoint_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VpcId" => { + vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(VPNGatewayProperties { - amazon_side_asn: amazon_side_asn, - tags: tags, - r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?, + Ok(VPCEndpointProperties { + policy_document: policy_document, + private_dns_enabled: private_dns_enabled, + route_table_ids: route_table_ids, + security_group_ids: security_group_ids, + service_name: service_name.ok_or(::serde::de::Error::missing_field("ServiceName"))?, + subnet_ids: subnet_ids, + vpc_endpoint_type: vpc_endpoint_type, + vpc_id: vpc_id.ok_or(::serde::de::Error::missing_field("VpcId"))?, }) } } @@ -8892,85 +9381,111 @@ impl<'de> ::serde::Deserialize<'de> for VPNGatewayProperties { } } -impl ::Resource for VPNGateway { - type Properties = VPNGatewayProperties; - const TYPE: &'static str = "AWS::EC2::VPNGateway"; - fn properties(&self) -> &VPNGatewayProperties { +impl ::Resource for VPCEndpoint { + type Properties = VPCEndpointProperties; + const TYPE: &'static str = "AWS::EC2::VPCEndpoint"; + fn properties(&self) -> &VPCEndpointProperties { &self.properties } - fn properties_mut(&mut self) -> &mut VPNGatewayProperties { + fn properties_mut(&mut self) -> &mut VPCEndpointProperties { &mut self.properties } } -impl ::private::Sealed for VPNGateway {} +impl ::private::Sealed for VPCEndpoint {} -impl From for VPNGateway { - fn from(properties: VPNGatewayProperties) -> VPNGateway { - VPNGateway { properties } +impl From for VPCEndpoint { + fn from(properties: VPCEndpointProperties) -> VPCEndpoint { + VPCEndpoint { properties } } } -/// The [`AWS::EC2::VPNGatewayRoutePropagation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-gatewayrouteprop.html) resource type. +/// The [`AWS::EC2::VPCEndpointConnectionNotification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointconnectionnotification.html) resource type. #[derive(Debug, Default)] -pub struct VPNGatewayRoutePropagation { - properties: VPNGatewayRoutePropagationProperties +pub struct VPCEndpointConnectionNotification { + properties: VPCEndpointConnectionNotificationProperties } -/// Properties for the `VPNGatewayRoutePropagation` resource. +/// Properties for the `VPCEndpointConnectionNotification` resource. #[derive(Debug, Default)] -pub struct VPNGatewayRoutePropagationProperties { - /// Property [`RouteTableIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-gatewayrouteprop.html#cfn-ec2-vpngatewayrouteprop-routetableids). +pub struct VPCEndpointConnectionNotificationProperties { + /// Property [`ConnectionEvents`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointconnectionnotification.html#cfn-ec2-vpcendpointconnectionnotification-connectionevents). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub route_table_ids: ::ValueList, - /// Property [`VpnGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-gatewayrouteprop.html#cfn-ec2-vpngatewayrouteprop-vpngatewayid). + pub connection_events: ::ValueList, + /// Property [`ConnectionNotificationArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointconnectionnotification.html#cfn-ec2-vpcendpointconnectionnotification-connectionnotificationarn). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub vpn_gateway_id: ::Value, + pub connection_notification_arn: ::Value, + /// Property [`ServiceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointconnectionnotification.html#cfn-ec2-vpcendpointconnectionnotification-serviceid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub service_id: Option<::Value>, + /// Property [`VPCEndpointId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointconnectionnotification.html#cfn-ec2-vpcendpointconnectionnotification-vpcendpointid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub vpc_endpoint_id: Option<::Value>, } -impl ::serde::Serialize for VPNGatewayRoutePropagationProperties { +impl ::serde::Serialize for VPCEndpointConnectionNotificationProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "RouteTableIds", &self.route_table_ids)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpnGatewayId", &self.vpn_gateway_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConnectionEvents", &self.connection_events)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConnectionNotificationArn", &self.connection_notification_arn)?; + if let Some(ref service_id) = self.service_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServiceId", service_id)?; + } + if let Some(ref vpc_endpoint_id) = self.vpc_endpoint_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VPCEndpointId", vpc_endpoint_id)?; + } ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for VPNGatewayRoutePropagationProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for VPCEndpointConnectionNotificationProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = VPNGatewayRoutePropagationProperties; + type Value = VPCEndpointConnectionNotificationProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type VPNGatewayRoutePropagationProperties") + write!(f, "a struct of type VPCEndpointConnectionNotificationProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut route_table_ids: Option<::ValueList> = None; - let mut vpn_gateway_id: Option<::Value> = None; + let mut connection_events: Option<::ValueList> = None; + let mut connection_notification_arn: Option<::Value> = None; + let mut service_id: Option<::Value> = None; + let mut vpc_endpoint_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "RouteTableIds" => { - route_table_ids = ::serde::de::MapAccess::next_value(&mut map)?; + "ConnectionEvents" => { + connection_events = ::serde::de::MapAccess::next_value(&mut map)?; } - "VpnGatewayId" => { - vpn_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; + "ConnectionNotificationArn" => { + connection_notification_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ServiceId" => { + service_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VPCEndpointId" => { + vpc_endpoint_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(VPNGatewayRoutePropagationProperties { - route_table_ids: route_table_ids.ok_or(::serde::de::Error::missing_field("RouteTableIds"))?, - vpn_gateway_id: vpn_gateway_id.ok_or(::serde::de::Error::missing_field("VpnGatewayId"))?, + Ok(VPCEndpointConnectionNotificationProperties { + connection_events: connection_events.ok_or(::serde::de::Error::missing_field("ConnectionEvents"))?, + connection_notification_arn: connection_notification_arn.ok_or(::serde::de::Error::missing_field("ConnectionNotificationArn"))?, + service_id: service_id, + vpc_endpoint_id: vpc_endpoint_id, }) } } @@ -8979,217 +9494,115 @@ impl<'de> ::serde::Deserialize<'de> for VPNGatewayRoutePropagationProperties { } } -impl ::Resource for VPNGatewayRoutePropagation { - type Properties = VPNGatewayRoutePropagationProperties; - const TYPE: &'static str = "AWS::EC2::VPNGatewayRoutePropagation"; - fn properties(&self) -> &VPNGatewayRoutePropagationProperties { +impl ::Resource for VPCEndpointConnectionNotification { + type Properties = VPCEndpointConnectionNotificationProperties; + const TYPE: &'static str = "AWS::EC2::VPCEndpointConnectionNotification"; + fn properties(&self) -> &VPCEndpointConnectionNotificationProperties { &self.properties } - fn properties_mut(&mut self) -> &mut VPNGatewayRoutePropagationProperties { + fn properties_mut(&mut self) -> &mut VPCEndpointConnectionNotificationProperties { &mut self.properties } } -impl ::private::Sealed for VPNGatewayRoutePropagation {} +impl ::private::Sealed for VPCEndpointConnectionNotification {} -impl From for VPNGatewayRoutePropagation { - fn from(properties: VPNGatewayRoutePropagationProperties) -> VPNGatewayRoutePropagation { - VPNGatewayRoutePropagation { properties } +impl From for VPCEndpointConnectionNotification { + fn from(properties: VPCEndpointConnectionNotificationProperties) -> VPCEndpointConnectionNotification { + VPCEndpointConnectionNotification { properties } } } -/// The [`AWS::EC2::Volume`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html) resource type. +/// The [`AWS::EC2::VPCEndpointService`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservice.html) resource type. #[derive(Debug, Default)] -pub struct Volume { - properties: VolumeProperties +pub struct VPCEndpointService { + properties: VPCEndpointServiceProperties } -/// Properties for the `Volume` resource. +/// Properties for the `VPCEndpointService` resource. #[derive(Debug, Default)] -pub struct VolumeProperties { - /// Property [`AutoEnableIO`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-autoenableio). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub auto_enable_io: Option<::Value>, - /// Property [`AvailabilityZone`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-availabilityzone). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub availability_zone: ::Value, - /// Property [`Encrypted`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-encrypted). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub encrypted: Option<::Value>, - /// Property [`Iops`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-iops). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub iops: Option<::Value>, - /// Property [`KmsKeyId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-kmskeyid). +pub struct VPCEndpointServiceProperties { + /// Property [`AcceptanceRequired`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservice.html#cfn-ec2-vpcendpointservice-acceptancerequired). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub kms_key_id: Option<::Value>, - /// Property [`MultiAttachEnabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-multiattachenabled). + pub acceptance_required: Option<::Value>, + /// Property [`GatewayLoadBalancerArns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservice.html#cfn-ec2-vpcendpointservice-gatewayloadbalancerarns). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub multi_attach_enabled: Option<::Value>, - /// Property [`OutpostArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-outpostarn). + pub gateway_load_balancer_arns: Option<::ValueList>, + /// Property [`NetworkLoadBalancerArns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservice.html#cfn-ec2-vpcendpointservice-networkloadbalancerarns). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub outpost_arn: Option<::Value>, - /// Property [`Size`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-size). + pub network_load_balancer_arns: Option<::ValueList>, + /// Property [`PayerResponsibility`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservice.html#cfn-ec2-vpcendpointservice-payerresponsibility). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub size: Option<::Value>, - /// Property [`SnapshotId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-snapshotid). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub snapshot_id: Option<::Value>, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-tags). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub tags: Option<::ValueList<::Tag>>, - /// Property [`Throughput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-throughput). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub throughput: Option<::Value>, - /// Property [`VolumeType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-volumetype). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub volume_type: Option<::Value>, + pub payer_responsibility: Option<::Value>, } -impl ::serde::Serialize for VolumeProperties { +impl ::serde::Serialize for VPCEndpointServiceProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref auto_enable_io) = self.auto_enable_io { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AutoEnableIO", auto_enable_io)?; - } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AvailabilityZone", &self.availability_zone)?; - if let Some(ref encrypted) = self.encrypted { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Encrypted", encrypted)?; - } - if let Some(ref iops) = self.iops { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Iops", iops)?; - } - if let Some(ref kms_key_id) = self.kms_key_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "KmsKeyId", kms_key_id)?; - } - if let Some(ref multi_attach_enabled) = self.multi_attach_enabled { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "MultiAttachEnabled", multi_attach_enabled)?; - } - if let Some(ref outpost_arn) = self.outpost_arn { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "OutpostArn", outpost_arn)?; - } - if let Some(ref size) = self.size { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Size", size)?; - } - if let Some(ref snapshot_id) = self.snapshot_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SnapshotId", snapshot_id)?; + if let Some(ref acceptance_required) = self.acceptance_required { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcceptanceRequired", acceptance_required)?; } - if let Some(ref tags) = self.tags { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + if let Some(ref gateway_load_balancer_arns) = self.gateway_load_balancer_arns { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GatewayLoadBalancerArns", gateway_load_balancer_arns)?; } - if let Some(ref throughput) = self.throughput { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Throughput", throughput)?; + if let Some(ref network_load_balancer_arns) = self.network_load_balancer_arns { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkLoadBalancerArns", network_load_balancer_arns)?; } - if let Some(ref volume_type) = self.volume_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VolumeType", volume_type)?; + if let Some(ref payer_responsibility) = self.payer_responsibility { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PayerResponsibility", payer_responsibility)?; } ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for VolumeProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for VPCEndpointServiceProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = VolumeProperties; + type Value = VPCEndpointServiceProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type VolumeProperties") + write!(f, "a struct of type VPCEndpointServiceProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut auto_enable_io: Option<::Value> = None; - let mut availability_zone: Option<::Value> = None; - let mut encrypted: Option<::Value> = None; - let mut iops: Option<::Value> = None; - let mut kms_key_id: Option<::Value> = None; - let mut multi_attach_enabled: Option<::Value> = None; - let mut outpost_arn: Option<::Value> = None; - let mut size: Option<::Value> = None; - let mut snapshot_id: Option<::Value> = None; - let mut tags: Option<::ValueList<::Tag>> = None; - let mut throughput: Option<::Value> = None; - let mut volume_type: Option<::Value> = None; + let mut acceptance_required: Option<::Value> = None; + let mut gateway_load_balancer_arns: Option<::ValueList> = None; + let mut network_load_balancer_arns: Option<::ValueList> = None; + let mut payer_responsibility: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "AutoEnableIO" => { - auto_enable_io = ::serde::de::MapAccess::next_value(&mut map)?; - } - "AvailabilityZone" => { - availability_zone = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Encrypted" => { - encrypted = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Iops" => { - iops = ::serde::de::MapAccess::next_value(&mut map)?; - } - "KmsKeyId" => { - kms_key_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "MultiAttachEnabled" => { - multi_attach_enabled = ::serde::de::MapAccess::next_value(&mut map)?; - } - "OutpostArn" => { - outpost_arn = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Size" => { - size = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SnapshotId" => { - snapshot_id = ::serde::de::MapAccess::next_value(&mut map)?; + "AcceptanceRequired" => { + acceptance_required = ::serde::de::MapAccess::next_value(&mut map)?; } - "Tags" => { - tags = ::serde::de::MapAccess::next_value(&mut map)?; + "GatewayLoadBalancerArns" => { + gateway_load_balancer_arns = ::serde::de::MapAccess::next_value(&mut map)?; } - "Throughput" => { - throughput = ::serde::de::MapAccess::next_value(&mut map)?; + "NetworkLoadBalancerArns" => { + network_load_balancer_arns = ::serde::de::MapAccess::next_value(&mut map)?; } - "VolumeType" => { - volume_type = ::serde::de::MapAccess::next_value(&mut map)?; + "PayerResponsibility" => { + payer_responsibility = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(VolumeProperties { - auto_enable_io: auto_enable_io, - availability_zone: availability_zone.ok_or(::serde::de::Error::missing_field("AvailabilityZone"))?, - encrypted: encrypted, - iops: iops, - kms_key_id: kms_key_id, - multi_attach_enabled: multi_attach_enabled, - outpost_arn: outpost_arn, - size: size, - snapshot_id: snapshot_id, - tags: tags, - throughput: throughput, - volume_type: volume_type, + Ok(VPCEndpointServiceProperties { + acceptance_required: acceptance_required, + gateway_load_balancer_arns: gateway_load_balancer_arns, + network_load_balancer_arns: network_load_balancer_arns, + payer_responsibility: payer_responsibility, }) } } @@ -9198,138 +9611,3489 @@ impl<'de> ::serde::Deserialize<'de> for VolumeProperties { } } -impl ::Resource for Volume { - type Properties = VolumeProperties; - const TYPE: &'static str = "AWS::EC2::Volume"; - fn properties(&self) -> &VolumeProperties { +impl ::Resource for VPCEndpointService { + type Properties = VPCEndpointServiceProperties; + const TYPE: &'static str = "AWS::EC2::VPCEndpointService"; + fn properties(&self) -> &VPCEndpointServiceProperties { &self.properties } - fn properties_mut(&mut self) -> &mut VolumeProperties { + fn properties_mut(&mut self) -> &mut VPCEndpointServiceProperties { &mut self.properties } } -impl ::private::Sealed for Volume {} +impl ::private::Sealed for VPCEndpointService {} -impl From for Volume { - fn from(properties: VolumeProperties) -> Volume { - Volume { properties } +impl From for VPCEndpointService { + fn from(properties: VPCEndpointServiceProperties) -> VPCEndpointService { + VPCEndpointService { properties } } } -/// The [`AWS::EC2::VolumeAttachment`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volumeattachment.html) resource type. +/// The [`AWS::EC2::VPCEndpointServicePermissions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservicepermissions.html) resource type. #[derive(Debug, Default)] -pub struct VolumeAttachment { - properties: VolumeAttachmentProperties +pub struct VPCEndpointServicePermissions { + properties: VPCEndpointServicePermissionsProperties } -/// Properties for the `VolumeAttachment` resource. +/// Properties for the `VPCEndpointServicePermissions` resource. #[derive(Debug, Default)] -pub struct VolumeAttachmentProperties { - /// Property [`Device`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volumeattachment.html#cfn-ec2-ebs-volumeattachment-device). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub device: ::Value, - /// Property [`InstanceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volumeattachment.html#cfn-ec2-ebs-volumeattachment-instanceid). +pub struct VPCEndpointServicePermissionsProperties { + /// Property [`AllowedPrincipals`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservicepermissions.html#cfn-ec2-vpcendpointservicepermissions-allowedprincipals). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub instance_id: ::Value, - /// Property [`VolumeId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volumeattachment.html#cfn-ec2-ebs-volumeattachment-volumeid). + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub allowed_principals: Option<::ValueList>, + /// Property [`ServiceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpointservicepermissions.html#cfn-ec2-vpcendpointservicepermissions-serviceid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub volume_id: ::Value, + pub service_id: ::Value, } -impl ::serde::Serialize for VolumeAttachmentProperties { +impl ::serde::Serialize for VPCEndpointServicePermissionsProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Device", &self.device)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceId", &self.instance_id)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VolumeId", &self.volume_id)?; + if let Some(ref allowed_principals) = self.allowed_principals { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AllowedPrincipals", allowed_principals)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServiceId", &self.service_id)?; ::serde::ser::SerializeMap::end(map) } } -impl<'de> ::serde::Deserialize<'de> for VolumeAttachmentProperties { - fn deserialize>(d: D) -> Result { +impl<'de> ::serde::Deserialize<'de> for VPCEndpointServicePermissionsProperties { + fn deserialize>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = VolumeAttachmentProperties; + type Value = VPCEndpointServicePermissionsProperties; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type VolumeAttachmentProperties") + write!(f, "a struct of type VPCEndpointServicePermissionsProperties") } fn visit_map>(self, mut map: A) -> Result { - let mut device: Option<::Value> = None; - let mut instance_id: Option<::Value> = None; - let mut volume_id: Option<::Value> = None; + let mut allowed_principals: Option<::ValueList> = None; + let mut service_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Device" => { - device = ::serde::de::MapAccess::next_value(&mut map)?; - } - "InstanceId" => { - instance_id = ::serde::de::MapAccess::next_value(&mut map)?; + "AllowedPrincipals" => { + allowed_principals = ::serde::de::MapAccess::next_value(&mut map)?; } - "VolumeId" => { - volume_id = ::serde::de::MapAccess::next_value(&mut map)?; + "ServiceId" => { + service_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(VolumeAttachmentProperties { - device: device.ok_or(::serde::de::Error::missing_field("Device"))?, - instance_id: instance_id.ok_or(::serde::de::Error::missing_field("InstanceId"))?, - volume_id: volume_id.ok_or(::serde::de::Error::missing_field("VolumeId"))?, - }) - } - } - - d.deserialize_map(Visitor) - } -} + Ok(VPCEndpointServicePermissionsProperties { + allowed_principals: allowed_principals, + service_id: service_id.ok_or(::serde::de::Error::missing_field("ServiceId"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for VPCEndpointServicePermissions { + type Properties = VPCEndpointServicePermissionsProperties; + const TYPE: &'static str = "AWS::EC2::VPCEndpointServicePermissions"; + fn properties(&self) -> &VPCEndpointServicePermissionsProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut VPCEndpointServicePermissionsProperties { + &mut self.properties + } +} + +impl ::private::Sealed for VPCEndpointServicePermissions {} + +impl From for VPCEndpointServicePermissions { + fn from(properties: VPCEndpointServicePermissionsProperties) -> VPCEndpointServicePermissions { + VPCEndpointServicePermissions { properties } + } +} + +/// The [`AWS::EC2::VPCGatewayAttachment`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc-gateway-attachment.html) resource type. +#[derive(Debug, Default)] +pub struct VPCGatewayAttachment { + properties: VPCGatewayAttachmentProperties +} + +/// Properties for the `VPCGatewayAttachment` resource. +#[derive(Debug, Default)] +pub struct VPCGatewayAttachmentProperties { + /// Property [`InternetGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc-gateway-attachment.html#cfn-ec2-vpcgatewayattachment-internetgatewayid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub internet_gateway_id: Option<::Value>, + /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc-gateway-attachment.html#cfn-ec2-vpcgatewayattachment-vpcid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub vpc_id: ::Value, + /// Property [`VpnGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc-gateway-attachment.html#cfn-ec2-vpcgatewayattachment-vpngatewayid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub vpn_gateway_id: Option<::Value>, +} + +impl ::serde::Serialize for VPCGatewayAttachmentProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref internet_gateway_id) = self.internet_gateway_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InternetGatewayId", internet_gateway_id)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", &self.vpc_id)?; + if let Some(ref vpn_gateway_id) = self.vpn_gateway_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpnGatewayId", vpn_gateway_id)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for VPCGatewayAttachmentProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = VPCGatewayAttachmentProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type VPCGatewayAttachmentProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut internet_gateway_id: Option<::Value> = None; + let mut vpc_id: Option<::Value> = None; + let mut vpn_gateway_id: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "InternetGatewayId" => { + internet_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VpcId" => { + vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VpnGatewayId" => { + vpn_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(VPCGatewayAttachmentProperties { + internet_gateway_id: internet_gateway_id, + vpc_id: vpc_id.ok_or(::serde::de::Error::missing_field("VpcId"))?, + vpn_gateway_id: vpn_gateway_id, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for VPCGatewayAttachment { + type Properties = VPCGatewayAttachmentProperties; + const TYPE: &'static str = "AWS::EC2::VPCGatewayAttachment"; + fn properties(&self) -> &VPCGatewayAttachmentProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut VPCGatewayAttachmentProperties { + &mut self.properties + } +} + +impl ::private::Sealed for VPCGatewayAttachment {} + +impl From for VPCGatewayAttachment { + fn from(properties: VPCGatewayAttachmentProperties) -> VPCGatewayAttachment { + VPCGatewayAttachment { properties } + } +} + +/// The [`AWS::EC2::VPCPeeringConnection`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcpeeringconnection.html) resource type. +#[derive(Debug, Default)] +pub struct VPCPeeringConnection { + properties: VPCPeeringConnectionProperties +} + +/// Properties for the `VPCPeeringConnection` resource. +#[derive(Debug, Default)] +pub struct VPCPeeringConnectionProperties { + /// Property [`PeerOwnerId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcpeeringconnection.html#cfn-ec2-vpcpeeringconnection-peerownerid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub peer_owner_id: Option<::Value>, + /// Property [`PeerRegion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcpeeringconnection.html#cfn-ec2-vpcpeeringconnection-peerregion). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub peer_region: Option<::Value>, + /// Property [`PeerRoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcpeeringconnection.html#cfn-ec2-vpcpeeringconnection-peerrolearn). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub peer_role_arn: Option<::Value>, + /// Property [`PeerVpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcpeeringconnection.html#cfn-ec2-vpcpeeringconnection-peervpcid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub peer_vpc_id: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcpeeringconnection.html#cfn-ec2-vpcpeeringconnection-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcpeeringconnection.html#cfn-ec2-vpcpeeringconnection-vpcid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub vpc_id: ::Value, +} + +impl ::serde::Serialize for VPCPeeringConnectionProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref peer_owner_id) = self.peer_owner_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PeerOwnerId", peer_owner_id)?; + } + if let Some(ref peer_region) = self.peer_region { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PeerRegion", peer_region)?; + } + if let Some(ref peer_role_arn) = self.peer_role_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PeerRoleArn", peer_role_arn)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PeerVpcId", &self.peer_vpc_id)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", &self.vpc_id)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for VPCPeeringConnectionProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = VPCPeeringConnectionProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type VPCPeeringConnectionProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut peer_owner_id: Option<::Value> = None; + let mut peer_region: Option<::Value> = None; + let mut peer_role_arn: Option<::Value> = None; + let mut peer_vpc_id: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut vpc_id: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "PeerOwnerId" => { + peer_owner_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PeerRegion" => { + peer_region = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PeerRoleArn" => { + peer_role_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PeerVpcId" => { + peer_vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VpcId" => { + vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(VPCPeeringConnectionProperties { + peer_owner_id: peer_owner_id, + peer_region: peer_region, + peer_role_arn: peer_role_arn, + peer_vpc_id: peer_vpc_id.ok_or(::serde::de::Error::missing_field("PeerVpcId"))?, + tags: tags, + vpc_id: vpc_id.ok_or(::serde::de::Error::missing_field("VpcId"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for VPCPeeringConnection { + type Properties = VPCPeeringConnectionProperties; + const TYPE: &'static str = "AWS::EC2::VPCPeeringConnection"; + fn properties(&self) -> &VPCPeeringConnectionProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut VPCPeeringConnectionProperties { + &mut self.properties + } +} + +impl ::private::Sealed for VPCPeeringConnection {} + +impl From for VPCPeeringConnection { + fn from(properties: VPCPeeringConnectionProperties) -> VPCPeeringConnection { + VPCPeeringConnection { properties } + } +} + +/// The [`AWS::EC2::VPNConnection`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection.html) resource type. +#[derive(Debug, Default)] +pub struct VPNConnection { + properties: VPNConnectionProperties +} + +/// Properties for the `VPNConnection` resource. +#[derive(Debug, Default)] +pub struct VPNConnectionProperties { + /// Property [`CustomerGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection.html#cfn-ec2-vpnconnection-customergatewayid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub customer_gateway_id: ::Value, + /// Property [`StaticRoutesOnly`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection.html#cfn-ec2-vpnconnection-StaticRoutesOnly). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub static_routes_only: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection.html#cfn-ec2-vpnconnection-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`TransitGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection.html#cfn-ec2-vpnconnection-transitgatewayid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub transit_gateway_id: Option<::Value>, + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection.html#cfn-ec2-vpnconnection-type). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub r#type: ::Value, + /// Property [`VpnGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection.html#cfn-ec2-vpnconnection-vpngatewayid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub vpn_gateway_id: Option<::Value>, + /// Property [`VpnTunnelOptionsSpecifications`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection.html#cfn-ec2-vpnconnection-vpntunneloptionsspecifications). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub vpn_tunnel_options_specifications: Option<::ValueList>, +} + +impl ::serde::Serialize for VPNConnectionProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CustomerGatewayId", &self.customer_gateway_id)?; + if let Some(ref static_routes_only) = self.static_routes_only { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "StaticRoutesOnly", static_routes_only)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + if let Some(ref transit_gateway_id) = self.transit_gateway_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitGatewayId", transit_gateway_id)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?; + if let Some(ref vpn_gateway_id) = self.vpn_gateway_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpnGatewayId", vpn_gateway_id)?; + } + if let Some(ref vpn_tunnel_options_specifications) = self.vpn_tunnel_options_specifications { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpnTunnelOptionsSpecifications", vpn_tunnel_options_specifications)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for VPNConnectionProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = VPNConnectionProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type VPNConnectionProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut customer_gateway_id: Option<::Value> = None; + let mut static_routes_only: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut transit_gateway_id: Option<::Value> = None; + let mut r#type: Option<::Value> = None; + let mut vpn_gateway_id: Option<::Value> = None; + let mut vpn_tunnel_options_specifications: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CustomerGatewayId" => { + customer_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "StaticRoutesOnly" => { + static_routes_only = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TransitGatewayId" => { + transit_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VpnGatewayId" => { + vpn_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VpnTunnelOptionsSpecifications" => { + vpn_tunnel_options_specifications = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(VPNConnectionProperties { + customer_gateway_id: customer_gateway_id.ok_or(::serde::de::Error::missing_field("CustomerGatewayId"))?, + static_routes_only: static_routes_only, + tags: tags, + transit_gateway_id: transit_gateway_id, + r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?, + vpn_gateway_id: vpn_gateway_id, + vpn_tunnel_options_specifications: vpn_tunnel_options_specifications, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for VPNConnection { + type Properties = VPNConnectionProperties; + const TYPE: &'static str = "AWS::EC2::VPNConnection"; + fn properties(&self) -> &VPNConnectionProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut VPNConnectionProperties { + &mut self.properties + } +} + +impl ::private::Sealed for VPNConnection {} + +impl From for VPNConnection { + fn from(properties: VPNConnectionProperties) -> VPNConnection { + VPNConnection { properties } + } +} + +/// The [`AWS::EC2::VPNConnectionRoute`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection-route.html) resource type. +#[derive(Debug, Default)] +pub struct VPNConnectionRoute { + properties: VPNConnectionRouteProperties +} + +/// Properties for the `VPNConnectionRoute` resource. +#[derive(Debug, Default)] +pub struct VPNConnectionRouteProperties { + /// Property [`DestinationCidrBlock`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection-route.html#cfn-ec2-vpnconnectionroute-cidrblock). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub destination_cidr_block: ::Value, + /// Property [`VpnConnectionId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-connection-route.html#cfn-ec2-vpnconnectionroute-connectionid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub vpn_connection_id: ::Value, +} + +impl ::serde::Serialize for VPNConnectionRouteProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationCidrBlock", &self.destination_cidr_block)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpnConnectionId", &self.vpn_connection_id)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for VPNConnectionRouteProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = VPNConnectionRouteProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type VPNConnectionRouteProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut destination_cidr_block: Option<::Value> = None; + let mut vpn_connection_id: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DestinationCidrBlock" => { + destination_cidr_block = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VpnConnectionId" => { + vpn_connection_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(VPNConnectionRouteProperties { + destination_cidr_block: destination_cidr_block.ok_or(::serde::de::Error::missing_field("DestinationCidrBlock"))?, + vpn_connection_id: vpn_connection_id.ok_or(::serde::de::Error::missing_field("VpnConnectionId"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for VPNConnectionRoute { + type Properties = VPNConnectionRouteProperties; + const TYPE: &'static str = "AWS::EC2::VPNConnectionRoute"; + fn properties(&self) -> &VPNConnectionRouteProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut VPNConnectionRouteProperties { + &mut self.properties + } +} + +impl ::private::Sealed for VPNConnectionRoute {} + +impl From for VPNConnectionRoute { + fn from(properties: VPNConnectionRouteProperties) -> VPNConnectionRoute { + VPNConnectionRoute { properties } + } +} + +/// The [`AWS::EC2::VPNGateway`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-gateway.html) resource type. +#[derive(Debug, Default)] +pub struct VPNGateway { + properties: VPNGatewayProperties +} + +/// Properties for the `VPNGateway` resource. +#[derive(Debug, Default)] +pub struct VPNGatewayProperties { + /// Property [`AmazonSideAsn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-gateway.html#cfn-ec2-vpngateway-amazonsideasn). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub amazon_side_asn: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-gateway.html#cfn-ec2-vpngateway-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpn-gateway.html#cfn-ec2-vpngateway-type). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub r#type: ::Value, +} + +impl ::serde::Serialize for VPNGatewayProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref amazon_side_asn) = self.amazon_side_asn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AmazonSideAsn", amazon_side_asn)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for VPNGatewayProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = VPNGatewayProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type VPNGatewayProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut amazon_side_asn: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut r#type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AmazonSideAsn" => { + amazon_side_asn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(VPNGatewayProperties { + amazon_side_asn: amazon_side_asn, + tags: tags, + r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for VPNGateway { + type Properties = VPNGatewayProperties; + const TYPE: &'static str = "AWS::EC2::VPNGateway"; + fn properties(&self) -> &VPNGatewayProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut VPNGatewayProperties { + &mut self.properties + } +} + +impl ::private::Sealed for VPNGateway {} + +impl From for VPNGateway { + fn from(properties: VPNGatewayProperties) -> VPNGateway { + VPNGateway { properties } + } +} + +/// The [`AWS::EC2::VPNGatewayRoutePropagation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpngatewayroutepropagation.html) resource type. +#[derive(Debug, Default)] +pub struct VPNGatewayRoutePropagation { + properties: VPNGatewayRoutePropagationProperties +} + +/// Properties for the `VPNGatewayRoutePropagation` resource. +#[derive(Debug, Default)] +pub struct VPNGatewayRoutePropagationProperties { + /// Property [`RouteTableIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpngatewayroutepropagation.html#cfn-ec2-vpngatewayroutepropagation-routetableids). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub route_table_ids: ::ValueList, + /// Property [`VpnGatewayId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpngatewayroutepropagation.html#cfn-ec2-vpngatewayroutepropagation-vpngatewayid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub vpn_gateway_id: ::Value, +} + +impl ::serde::Serialize for VPNGatewayRoutePropagationProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RouteTableIds", &self.route_table_ids)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpnGatewayId", &self.vpn_gateway_id)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for VPNGatewayRoutePropagationProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = VPNGatewayRoutePropagationProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type VPNGatewayRoutePropagationProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut route_table_ids: Option<::ValueList> = None; + let mut vpn_gateway_id: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "RouteTableIds" => { + route_table_ids = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VpnGatewayId" => { + vpn_gateway_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(VPNGatewayRoutePropagationProperties { + route_table_ids: route_table_ids.ok_or(::serde::de::Error::missing_field("RouteTableIds"))?, + vpn_gateway_id: vpn_gateway_id.ok_or(::serde::de::Error::missing_field("VpnGatewayId"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for VPNGatewayRoutePropagation { + type Properties = VPNGatewayRoutePropagationProperties; + const TYPE: &'static str = "AWS::EC2::VPNGatewayRoutePropagation"; + fn properties(&self) -> &VPNGatewayRoutePropagationProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut VPNGatewayRoutePropagationProperties { + &mut self.properties + } +} + +impl ::private::Sealed for VPNGatewayRoutePropagation {} + +impl From for VPNGatewayRoutePropagation { + fn from(properties: VPNGatewayRoutePropagationProperties) -> VPNGatewayRoutePropagation { + VPNGatewayRoutePropagation { properties } + } +} + +/// The [`AWS::EC2::Volume`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html) resource type. +#[derive(Debug, Default)] +pub struct Volume { + properties: VolumeProperties +} + +/// Properties for the `Volume` resource. +#[derive(Debug, Default)] +pub struct VolumeProperties { + /// Property [`AutoEnableIO`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-autoenableio). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub auto_enable_io: Option<::Value>, + /// Property [`AvailabilityZone`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-availabilityzone). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub availability_zone: ::Value, + /// Property [`Encrypted`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-encrypted). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub encrypted: Option<::Value>, + /// Property [`Iops`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-iops). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub iops: Option<::Value>, + /// Property [`KmsKeyId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-kmskeyid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub kms_key_id: Option<::Value>, + /// Property [`MultiAttachEnabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-multiattachenabled). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub multi_attach_enabled: Option<::Value>, + /// Property [`OutpostArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-outpostarn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub outpost_arn: Option<::Value>, + /// Property [`Size`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-size). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub size: Option<::Value>, + /// Property [`SnapshotId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-snapshotid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub snapshot_id: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`Throughput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-throughput). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub throughput: Option<::Value>, + /// Property [`VolumeType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volume.html#cfn-ec2-ebs-volume-volumetype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub volume_type: Option<::Value>, +} + +impl ::serde::Serialize for VolumeProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref auto_enable_io) = self.auto_enable_io { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AutoEnableIO", auto_enable_io)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AvailabilityZone", &self.availability_zone)?; + if let Some(ref encrypted) = self.encrypted { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Encrypted", encrypted)?; + } + if let Some(ref iops) = self.iops { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Iops", iops)?; + } + if let Some(ref kms_key_id) = self.kms_key_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "KmsKeyId", kms_key_id)?; + } + if let Some(ref multi_attach_enabled) = self.multi_attach_enabled { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MultiAttachEnabled", multi_attach_enabled)?; + } + if let Some(ref outpost_arn) = self.outpost_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OutpostArn", outpost_arn)?; + } + if let Some(ref size) = self.size { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Size", size)?; + } + if let Some(ref snapshot_id) = self.snapshot_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SnapshotId", snapshot_id)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + if let Some(ref throughput) = self.throughput { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Throughput", throughput)?; + } + if let Some(ref volume_type) = self.volume_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VolumeType", volume_type)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for VolumeProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = VolumeProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type VolumeProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut auto_enable_io: Option<::Value> = None; + let mut availability_zone: Option<::Value> = None; + let mut encrypted: Option<::Value> = None; + let mut iops: Option<::Value> = None; + let mut kms_key_id: Option<::Value> = None; + let mut multi_attach_enabled: Option<::Value> = None; + let mut outpost_arn: Option<::Value> = None; + let mut size: Option<::Value> = None; + let mut snapshot_id: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut throughput: Option<::Value> = None; + let mut volume_type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AutoEnableIO" => { + auto_enable_io = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AvailabilityZone" => { + availability_zone = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Encrypted" => { + encrypted = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Iops" => { + iops = ::serde::de::MapAccess::next_value(&mut map)?; + } + "KmsKeyId" => { + kms_key_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MultiAttachEnabled" => { + multi_attach_enabled = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OutpostArn" => { + outpost_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Size" => { + size = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SnapshotId" => { + snapshot_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Throughput" => { + throughput = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VolumeType" => { + volume_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(VolumeProperties { + auto_enable_io: auto_enable_io, + availability_zone: availability_zone.ok_or(::serde::de::Error::missing_field("AvailabilityZone"))?, + encrypted: encrypted, + iops: iops, + kms_key_id: kms_key_id, + multi_attach_enabled: multi_attach_enabled, + outpost_arn: outpost_arn, + size: size, + snapshot_id: snapshot_id, + tags: tags, + throughput: throughput, + volume_type: volume_type, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for Volume { + type Properties = VolumeProperties; + const TYPE: &'static str = "AWS::EC2::Volume"; + fn properties(&self) -> &VolumeProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut VolumeProperties { + &mut self.properties + } +} + +impl ::private::Sealed for Volume {} + +impl From for Volume { + fn from(properties: VolumeProperties) -> Volume { + Volume { properties } + } +} + +/// The [`AWS::EC2::VolumeAttachment`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volumeattachment.html) resource type. +#[derive(Debug, Default)] +pub struct VolumeAttachment { + properties: VolumeAttachmentProperties +} + +/// Properties for the `VolumeAttachment` resource. +#[derive(Debug, Default)] +pub struct VolumeAttachmentProperties { + /// Property [`Device`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volumeattachment.html#cfn-ec2-ebs-volumeattachment-device). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub device: ::Value, + /// Property [`InstanceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volumeattachment.html#cfn-ec2-ebs-volumeattachment-instanceid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub instance_id: ::Value, + /// Property [`VolumeId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ebs-volumeattachment.html#cfn-ec2-ebs-volumeattachment-volumeid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub volume_id: ::Value, +} + +impl ::serde::Serialize for VolumeAttachmentProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Device", &self.device)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceId", &self.instance_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VolumeId", &self.volume_id)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for VolumeAttachmentProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = VolumeAttachmentProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type VolumeAttachmentProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut device: Option<::Value> = None; + let mut instance_id: Option<::Value> = None; + let mut volume_id: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Device" => { + device = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceId" => { + instance_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VolumeId" => { + volume_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(VolumeAttachmentProperties { + device: device.ok_or(::serde::de::Error::missing_field("Device"))?, + instance_id: instance_id.ok_or(::serde::de::Error::missing_field("InstanceId"))?, + volume_id: volume_id.ok_or(::serde::de::Error::missing_field("VolumeId"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for VolumeAttachment { + type Properties = VolumeAttachmentProperties; + const TYPE: &'static str = "AWS::EC2::VolumeAttachment"; + fn properties(&self) -> &VolumeAttachmentProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut VolumeAttachmentProperties { + &mut self.properties + } +} + +impl ::private::Sealed for VolumeAttachment {} + +impl From for VolumeAttachment { + fn from(properties: VolumeAttachmentProperties) -> VolumeAttachment { + VolumeAttachment { properties } + } +} + +pub mod capacity_reservation { + //! Property types for the `CapacityReservation` resource. + + /// The [`AWS::EC2::CapacityReservation.TagSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservation-tagspecification.html) property type. + #[derive(Debug, Default)] + pub struct TagSpecification { + /// Property [`ResourceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservation-tagspecification.html#cfn-ec2-capacityreservation-tagspecification-resourcetype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub resource_type: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservation-tagspecification.html#cfn-ec2-capacityreservation-tagspecification-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + } + + impl ::codec::SerializeValue for TagSpecification { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref resource_type) = self.resource_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceType", resource_type)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for TagSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = TagSpecification; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type TagSpecification") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut resource_type: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ResourceType" => { + resource_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(TagSpecification { + resource_type: resource_type, + tags: tags, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + +pub mod capacity_reservation_fleet { + //! Property types for the `CapacityReservationFleet` resource. + + /// The [`AWS::EC2::CapacityReservationFleet.InstanceTypeSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservationfleet-instancetypespecification.html) property type. + #[derive(Debug, Default)] + pub struct InstanceTypeSpecification { + /// Property [`AvailabilityZone`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservationfleet-instancetypespecification.html#cfn-ec2-capacityreservationfleet-instancetypespecification-availabilityzone). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub availability_zone: Option<::Value>, + /// Property [`AvailabilityZoneId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservationfleet-instancetypespecification.html#cfn-ec2-capacityreservationfleet-instancetypespecification-availabilityzoneid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub availability_zone_id: Option<::Value>, + /// Property [`EbsOptimized`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservationfleet-instancetypespecification.html#cfn-ec2-capacityreservationfleet-instancetypespecification-ebsoptimized). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub ebs_optimized: Option<::Value>, + /// Property [`InstancePlatform`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservationfleet-instancetypespecification.html#cfn-ec2-capacityreservationfleet-instancetypespecification-instanceplatform). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub instance_platform: Option<::Value>, + /// Property [`InstanceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservationfleet-instancetypespecification.html#cfn-ec2-capacityreservationfleet-instancetypespecification-instancetype). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub instance_type: Option<::Value>, + /// Property [`Priority`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservationfleet-instancetypespecification.html#cfn-ec2-capacityreservationfleet-instancetypespecification-priority). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub priority: Option<::Value>, + /// Property [`Weight`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservationfleet-instancetypespecification.html#cfn-ec2-capacityreservationfleet-instancetypespecification-weight). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub weight: Option<::Value>, + } + + impl ::codec::SerializeValue for InstanceTypeSpecification { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref availability_zone) = self.availability_zone { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AvailabilityZone", availability_zone)?; + } + if let Some(ref availability_zone_id) = self.availability_zone_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AvailabilityZoneId", availability_zone_id)?; + } + if let Some(ref ebs_optimized) = self.ebs_optimized { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EbsOptimized", ebs_optimized)?; + } + if let Some(ref instance_platform) = self.instance_platform { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstancePlatform", instance_platform)?; + } + if let Some(ref instance_type) = self.instance_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceType", instance_type)?; + } + if let Some(ref priority) = self.priority { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Priority", priority)?; + } + if let Some(ref weight) = self.weight { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Weight", weight)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for InstanceTypeSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = InstanceTypeSpecification; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type InstanceTypeSpecification") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut availability_zone: Option<::Value> = None; + let mut availability_zone_id: Option<::Value> = None; + let mut ebs_optimized: Option<::Value> = None; + let mut instance_platform: Option<::Value> = None; + let mut instance_type: Option<::Value> = None; + let mut priority: Option<::Value> = None; + let mut weight: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AvailabilityZone" => { + availability_zone = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AvailabilityZoneId" => { + availability_zone_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EbsOptimized" => { + ebs_optimized = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstancePlatform" => { + instance_platform = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceType" => { + instance_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Priority" => { + priority = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Weight" => { + weight = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(InstanceTypeSpecification { + availability_zone: availability_zone, + availability_zone_id: availability_zone_id, + ebs_optimized: ebs_optimized, + instance_platform: instance_platform, + instance_type: instance_type, + priority: priority, + weight: weight, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::CapacityReservationFleet.TagSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservationfleet-tagspecification.html) property type. + #[derive(Debug, Default)] + pub struct TagSpecification { + /// Property [`ResourceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservationfleet-tagspecification.html#cfn-ec2-capacityreservationfleet-tagspecification-resourcetype). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub resource_type: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservationfleet-tagspecification.html#cfn-ec2-capacityreservationfleet-tagspecification-tags). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + } + + impl ::codec::SerializeValue for TagSpecification { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref resource_type) = self.resource_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceType", resource_type)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for TagSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = TagSpecification; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type TagSpecification") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut resource_type: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ResourceType" => { + resource_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(TagSpecification { + resource_type: resource_type, + tags: tags, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + +pub mod client_vpn_endpoint { + //! Property types for the `ClientVpnEndpoint` resource. + + /// The [`AWS::EC2::ClientVpnEndpoint.CertificateAuthenticationRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-certificateauthenticationrequest.html) property type. + #[derive(Debug, Default)] + pub struct CertificateAuthenticationRequest { + /// Property [`ClientRootCertificateChainArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-certificateauthenticationrequest.html#cfn-ec2-clientvpnendpoint-certificateauthenticationrequest-clientrootcertificatechainarn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub client_root_certificate_chain_arn: ::Value, + } + + impl ::codec::SerializeValue for CertificateAuthenticationRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ClientRootCertificateChainArn", &self.client_root_certificate_chain_arn)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CertificateAuthenticationRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CertificateAuthenticationRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CertificateAuthenticationRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut client_root_certificate_chain_arn: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ClientRootCertificateChainArn" => { + client_root_certificate_chain_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CertificateAuthenticationRequest { + client_root_certificate_chain_arn: client_root_certificate_chain_arn.ok_or(::serde::de::Error::missing_field("ClientRootCertificateChainArn"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::ClientVpnEndpoint.ClientAuthenticationRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientauthenticationrequest.html) property type. + #[derive(Debug, Default)] + pub struct ClientAuthenticationRequest { + /// Property [`ActiveDirectory`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientauthenticationrequest.html#cfn-ec2-clientvpnendpoint-clientauthenticationrequest-activedirectory). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub active_directory: Option<::Value>, + /// Property [`FederatedAuthentication`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientauthenticationrequest.html#cfn-ec2-clientvpnendpoint-clientauthenticationrequest-federatedauthentication). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub federated_authentication: Option<::Value>, + /// Property [`MutualAuthentication`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientauthenticationrequest.html#cfn-ec2-clientvpnendpoint-clientauthenticationrequest-mutualauthentication). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub mutual_authentication: Option<::Value>, + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientauthenticationrequest.html#cfn-ec2-clientvpnendpoint-clientauthenticationrequest-type). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#type: ::Value, + } + + impl ::codec::SerializeValue for ClientAuthenticationRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref active_directory) = self.active_directory { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ActiveDirectory", active_directory)?; + } + if let Some(ref federated_authentication) = self.federated_authentication { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FederatedAuthentication", federated_authentication)?; + } + if let Some(ref mutual_authentication) = self.mutual_authentication { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MutualAuthentication", mutual_authentication)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ClientAuthenticationRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ClientAuthenticationRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ClientAuthenticationRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut active_directory: Option<::Value> = None; + let mut federated_authentication: Option<::Value> = None; + let mut mutual_authentication: Option<::Value> = None; + let mut r#type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ActiveDirectory" => { + active_directory = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FederatedAuthentication" => { + federated_authentication = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MutualAuthentication" => { + mutual_authentication = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ClientAuthenticationRequest { + active_directory: active_directory, + federated_authentication: federated_authentication, + mutual_authentication: mutual_authentication, + r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::ClientVpnEndpoint.ClientConnectOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientconnectoptions.html) property type. + #[derive(Debug, Default)] + pub struct ClientConnectOptions { + /// Property [`Enabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientconnectoptions.html#cfn-ec2-clientvpnendpoint-clientconnectoptions-enabled). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enabled: ::Value, + /// Property [`LambdaFunctionArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientconnectoptions.html#cfn-ec2-clientvpnendpoint-clientconnectoptions-lambdafunctionarn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub lambda_function_arn: Option<::Value>, + } + + impl ::codec::SerializeValue for ClientConnectOptions { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Enabled", &self.enabled)?; + if let Some(ref lambda_function_arn) = self.lambda_function_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LambdaFunctionArn", lambda_function_arn)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ClientConnectOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ClientConnectOptions; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ClientConnectOptions") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut enabled: Option<::Value> = None; + let mut lambda_function_arn: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Enabled" => { + enabled = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LambdaFunctionArn" => { + lambda_function_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ClientConnectOptions { + enabled: enabled.ok_or(::serde::de::Error::missing_field("Enabled"))?, + lambda_function_arn: lambda_function_arn, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::ClientVpnEndpoint.ClientLoginBannerOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientloginbanneroptions.html) property type. + #[derive(Debug, Default)] + pub struct ClientLoginBannerOptions { + /// Property [`BannerText`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientloginbanneroptions.html#cfn-ec2-clientvpnendpoint-clientloginbanneroptions-bannertext). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub banner_text: Option<::Value>, + /// Property [`Enabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientloginbanneroptions.html#cfn-ec2-clientvpnendpoint-clientloginbanneroptions-enabled). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enabled: ::Value, + } + + impl ::codec::SerializeValue for ClientLoginBannerOptions { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref banner_text) = self.banner_text { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BannerText", banner_text)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Enabled", &self.enabled)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ClientLoginBannerOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ClientLoginBannerOptions; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ClientLoginBannerOptions") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut banner_text: Option<::Value> = None; + let mut enabled: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "BannerText" => { + banner_text = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Enabled" => { + enabled = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ClientLoginBannerOptions { + banner_text: banner_text, + enabled: enabled.ok_or(::serde::de::Error::missing_field("Enabled"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::ClientVpnEndpoint.ConnectionLogOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-connectionlogoptions.html) property type. + #[derive(Debug, Default)] + pub struct ConnectionLogOptions { + /// Property [`CloudwatchLogGroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-connectionlogoptions.html#cfn-ec2-clientvpnendpoint-connectionlogoptions-cloudwatchloggroup). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub cloudwatch_log_group: Option<::Value>, + /// Property [`CloudwatchLogStream`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-connectionlogoptions.html#cfn-ec2-clientvpnendpoint-connectionlogoptions-cloudwatchlogstream). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub cloudwatch_log_stream: Option<::Value>, + /// Property [`Enabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-connectionlogoptions.html#cfn-ec2-clientvpnendpoint-connectionlogoptions-enabled). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enabled: ::Value, + } + + impl ::codec::SerializeValue for ConnectionLogOptions { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref cloudwatch_log_group) = self.cloudwatch_log_group { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CloudwatchLogGroup", cloudwatch_log_group)?; + } + if let Some(ref cloudwatch_log_stream) = self.cloudwatch_log_stream { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CloudwatchLogStream", cloudwatch_log_stream)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Enabled", &self.enabled)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ConnectionLogOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ConnectionLogOptions; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ConnectionLogOptions") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut cloudwatch_log_group: Option<::Value> = None; + let mut cloudwatch_log_stream: Option<::Value> = None; + let mut enabled: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CloudwatchLogGroup" => { + cloudwatch_log_group = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CloudwatchLogStream" => { + cloudwatch_log_stream = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Enabled" => { + enabled = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ConnectionLogOptions { + cloudwatch_log_group: cloudwatch_log_group, + cloudwatch_log_stream: cloudwatch_log_stream, + enabled: enabled.ok_or(::serde::de::Error::missing_field("Enabled"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::ClientVpnEndpoint.DirectoryServiceAuthenticationRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-directoryserviceauthenticationrequest.html) property type. + #[derive(Debug, Default)] + pub struct DirectoryServiceAuthenticationRequest { + /// Property [`DirectoryId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-directoryserviceauthenticationrequest.html#cfn-ec2-clientvpnendpoint-directoryserviceauthenticationrequest-directoryid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub directory_id: ::Value, + } + + impl ::codec::SerializeValue for DirectoryServiceAuthenticationRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DirectoryId", &self.directory_id)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for DirectoryServiceAuthenticationRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = DirectoryServiceAuthenticationRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type DirectoryServiceAuthenticationRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut directory_id: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DirectoryId" => { + directory_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(DirectoryServiceAuthenticationRequest { + directory_id: directory_id.ok_or(::serde::de::Error::missing_field("DirectoryId"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::ClientVpnEndpoint.FederatedAuthenticationRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-federatedauthenticationrequest.html) property type. + #[derive(Debug, Default)] + pub struct FederatedAuthenticationRequest { + /// Property [`SAMLProviderArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-federatedauthenticationrequest.html#cfn-ec2-clientvpnendpoint-federatedauthenticationrequest-samlproviderarn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub saml_provider_arn: ::Value, + /// Property [`SelfServiceSAMLProviderArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-federatedauthenticationrequest.html#cfn-ec2-clientvpnendpoint-federatedauthenticationrequest-selfservicesamlproviderarn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub self_service_saml_provider_arn: Option<::Value>, + } + + impl ::codec::SerializeValue for FederatedAuthenticationRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SAMLProviderArn", &self.saml_provider_arn)?; + if let Some(ref self_service_saml_provider_arn) = self.self_service_saml_provider_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SelfServiceSAMLProviderArn", self_service_saml_provider_arn)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for FederatedAuthenticationRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = FederatedAuthenticationRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type FederatedAuthenticationRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut saml_provider_arn: Option<::Value> = None; + let mut self_service_saml_provider_arn: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "SAMLProviderArn" => { + saml_provider_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SelfServiceSAMLProviderArn" => { + self_service_saml_provider_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(FederatedAuthenticationRequest { + saml_provider_arn: saml_provider_arn.ok_or(::serde::de::Error::missing_field("SAMLProviderArn"))?, + self_service_saml_provider_arn: self_service_saml_provider_arn, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::ClientVpnEndpoint.TagSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-tagspecification.html) property type. + #[derive(Debug, Default)] + pub struct TagSpecification { + /// Property [`ResourceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-tagspecification.html#cfn-ec2-clientvpnendpoint-tagspecification-resourcetype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub resource_type: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-tagspecification.html#cfn-ec2-clientvpnendpoint-tagspecification-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: ::ValueList<::Tag>, + } + + impl ::codec::SerializeValue for TagSpecification { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceType", &self.resource_type)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", &self.tags)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for TagSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = TagSpecification; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type TagSpecification") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut resource_type: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ResourceType" => { + resource_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(TagSpecification { + resource_type: resource_type.ok_or(::serde::de::Error::missing_field("ResourceType"))?, + tags: tags.ok_or(::serde::de::Error::missing_field("Tags"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + +pub mod ec2_fleet { + //! Property types for the `EC2Fleet` resource. + + /// The [`AWS::EC2::EC2Fleet.AcceleratorCountRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-acceleratorcountrequest.html) property type. + #[derive(Debug, Default)] + pub struct AcceleratorCountRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-acceleratorcountrequest.html#cfn-ec2-ec2fleet-acceleratorcountrequest-max). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-acceleratorcountrequest.html#cfn-ec2-ec2fleet-acceleratorcountrequest-min). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub min: Option<::Value>, + } + + impl ::codec::SerializeValue for AcceleratorCountRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AcceleratorCountRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AcceleratorCountRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AcceleratorCountRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AcceleratorCountRequest { + max: max, + min: min, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::EC2Fleet.AcceleratorTotalMemoryMiBRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-acceleratortotalmemorymibrequest.html) property type. + #[derive(Debug, Default)] + pub struct AcceleratorTotalMemoryMiBRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-acceleratortotalmemorymibrequest.html#cfn-ec2-ec2fleet-acceleratortotalmemorymibrequest-max). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-acceleratortotalmemorymibrequest.html#cfn-ec2-ec2fleet-acceleratortotalmemorymibrequest-min). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub min: Option<::Value>, + } + + impl ::codec::SerializeValue for AcceleratorTotalMemoryMiBRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AcceleratorTotalMemoryMiBRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AcceleratorTotalMemoryMiBRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AcceleratorTotalMemoryMiBRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AcceleratorTotalMemoryMiBRequest { + max: max, + min: min, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::EC2Fleet.BaselineEbsBandwidthMbpsRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-baselineebsbandwidthmbpsrequest.html) property type. + #[derive(Debug, Default)] + pub struct BaselineEbsBandwidthMbpsRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-baselineebsbandwidthmbpsrequest.html#cfn-ec2-ec2fleet-baselineebsbandwidthmbpsrequest-max). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-baselineebsbandwidthmbpsrequest.html#cfn-ec2-ec2fleet-baselineebsbandwidthmbpsrequest-min). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub min: Option<::Value>, + } + + impl ::codec::SerializeValue for BaselineEbsBandwidthMbpsRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for BaselineEbsBandwidthMbpsRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = BaselineEbsBandwidthMbpsRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type BaselineEbsBandwidthMbpsRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(BaselineEbsBandwidthMbpsRequest { + max: max, + min: min, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::EC2Fleet.CapacityRebalance`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-capacityrebalance.html) property type. + #[derive(Debug, Default)] + pub struct CapacityRebalance { + /// Property [`ReplacementStrategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-capacityrebalance.html#cfn-ec2-ec2fleet-capacityrebalance-replacementstrategy). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub replacement_strategy: Option<::Value>, + /// Property [`TerminationDelay`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-capacityrebalance.html#cfn-ec2-ec2fleet-capacityrebalance-terminationdelay). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub termination_delay: Option<::Value>, + } + + impl ::codec::SerializeValue for CapacityRebalance { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref replacement_strategy) = self.replacement_strategy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReplacementStrategy", replacement_strategy)?; + } + if let Some(ref termination_delay) = self.termination_delay { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TerminationDelay", termination_delay)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CapacityRebalance { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CapacityRebalance; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CapacityRebalance") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut replacement_strategy: Option<::Value> = None; + let mut termination_delay: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ReplacementStrategy" => { + replacement_strategy = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TerminationDelay" => { + termination_delay = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CapacityRebalance { + replacement_strategy: replacement_strategy, + termination_delay: termination_delay, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::EC2Fleet.CapacityReservationOptionsRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-capacityreservationoptionsrequest.html) property type. + #[derive(Debug, Default)] + pub struct CapacityReservationOptionsRequest { + /// Property [`UsageStrategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-capacityreservationoptionsrequest.html#cfn-ec2-ec2fleet-capacityreservationoptionsrequest-usagestrategy). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub usage_strategy: Option<::Value>, + } + + impl ::codec::SerializeValue for CapacityReservationOptionsRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref usage_strategy) = self.usage_strategy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UsageStrategy", usage_strategy)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CapacityReservationOptionsRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CapacityReservationOptionsRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CapacityReservationOptionsRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut usage_strategy: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "UsageStrategy" => { + usage_strategy = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CapacityReservationOptionsRequest { + usage_strategy: usage_strategy, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::EC2Fleet.FleetLaunchTemplateConfigRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateconfigrequest.html) property type. + #[derive(Debug, Default)] + pub struct FleetLaunchTemplateConfigRequest { + /// Property [`LaunchTemplateSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateconfigrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateconfigrequest-launchtemplatespecification). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub launch_template_specification: Option<::Value>, + /// Property [`Overrides`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateconfigrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateconfigrequest-overrides). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub overrides: Option<::ValueList>, + } + + impl ::codec::SerializeValue for FleetLaunchTemplateConfigRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref launch_template_specification) = self.launch_template_specification { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplateSpecification", launch_template_specification)?; + } + if let Some(ref overrides) = self.overrides { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Overrides", overrides)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for FleetLaunchTemplateConfigRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = FleetLaunchTemplateConfigRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type FleetLaunchTemplateConfigRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut launch_template_specification: Option<::Value> = None; + let mut overrides: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "LaunchTemplateSpecification" => { + launch_template_specification = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Overrides" => { + overrides = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(FleetLaunchTemplateConfigRequest { + launch_template_specification: launch_template_specification, + overrides: overrides, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::EC2Fleet.FleetLaunchTemplateOverridesRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html) property type. + #[derive(Debug, Default)] + pub struct FleetLaunchTemplateOverridesRequest { + /// Property [`AvailabilityZone`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest-availabilityzone). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub availability_zone: Option<::Value>, + /// Property [`InstanceRequirements`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest-instancerequirements). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub instance_requirements: Option<::Value>, + /// Property [`InstanceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest-instancetype). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub instance_type: Option<::Value>, + /// Property [`MaxPrice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest-maxprice). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub max_price: Option<::Value>, + /// Property [`Placement`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest-placement). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub placement: Option<::Value>, + /// Property [`Priority`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest-priority). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub priority: Option<::Value>, + /// Property [`SubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest-subnetid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub subnet_id: Option<::Value>, + /// Property [`WeightedCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest-weightedcapacity). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub weighted_capacity: Option<::Value>, + } + + impl ::codec::SerializeValue for FleetLaunchTemplateOverridesRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref availability_zone) = self.availability_zone { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AvailabilityZone", availability_zone)?; + } + if let Some(ref instance_requirements) = self.instance_requirements { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceRequirements", instance_requirements)?; + } + if let Some(ref instance_type) = self.instance_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceType", instance_type)?; + } + if let Some(ref max_price) = self.max_price { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxPrice", max_price)?; + } + if let Some(ref placement) = self.placement { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Placement", placement)?; + } + if let Some(ref priority) = self.priority { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Priority", priority)?; + } + if let Some(ref subnet_id) = self.subnet_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetId", subnet_id)?; + } + if let Some(ref weighted_capacity) = self.weighted_capacity { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "WeightedCapacity", weighted_capacity)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for FleetLaunchTemplateOverridesRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = FleetLaunchTemplateOverridesRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type FleetLaunchTemplateOverridesRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut availability_zone: Option<::Value> = None; + let mut instance_requirements: Option<::Value> = None; + let mut instance_type: Option<::Value> = None; + let mut max_price: Option<::Value> = None; + let mut placement: Option<::Value> = None; + let mut priority: Option<::Value> = None; + let mut subnet_id: Option<::Value> = None; + let mut weighted_capacity: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AvailabilityZone" => { + availability_zone = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceRequirements" => { + instance_requirements = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceType" => { + instance_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MaxPrice" => { + max_price = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Placement" => { + placement = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Priority" => { + priority = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SubnetId" => { + subnet_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "WeightedCapacity" => { + weighted_capacity = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(FleetLaunchTemplateOverridesRequest { + availability_zone: availability_zone, + instance_requirements: instance_requirements, + instance_type: instance_type, + max_price: max_price, + placement: placement, + priority: priority, + subnet_id: subnet_id, + weighted_capacity: weighted_capacity, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::EC2Fleet.FleetLaunchTemplateSpecificationRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplatespecificationrequest.html) property type. + #[derive(Debug, Default)] + pub struct FleetLaunchTemplateSpecificationRequest { + /// Property [`LaunchTemplateId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplatespecificationrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplatespecificationrequest-launchtemplateid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub launch_template_id: Option<::Value>, + /// Property [`LaunchTemplateName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplatespecificationrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplatespecificationrequest-launchtemplatename). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub launch_template_name: Option<::Value>, + /// Property [`Version`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplatespecificationrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplatespecificationrequest-version). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub version: Option<::Value>, + } + + impl ::codec::SerializeValue for FleetLaunchTemplateSpecificationRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref launch_template_id) = self.launch_template_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplateId", launch_template_id)?; + } + if let Some(ref launch_template_name) = self.launch_template_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplateName", launch_template_name)?; + } + if let Some(ref version) = self.version { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Version", version)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for FleetLaunchTemplateSpecificationRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = FleetLaunchTemplateSpecificationRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type FleetLaunchTemplateSpecificationRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut launch_template_id: Option<::Value> = None; + let mut launch_template_name: Option<::Value> = None; + let mut version: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "LaunchTemplateId" => { + launch_template_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LaunchTemplateName" => { + launch_template_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Version" => { + version = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(FleetLaunchTemplateSpecificationRequest { + launch_template_id: launch_template_id, + launch_template_name: launch_template_name, + version: version, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::EC2Fleet.InstanceRequirementsRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html) property type. + #[derive(Debug, Default)] + pub struct InstanceRequirementsRequest { + /// Property [`AcceleratorCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-acceleratorcount). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub accelerator_count: Option<::Value>, + /// Property [`AcceleratorManufacturers`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-acceleratormanufacturers). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub accelerator_manufacturers: Option<::ValueList>, + /// Property [`AcceleratorNames`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-acceleratornames). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub accelerator_names: Option<::ValueList>, + /// Property [`AcceleratorTotalMemoryMiB`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-acceleratortotalmemorymib). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub accelerator_total_memory_mi_b: Option<::Value>, + /// Property [`AcceleratorTypes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-acceleratortypes). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub accelerator_types: Option<::ValueList>, + /// Property [`BareMetal`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-baremetal). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub bare_metal: Option<::Value>, + /// Property [`BaselineEbsBandwidthMbps`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-baselineebsbandwidthmbps). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub baseline_ebs_bandwidth_mbps: Option<::Value>, + /// Property [`BurstablePerformance`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-burstableperformance). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub burstable_performance: Option<::Value>, + /// Property [`CpuManufacturers`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-cpumanufacturers). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub cpu_manufacturers: Option<::ValueList>, + /// Property [`ExcludedInstanceTypes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-excludedinstancetypes). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub excluded_instance_types: Option<::ValueList>, + /// Property [`InstanceGenerations`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-instancegenerations). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub instance_generations: Option<::ValueList>, + /// Property [`LocalStorage`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-localstorage). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub local_storage: Option<::Value>, + /// Property [`LocalStorageTypes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-localstoragetypes). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub local_storage_types: Option<::ValueList>, + /// Property [`MemoryGiBPerVCpu`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-memorygibpervcpu). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub memory_gi_b_per_v_cpu: Option<::Value>, + /// Property [`MemoryMiB`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-memorymib). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub memory_mi_b: Option<::Value>, + /// Property [`NetworkInterfaceCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-networkinterfacecount). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub network_interface_count: Option<::Value>, + /// Property [`OnDemandMaxPricePercentageOverLowestPrice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-ondemandmaxpricepercentageoverlowestprice). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub on_demand_max_price_percentage_over_lowest_price: Option<::Value>, + /// Property [`RequireHibernateSupport`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-requirehibernatesupport). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub require_hibernate_support: Option<::Value>, + /// Property [`SpotMaxPricePercentageOverLowestPrice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-spotmaxpricepercentageoverlowestprice). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub spot_max_price_percentage_over_lowest_price: Option<::Value>, + /// Property [`TotalLocalStorageGB`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-totallocalstoragegb). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub total_local_storage_gb: Option<::Value>, + /// Property [`VCpuCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-instancerequirementsrequest.html#cfn-ec2-ec2fleet-instancerequirementsrequest-vcpucount). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub v_cpu_count: Option<::Value>, + } + + impl ::codec::SerializeValue for InstanceRequirementsRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref accelerator_count) = self.accelerator_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcceleratorCount", accelerator_count)?; + } + if let Some(ref accelerator_manufacturers) = self.accelerator_manufacturers { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcceleratorManufacturers", accelerator_manufacturers)?; + } + if let Some(ref accelerator_names) = self.accelerator_names { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcceleratorNames", accelerator_names)?; + } + if let Some(ref accelerator_total_memory_mi_b) = self.accelerator_total_memory_mi_b { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcceleratorTotalMemoryMiB", accelerator_total_memory_mi_b)?; + } + if let Some(ref accelerator_types) = self.accelerator_types { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcceleratorTypes", accelerator_types)?; + } + if let Some(ref bare_metal) = self.bare_metal { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BareMetal", bare_metal)?; + } + if let Some(ref baseline_ebs_bandwidth_mbps) = self.baseline_ebs_bandwidth_mbps { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BaselineEbsBandwidthMbps", baseline_ebs_bandwidth_mbps)?; + } + if let Some(ref burstable_performance) = self.burstable_performance { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BurstablePerformance", burstable_performance)?; + } + if let Some(ref cpu_manufacturers) = self.cpu_manufacturers { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CpuManufacturers", cpu_manufacturers)?; + } + if let Some(ref excluded_instance_types) = self.excluded_instance_types { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExcludedInstanceTypes", excluded_instance_types)?; + } + if let Some(ref instance_generations) = self.instance_generations { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceGenerations", instance_generations)?; + } + if let Some(ref local_storage) = self.local_storage { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LocalStorage", local_storage)?; + } + if let Some(ref local_storage_types) = self.local_storage_types { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LocalStorageTypes", local_storage_types)?; + } + if let Some(ref memory_gi_b_per_v_cpu) = self.memory_gi_b_per_v_cpu { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MemoryGiBPerVCpu", memory_gi_b_per_v_cpu)?; + } + if let Some(ref memory_mi_b) = self.memory_mi_b { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MemoryMiB", memory_mi_b)?; + } + if let Some(ref network_interface_count) = self.network_interface_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaceCount", network_interface_count)?; + } + if let Some(ref on_demand_max_price_percentage_over_lowest_price) = self.on_demand_max_price_percentage_over_lowest_price { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OnDemandMaxPricePercentageOverLowestPrice", on_demand_max_price_percentage_over_lowest_price)?; + } + if let Some(ref require_hibernate_support) = self.require_hibernate_support { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RequireHibernateSupport", require_hibernate_support)?; + } + if let Some(ref spot_max_price_percentage_over_lowest_price) = self.spot_max_price_percentage_over_lowest_price { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpotMaxPricePercentageOverLowestPrice", spot_max_price_percentage_over_lowest_price)?; + } + if let Some(ref total_local_storage_gb) = self.total_local_storage_gb { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TotalLocalStorageGB", total_local_storage_gb)?; + } + if let Some(ref v_cpu_count) = self.v_cpu_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VCpuCount", v_cpu_count)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for InstanceRequirementsRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = InstanceRequirementsRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type InstanceRequirementsRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut accelerator_count: Option<::Value> = None; + let mut accelerator_manufacturers: Option<::ValueList> = None; + let mut accelerator_names: Option<::ValueList> = None; + let mut accelerator_total_memory_mi_b: Option<::Value> = None; + let mut accelerator_types: Option<::ValueList> = None; + let mut bare_metal: Option<::Value> = None; + let mut baseline_ebs_bandwidth_mbps: Option<::Value> = None; + let mut burstable_performance: Option<::Value> = None; + let mut cpu_manufacturers: Option<::ValueList> = None; + let mut excluded_instance_types: Option<::ValueList> = None; + let mut instance_generations: Option<::ValueList> = None; + let mut local_storage: Option<::Value> = None; + let mut local_storage_types: Option<::ValueList> = None; + let mut memory_gi_b_per_v_cpu: Option<::Value> = None; + let mut memory_mi_b: Option<::Value> = None; + let mut network_interface_count: Option<::Value> = None; + let mut on_demand_max_price_percentage_over_lowest_price: Option<::Value> = None; + let mut require_hibernate_support: Option<::Value> = None; + let mut spot_max_price_percentage_over_lowest_price: Option<::Value> = None; + let mut total_local_storage_gb: Option<::Value> = None; + let mut v_cpu_count: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AcceleratorCount" => { + accelerator_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AcceleratorManufacturers" => { + accelerator_manufacturers = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AcceleratorNames" => { + accelerator_names = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AcceleratorTotalMemoryMiB" => { + accelerator_total_memory_mi_b = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AcceleratorTypes" => { + accelerator_types = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BareMetal" => { + bare_metal = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BaselineEbsBandwidthMbps" => { + baseline_ebs_bandwidth_mbps = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BurstablePerformance" => { + burstable_performance = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CpuManufacturers" => { + cpu_manufacturers = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ExcludedInstanceTypes" => { + excluded_instance_types = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceGenerations" => { + instance_generations = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LocalStorage" => { + local_storage = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LocalStorageTypes" => { + local_storage_types = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MemoryGiBPerVCpu" => { + memory_gi_b_per_v_cpu = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MemoryMiB" => { + memory_mi_b = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NetworkInterfaceCount" => { + network_interface_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OnDemandMaxPricePercentageOverLowestPrice" => { + on_demand_max_price_percentage_over_lowest_price = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RequireHibernateSupport" => { + require_hibernate_support = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SpotMaxPricePercentageOverLowestPrice" => { + spot_max_price_percentage_over_lowest_price = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TotalLocalStorageGB" => { + total_local_storage_gb = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VCpuCount" => { + v_cpu_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(InstanceRequirementsRequest { + accelerator_count: accelerator_count, + accelerator_manufacturers: accelerator_manufacturers, + accelerator_names: accelerator_names, + accelerator_total_memory_mi_b: accelerator_total_memory_mi_b, + accelerator_types: accelerator_types, + bare_metal: bare_metal, + baseline_ebs_bandwidth_mbps: baseline_ebs_bandwidth_mbps, + burstable_performance: burstable_performance, + cpu_manufacturers: cpu_manufacturers, + excluded_instance_types: excluded_instance_types, + instance_generations: instance_generations, + local_storage: local_storage, + local_storage_types: local_storage_types, + memory_gi_b_per_v_cpu: memory_gi_b_per_v_cpu, + memory_mi_b: memory_mi_b, + network_interface_count: network_interface_count, + on_demand_max_price_percentage_over_lowest_price: on_demand_max_price_percentage_over_lowest_price, + require_hibernate_support: require_hibernate_support, + spot_max_price_percentage_over_lowest_price: spot_max_price_percentage_over_lowest_price, + total_local_storage_gb: total_local_storage_gb, + v_cpu_count: v_cpu_count, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::EC2Fleet.MaintenanceStrategies`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-maintenancestrategies.html) property type. + #[derive(Debug, Default)] + pub struct MaintenanceStrategies { + /// Property [`CapacityRebalance`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-maintenancestrategies.html#cfn-ec2-ec2fleet-maintenancestrategies-capacityrebalance). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub capacity_rebalance: Option<::Value>, + } + + impl ::codec::SerializeValue for MaintenanceStrategies { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref capacity_rebalance) = self.capacity_rebalance { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CapacityRebalance", capacity_rebalance)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for MaintenanceStrategies { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MaintenanceStrategies; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MaintenanceStrategies") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut capacity_rebalance: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CapacityRebalance" => { + capacity_rebalance = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(MaintenanceStrategies { + capacity_rebalance: capacity_rebalance, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::EC2Fleet.MemoryGiBPerVCpuRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-memorygibpervcpurequest.html) property type. + #[derive(Debug, Default)] + pub struct MemoryGiBPerVCpuRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-memorygibpervcpurequest.html#cfn-ec2-ec2fleet-memorygibpervcpurequest-max). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-memorygibpervcpurequest.html#cfn-ec2-ec2fleet-memorygibpervcpurequest-min). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub min: Option<::Value>, + } + + impl ::codec::SerializeValue for MemoryGiBPerVCpuRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for MemoryGiBPerVCpuRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MemoryGiBPerVCpuRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MemoryGiBPerVCpuRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(MemoryGiBPerVCpuRequest { + max: max, + min: min, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::EC2Fleet.MemoryMiBRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-memorymibrequest.html) property type. + #[derive(Debug, Default)] + pub struct MemoryMiBRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-memorymibrequest.html#cfn-ec2-ec2fleet-memorymibrequest-max). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-memorymibrequest.html#cfn-ec2-ec2fleet-memorymibrequest-min). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub min: Option<::Value>, + } + + impl ::codec::SerializeValue for MemoryMiBRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for MemoryMiBRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MemoryMiBRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MemoryMiBRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(MemoryMiBRequest { + max: max, + min: min, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::EC2Fleet.NetworkInterfaceCountRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-networkinterfacecountrequest.html) property type. + #[derive(Debug, Default)] + pub struct NetworkInterfaceCountRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-networkinterfacecountrequest.html#cfn-ec2-ec2fleet-networkinterfacecountrequest-max). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-networkinterfacecountrequest.html#cfn-ec2-ec2fleet-networkinterfacecountrequest-min). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub min: Option<::Value>, + } + + impl ::codec::SerializeValue for NetworkInterfaceCountRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for NetworkInterfaceCountRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = NetworkInterfaceCountRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type NetworkInterfaceCountRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(NetworkInterfaceCountRequest { + max: max, + min: min, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::EC2Fleet.OnDemandOptionsRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-ondemandoptionsrequest.html) property type. + #[derive(Debug, Default)] + pub struct OnDemandOptionsRequest { + /// Property [`AllocationStrategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-ondemandoptionsrequest.html#cfn-ec2-ec2fleet-ondemandoptionsrequest-allocationstrategy). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub allocation_strategy: Option<::Value>, + /// Property [`CapacityReservationOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-ondemandoptionsrequest.html#cfn-ec2-ec2fleet-ondemandoptionsrequest-capacityreservationoptions). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub capacity_reservation_options: Option<::Value>, + /// Property [`MaxTotalPrice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-ondemandoptionsrequest.html#cfn-ec2-ec2fleet-ondemandoptionsrequest-maxtotalprice). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub max_total_price: Option<::Value>, + /// Property [`MinTargetCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-ondemandoptionsrequest.html#cfn-ec2-ec2fleet-ondemandoptionsrequest-mintargetcapacity). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub min_target_capacity: Option<::Value>, + /// Property [`SingleAvailabilityZone`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-ondemandoptionsrequest.html#cfn-ec2-ec2fleet-ondemandoptionsrequest-singleavailabilityzone). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub single_availability_zone: Option<::Value>, + /// Property [`SingleInstanceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-ondemandoptionsrequest.html#cfn-ec2-ec2fleet-ondemandoptionsrequest-singleinstancetype). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub single_instance_type: Option<::Value>, + } + + impl ::codec::SerializeValue for OnDemandOptionsRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref allocation_strategy) = self.allocation_strategy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AllocationStrategy", allocation_strategy)?; + } + if let Some(ref capacity_reservation_options) = self.capacity_reservation_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CapacityReservationOptions", capacity_reservation_options)?; + } + if let Some(ref max_total_price) = self.max_total_price { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxTotalPrice", max_total_price)?; + } + if let Some(ref min_target_capacity) = self.min_target_capacity { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MinTargetCapacity", min_target_capacity)?; + } + if let Some(ref single_availability_zone) = self.single_availability_zone { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SingleAvailabilityZone", single_availability_zone)?; + } + if let Some(ref single_instance_type) = self.single_instance_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SingleInstanceType", single_instance_type)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for OnDemandOptionsRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = OnDemandOptionsRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type OnDemandOptionsRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut allocation_strategy: Option<::Value> = None; + let mut capacity_reservation_options: Option<::Value> = None; + let mut max_total_price: Option<::Value> = None; + let mut min_target_capacity: Option<::Value> = None; + let mut single_availability_zone: Option<::Value> = None; + let mut single_instance_type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AllocationStrategy" => { + allocation_strategy = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CapacityReservationOptions" => { + capacity_reservation_options = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MaxTotalPrice" => { + max_total_price = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MinTargetCapacity" => { + min_target_capacity = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SingleAvailabilityZone" => { + single_availability_zone = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SingleInstanceType" => { + single_instance_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(OnDemandOptionsRequest { + allocation_strategy: allocation_strategy, + capacity_reservation_options: capacity_reservation_options, + max_total_price: max_total_price, + min_target_capacity: min_target_capacity, + single_availability_zone: single_availability_zone, + single_instance_type: single_instance_type, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::EC2Fleet.Placement`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html) property type. + #[derive(Debug, Default)] + pub struct Placement { + /// Property [`Affinity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-affinity). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub affinity: Option<::Value>, + /// Property [`AvailabilityZone`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-availabilityzone). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub availability_zone: Option<::Value>, + /// Property [`GroupName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-groupname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub group_name: Option<::Value>, + /// Property [`HostId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-hostid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub host_id: Option<::Value>, + /// Property [`HostResourceGroupArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-hostresourcegrouparn). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub host_resource_group_arn: Option<::Value>, + /// Property [`PartitionNumber`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-partitionnumber). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub partition_number: Option<::Value>, + /// Property [`SpreadDomain`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-spreaddomain). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub spread_domain: Option<::Value>, + /// Property [`Tenancy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-tenancy). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub tenancy: Option<::Value>, + } + + impl ::codec::SerializeValue for Placement { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref affinity) = self.affinity { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Affinity", affinity)?; + } + if let Some(ref availability_zone) = self.availability_zone { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AvailabilityZone", availability_zone)?; + } + if let Some(ref group_name) = self.group_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupName", group_name)?; + } + if let Some(ref host_id) = self.host_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HostId", host_id)?; + } + if let Some(ref host_resource_group_arn) = self.host_resource_group_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HostResourceGroupArn", host_resource_group_arn)?; + } + if let Some(ref partition_number) = self.partition_number { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PartitionNumber", partition_number)?; + } + if let Some(ref spread_domain) = self.spread_domain { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpreadDomain", spread_domain)?; + } + if let Some(ref tenancy) = self.tenancy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tenancy", tenancy)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Placement { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Placement; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Placement") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut affinity: Option<::Value> = None; + let mut availability_zone: Option<::Value> = None; + let mut group_name: Option<::Value> = None; + let mut host_id: Option<::Value> = None; + let mut host_resource_group_arn: Option<::Value> = None; + let mut partition_number: Option<::Value> = None; + let mut spread_domain: Option<::Value> = None; + let mut tenancy: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Affinity" => { + affinity = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AvailabilityZone" => { + availability_zone = ::serde::de::MapAccess::next_value(&mut map)?; + } + "GroupName" => { + group_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HostId" => { + host_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HostResourceGroupArn" => { + host_resource_group_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PartitionNumber" => { + partition_number = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SpreadDomain" => { + spread_domain = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tenancy" => { + tenancy = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Placement { + affinity: affinity, + availability_zone: availability_zone, + group_name: group_name, + host_id: host_id, + host_resource_group_arn: host_resource_group_arn, + partition_number: partition_number, + spread_domain: spread_domain, + tenancy: tenancy, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::EC2Fleet.SpotOptionsRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html) property type. + #[derive(Debug, Default)] + pub struct SpotOptionsRequest { + /// Property [`AllocationStrategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html#cfn-ec2-ec2fleet-spotoptionsrequest-allocationstrategy). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub allocation_strategy: Option<::Value>, + /// Property [`InstanceInterruptionBehavior`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html#cfn-ec2-ec2fleet-spotoptionsrequest-instanceinterruptionbehavior). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub instance_interruption_behavior: Option<::Value>, + /// Property [`InstancePoolsToUseCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html#cfn-ec2-ec2fleet-spotoptionsrequest-instancepoolstousecount). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub instance_pools_to_use_count: Option<::Value>, + /// Property [`MaintenanceStrategies`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html#cfn-ec2-ec2fleet-spotoptionsrequest-maintenancestrategies). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub maintenance_strategies: Option<::Value>, + /// Property [`MaxTotalPrice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html#cfn-ec2-ec2fleet-spotoptionsrequest-maxtotalprice). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub max_total_price: Option<::Value>, + /// Property [`MinTargetCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html#cfn-ec2-ec2fleet-spotoptionsrequest-mintargetcapacity). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub min_target_capacity: Option<::Value>, + /// Property [`SingleAvailabilityZone`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html#cfn-ec2-ec2fleet-spotoptionsrequest-singleavailabilityzone). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub single_availability_zone: Option<::Value>, + /// Property [`SingleInstanceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html#cfn-ec2-ec2fleet-spotoptionsrequest-singleinstancetype). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub single_instance_type: Option<::Value>, + } + + impl ::codec::SerializeValue for SpotOptionsRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref allocation_strategy) = self.allocation_strategy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AllocationStrategy", allocation_strategy)?; + } + if let Some(ref instance_interruption_behavior) = self.instance_interruption_behavior { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceInterruptionBehavior", instance_interruption_behavior)?; + } + if let Some(ref instance_pools_to_use_count) = self.instance_pools_to_use_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstancePoolsToUseCount", instance_pools_to_use_count)?; + } + if let Some(ref maintenance_strategies) = self.maintenance_strategies { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaintenanceStrategies", maintenance_strategies)?; + } + if let Some(ref max_total_price) = self.max_total_price { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxTotalPrice", max_total_price)?; + } + if let Some(ref min_target_capacity) = self.min_target_capacity { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MinTargetCapacity", min_target_capacity)?; + } + if let Some(ref single_availability_zone) = self.single_availability_zone { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SingleAvailabilityZone", single_availability_zone)?; + } + if let Some(ref single_instance_type) = self.single_instance_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SingleInstanceType", single_instance_type)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for SpotOptionsRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = SpotOptionsRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type SpotOptionsRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut allocation_strategy: Option<::Value> = None; + let mut instance_interruption_behavior: Option<::Value> = None; + let mut instance_pools_to_use_count: Option<::Value> = None; + let mut maintenance_strategies: Option<::Value> = None; + let mut max_total_price: Option<::Value> = None; + let mut min_target_capacity: Option<::Value> = None; + let mut single_availability_zone: Option<::Value> = None; + let mut single_instance_type: Option<::Value> = None; -impl ::Resource for VolumeAttachment { - type Properties = VolumeAttachmentProperties; - const TYPE: &'static str = "AWS::EC2::VolumeAttachment"; - fn properties(&self) -> &VolumeAttachmentProperties { - &self.properties - } - fn properties_mut(&mut self) -> &mut VolumeAttachmentProperties { - &mut self.properties - } -} + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AllocationStrategy" => { + allocation_strategy = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceInterruptionBehavior" => { + instance_interruption_behavior = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstancePoolsToUseCount" => { + instance_pools_to_use_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MaintenanceStrategies" => { + maintenance_strategies = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MaxTotalPrice" => { + max_total_price = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MinTargetCapacity" => { + min_target_capacity = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SingleAvailabilityZone" => { + single_availability_zone = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SingleInstanceType" => { + single_instance_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } -impl ::private::Sealed for VolumeAttachment {} + Ok(SpotOptionsRequest { + allocation_strategy: allocation_strategy, + instance_interruption_behavior: instance_interruption_behavior, + instance_pools_to_use_count: instance_pools_to_use_count, + maintenance_strategies: maintenance_strategies, + max_total_price: max_total_price, + min_target_capacity: min_target_capacity, + single_availability_zone: single_availability_zone, + single_instance_type: single_instance_type, + }) + } + } -impl From for VolumeAttachment { - fn from(properties: VolumeAttachmentProperties) -> VolumeAttachment { - VolumeAttachment { properties } + d.deserialize_map(Visitor) + } } -} - -pub mod capacity_reservation { - //! Property types for the `CapacityReservation` resource. - /// The [`AWS::EC2::CapacityReservation.TagSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservation-tagspecification.html) property type. + /// The [`AWS::EC2::EC2Fleet.TagSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-tagspecification.html) property type. #[derive(Debug, Default)] pub struct TagSpecification { - /// Property [`ResourceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservation-tagspecification.html#cfn-ec2-capacityreservation-tagspecification-resourcetype). + /// Property [`ResourceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-tagspecification.html#cfn-ec2-ec2fleet-tagspecification-resourcetype). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. pub resource_type: Option<::Value>, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-capacityreservation-tagspecification.html#cfn-ec2-capacityreservation-tagspecification-tags). + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-tagspecification.html#cfn-ec2-ec2fleet-tagspecification-tags). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. pub tags: Option<::ValueList<::Tag>>, } @@ -9383,54 +13147,234 @@ pub mod capacity_reservation { d.deserialize_map(Visitor) } } -} - -pub mod client_vpn_endpoint { - //! Property types for the `ClientVpnEndpoint` resource. - /// The [`AWS::EC2::ClientVpnEndpoint.CertificateAuthenticationRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-certificateauthenticationrequest.html) property type. + /// The [`AWS::EC2::EC2Fleet.TargetCapacitySpecificationRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-targetcapacityspecificationrequest.html) property type. #[derive(Debug, Default)] - pub struct CertificateAuthenticationRequest { - /// Property [`ClientRootCertificateChainArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-certificateauthenticationrequest.html#cfn-ec2-clientvpnendpoint-certificateauthenticationrequest-clientrootcertificatechainarn). + pub struct TargetCapacitySpecificationRequest { + /// Property [`DefaultTargetCapacityType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-targetcapacityspecificationrequest.html#cfn-ec2-ec2fleet-targetcapacityspecificationrequest-defaulttargetcapacitytype). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub client_root_certificate_chain_arn: ::Value, + pub default_target_capacity_type: Option<::Value>, + /// Property [`OnDemandTargetCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-targetcapacityspecificationrequest.html#cfn-ec2-ec2fleet-targetcapacityspecificationrequest-ondemandtargetcapacity). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub on_demand_target_capacity: Option<::Value>, + /// Property [`SpotTargetCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-targetcapacityspecificationrequest.html#cfn-ec2-ec2fleet-targetcapacityspecificationrequest-spottargetcapacity). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub spot_target_capacity: Option<::Value>, + /// Property [`TargetCapacityUnitType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-targetcapacityspecificationrequest.html#cfn-ec2-ec2fleet-targetcapacityspecificationrequest-targetcapacityunittype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub target_capacity_unit_type: Option<::Value>, + /// Property [`TotalTargetCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-targetcapacityspecificationrequest.html#cfn-ec2-ec2fleet-targetcapacityspecificationrequest-totaltargetcapacity). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub total_target_capacity: ::Value, } - impl ::codec::SerializeValue for CertificateAuthenticationRequest { + impl ::codec::SerializeValue for TargetCapacitySpecificationRequest { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ClientRootCertificateChainArn", &self.client_root_certificate_chain_arn)?; + if let Some(ref default_target_capacity_type) = self.default_target_capacity_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DefaultTargetCapacityType", default_target_capacity_type)?; + } + if let Some(ref on_demand_target_capacity) = self.on_demand_target_capacity { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OnDemandTargetCapacity", on_demand_target_capacity)?; + } + if let Some(ref spot_target_capacity) = self.spot_target_capacity { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpotTargetCapacity", spot_target_capacity)?; + } + if let Some(ref target_capacity_unit_type) = self.target_capacity_unit_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetCapacityUnitType", target_capacity_unit_type)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TotalTargetCapacity", &self.total_target_capacity)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for CertificateAuthenticationRequest { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for TargetCapacitySpecificationRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = CertificateAuthenticationRequest; + type Value = TargetCapacitySpecificationRequest; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type CertificateAuthenticationRequest") + write!(f, "a struct of type TargetCapacitySpecificationRequest") } fn visit_map>(self, mut map: A) -> Result { - let mut client_root_certificate_chain_arn: Option<::Value> = None; + let mut default_target_capacity_type: Option<::Value> = None; + let mut on_demand_target_capacity: Option<::Value> = None; + let mut spot_target_capacity: Option<::Value> = None; + let mut target_capacity_unit_type: Option<::Value> = None; + let mut total_target_capacity: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "ClientRootCertificateChainArn" => { - client_root_certificate_chain_arn = ::serde::de::MapAccess::next_value(&mut map)?; + "DefaultTargetCapacityType" => { + default_target_capacity_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OnDemandTargetCapacity" => { + on_demand_target_capacity = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SpotTargetCapacity" => { + spot_target_capacity = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TargetCapacityUnitType" => { + target_capacity_unit_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TotalTargetCapacity" => { + total_target_capacity = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(CertificateAuthenticationRequest { - client_root_certificate_chain_arn: client_root_certificate_chain_arn.ok_or(::serde::de::Error::missing_field("ClientRootCertificateChainArn"))?, + Ok(TargetCapacitySpecificationRequest { + default_target_capacity_type: default_target_capacity_type, + on_demand_target_capacity: on_demand_target_capacity, + spot_target_capacity: spot_target_capacity, + target_capacity_unit_type: target_capacity_unit_type, + total_target_capacity: total_target_capacity.ok_or(::serde::de::Error::missing_field("TotalTargetCapacity"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::EC2Fleet.TotalLocalStorageGBRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-totallocalstoragegbrequest.html) property type. + #[derive(Debug, Default)] + pub struct TotalLocalStorageGBRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-totallocalstoragegbrequest.html#cfn-ec2-ec2fleet-totallocalstoragegbrequest-max). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-totallocalstoragegbrequest.html#cfn-ec2-ec2fleet-totallocalstoragegbrequest-min). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub min: Option<::Value>, + } + + impl ::codec::SerializeValue for TotalLocalStorageGBRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for TotalLocalStorageGBRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = TotalLocalStorageGBRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type TotalLocalStorageGBRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(TotalLocalStorageGBRequest { + max: max, + min: min, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::EC2Fleet.VCpuCountRangeRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-vcpucountrangerequest.html) property type. + #[derive(Debug, Default)] + pub struct VCpuCountRangeRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-vcpucountrangerequest.html#cfn-ec2-ec2fleet-vcpucountrangerequest-max). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-vcpucountrangerequest.html#cfn-ec2-ec2fleet-vcpucountrangerequest-min). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub min: Option<::Value>, + } + + impl ::codec::SerializeValue for VCpuCountRangeRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for VCpuCountRangeRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = VCpuCountRangeRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type VCpuCountRangeRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(VCpuCountRangeRequest { + max: max, + min: min, }) } } @@ -9438,89 +13382,54 @@ pub mod client_vpn_endpoint { d.deserialize_map(Visitor) } } +} + +pub mod ipam { + //! Property types for the `IPAM` resource. - /// The [`AWS::EC2::ClientVpnEndpoint.ClientAuthenticationRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientauthenticationrequest.html) property type. + /// The [`AWS::EC2::IPAM.IpamOperatingRegion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ipam-ipamoperatingregion.html) property type. #[derive(Debug, Default)] - pub struct ClientAuthenticationRequest { - /// Property [`ActiveDirectory`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientauthenticationrequest.html#cfn-ec2-clientvpnendpoint-clientauthenticationrequest-activedirectory). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub active_directory: Option<::Value>, - /// Property [`FederatedAuthentication`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientauthenticationrequest.html#cfn-ec2-clientvpnendpoint-clientauthenticationrequest-federatedauthentication). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub federated_authentication: Option<::Value>, - /// Property [`MutualAuthentication`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientauthenticationrequest.html#cfn-ec2-clientvpnendpoint-clientauthenticationrequest-mutualauthentication). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub mutual_authentication: Option<::Value>, - /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientauthenticationrequest.html#cfn-ec2-clientvpnendpoint-clientauthenticationrequest-type). + pub struct IpamOperatingRegion { + /// Property [`RegionName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ipam-ipamoperatingregion.html#cfn-ec2-ipam-ipamoperatingregion-regionname). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub r#type: ::Value, + pub region_name: ::Value, } - impl ::codec::SerializeValue for ClientAuthenticationRequest { + impl ::codec::SerializeValue for IpamOperatingRegion { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref active_directory) = self.active_directory { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ActiveDirectory", active_directory)?; - } - if let Some(ref federated_authentication) = self.federated_authentication { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "FederatedAuthentication", federated_authentication)?; - } - if let Some(ref mutual_authentication) = self.mutual_authentication { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "MutualAuthentication", mutual_authentication)?; - } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RegionName", &self.region_name)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for ClientAuthenticationRequest { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for IpamOperatingRegion { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = ClientAuthenticationRequest; + type Value = IpamOperatingRegion; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type ClientAuthenticationRequest") + write!(f, "a struct of type IpamOperatingRegion") } fn visit_map>(self, mut map: A) -> Result { - let mut active_directory: Option<::Value> = None; - let mut federated_authentication: Option<::Value> = None; - let mut mutual_authentication: Option<::Value> = None; - let mut r#type: Option<::Value> = None; + let mut region_name: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "ActiveDirectory" => { - active_directory = ::serde::de::MapAccess::next_value(&mut map)?; - } - "FederatedAuthentication" => { - federated_authentication = ::serde::de::MapAccess::next_value(&mut map)?; - } - "MutualAuthentication" => { - mutual_authentication = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Type" => { - r#type = ::serde::de::MapAccess::next_value(&mut map)?; + "RegionName" => { + region_name = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(ClientAuthenticationRequest { - active_directory: active_directory, - federated_authentication: federated_authentication, - mutual_authentication: mutual_authentication, - r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?, + Ok(IpamOperatingRegion { + region_name: region_name.ok_or(::serde::de::Error::missing_field("RegionName"))?, }) } } @@ -9528,63 +13437,54 @@ pub mod client_vpn_endpoint { d.deserialize_map(Visitor) } } +} - /// The [`AWS::EC2::ClientVpnEndpoint.ClientConnectOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientconnectoptions.html) property type. +pub mod ipam_pool { + //! Property types for the `IPAMPool` resource. + + /// The [`AWS::EC2::IPAMPool.ProvisionedCidr`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ipampool-provisionedcidr.html) property type. #[derive(Debug, Default)] - pub struct ClientConnectOptions { - /// Property [`Enabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientconnectoptions.html#cfn-ec2-clientvpnendpoint-clientconnectoptions-enabled). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub enabled: ::Value, - /// Property [`LambdaFunctionArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-clientconnectoptions.html#cfn-ec2-clientvpnendpoint-clientconnectoptions-lambdafunctionarn). + pub struct ProvisionedCidr { + /// Property [`Cidr`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ipampool-provisionedcidr.html#cfn-ec2-ipampool-provisionedcidr-cidr). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub lambda_function_arn: Option<::Value>, + pub cidr: ::Value, } - impl ::codec::SerializeValue for ClientConnectOptions { + impl ::codec::SerializeValue for ProvisionedCidr { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Enabled", &self.enabled)?; - if let Some(ref lambda_function_arn) = self.lambda_function_arn { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LambdaFunctionArn", lambda_function_arn)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Cidr", &self.cidr)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for ClientConnectOptions { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for ProvisionedCidr { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = ClientConnectOptions; + type Value = ProvisionedCidr; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type ClientConnectOptions") + write!(f, "a struct of type ProvisionedCidr") } fn visit_map>(self, mut map: A) -> Result { - let mut enabled: Option<::Value> = None; - let mut lambda_function_arn: Option<::Value> = None; + let mut cidr: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Enabled" => { - enabled = ::serde::de::MapAccess::next_value(&mut map)?; - } - "LambdaFunctionArn" => { - lambda_function_arn = ::serde::de::MapAccess::next_value(&mut map)?; + "Cidr" => { + cidr = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(ClientConnectOptions { - enabled: enabled.ok_or(::serde::de::Error::missing_field("Enabled"))?, - lambda_function_arn: lambda_function_arn, + Ok(ProvisionedCidr { + cidr: cidr.ok_or(::serde::de::Error::missing_field("Cidr"))?, }) } } @@ -9592,76 +13492,65 @@ pub mod client_vpn_endpoint { d.deserialize_map(Visitor) } } +} - /// The [`AWS::EC2::ClientVpnEndpoint.ConnectionLogOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-connectionlogoptions.html) property type. +pub mod instance { + //! Property types for the `Instance` resource. + + /// The [`AWS::EC2::Instance.AssociationParameter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-ssmassociations-associationparameters.html) property type. #[derive(Debug, Default)] - pub struct ConnectionLogOptions { - /// Property [`CloudwatchLogGroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-connectionlogoptions.html#cfn-ec2-clientvpnendpoint-connectionlogoptions-cloudwatchloggroup). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub cloudwatch_log_group: Option<::Value>, - /// Property [`CloudwatchLogStream`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-connectionlogoptions.html#cfn-ec2-clientvpnendpoint-connectionlogoptions-cloudwatchlogstream). + pub struct AssociationParameter { + /// Property [`Key`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-ssmassociations-associationparameters.html#cfn-ec2-instance-ssmassociations-associationparameters-key). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub cloudwatch_log_stream: Option<::Value>, - /// Property [`Enabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-connectionlogoptions.html#cfn-ec2-clientvpnendpoint-connectionlogoptions-enabled). + pub key: ::Value, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-ssmassociations-associationparameters.html#cfn-ec2-instance-ssmassociations-associationparameters-value). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub enabled: ::Value, + pub value: ::ValueList, } - impl ::codec::SerializeValue for ConnectionLogOptions { + impl ::codec::SerializeValue for AssociationParameter { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref cloudwatch_log_group) = self.cloudwatch_log_group { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CloudwatchLogGroup", cloudwatch_log_group)?; - } - if let Some(ref cloudwatch_log_stream) = self.cloudwatch_log_stream { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CloudwatchLogStream", cloudwatch_log_stream)?; - } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Enabled", &self.enabled)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Key", &self.key)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", &self.value)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for ConnectionLogOptions { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for AssociationParameter { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = ConnectionLogOptions; + type Value = AssociationParameter; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type ConnectionLogOptions") + write!(f, "a struct of type AssociationParameter") } fn visit_map>(self, mut map: A) -> Result { - let mut cloudwatch_log_group: Option<::Value> = None; - let mut cloudwatch_log_stream: Option<::Value> = None; - let mut enabled: Option<::Value> = None; + let mut key: Option<::Value> = None; + let mut value: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "CloudwatchLogGroup" => { - cloudwatch_log_group = ::serde::de::MapAccess::next_value(&mut map)?; - } - "CloudwatchLogStream" => { - cloudwatch_log_stream = ::serde::de::MapAccess::next_value(&mut map)?; + "Key" => { + key = ::serde::de::MapAccess::next_value(&mut map)?; } - "Enabled" => { - enabled = ::serde::de::MapAccess::next_value(&mut map)?; + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(ConnectionLogOptions { - cloudwatch_log_group: cloudwatch_log_group, - cloudwatch_log_stream: cloudwatch_log_stream, - enabled: enabled.ok_or(::serde::de::Error::missing_field("Enabled"))?, + Ok(AssociationParameter { + key: key.ok_or(::serde::de::Error::missing_field("Key"))?, + value: value.ok_or(::serde::de::Error::missing_field("Value"))?, }) } } @@ -9670,49 +13559,88 @@ pub mod client_vpn_endpoint { } } - /// The [`AWS::EC2::ClientVpnEndpoint.DirectoryServiceAuthenticationRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-directoryserviceauthenticationrequest.html) property type. + /// The [`AWS::EC2::Instance.BlockDeviceMapping`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-mapping.html) property type. #[derive(Debug, Default)] - pub struct DirectoryServiceAuthenticationRequest { - /// Property [`DirectoryId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-directoryserviceauthenticationrequest.html#cfn-ec2-clientvpnendpoint-directoryserviceauthenticationrequest-directoryid). + pub struct BlockDeviceMapping { + /// Property [`DeviceName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-mapping.html#cfn-ec2-blockdev-mapping-devicename). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub directory_id: ::Value, + pub device_name: ::Value, + /// Property [`Ebs`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-mapping.html#cfn-ec2-blockdev-mapping-ebs). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ebs: Option<::Value>, + /// Property [`NoDevice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-mapping.html#cfn-ec2-blockdev-mapping-nodevice). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub no_device: Option<::Value>, + /// Property [`VirtualName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-mapping.html#cfn-ec2-blockdev-mapping-virtualname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub virtual_name: Option<::Value>, } - impl ::codec::SerializeValue for DirectoryServiceAuthenticationRequest { + impl ::codec::SerializeValue for BlockDeviceMapping { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DirectoryId", &self.directory_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeviceName", &self.device_name)?; + if let Some(ref ebs) = self.ebs { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ebs", ebs)?; + } + if let Some(ref no_device) = self.no_device { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NoDevice", no_device)?; + } + if let Some(ref virtual_name) = self.virtual_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VirtualName", virtual_name)?; + } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for DirectoryServiceAuthenticationRequest { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for BlockDeviceMapping { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = DirectoryServiceAuthenticationRequest; + type Value = BlockDeviceMapping; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type DirectoryServiceAuthenticationRequest") + write!(f, "a struct of type BlockDeviceMapping") } fn visit_map>(self, mut map: A) -> Result { - let mut directory_id: Option<::Value> = None; + let mut device_name: Option<::Value> = None; + let mut ebs: Option<::Value> = None; + let mut no_device: Option<::Value> = None; + let mut virtual_name: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "DirectoryId" => { - directory_id = ::serde::de::MapAccess::next_value(&mut map)?; + "DeviceName" => { + device_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Ebs" => { + ebs = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NoDevice" => { + no_device = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VirtualName" => { + virtual_name = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(DirectoryServiceAuthenticationRequest { - directory_id: directory_id.ok_or(::serde::de::Error::missing_field("DirectoryId"))?, + Ok(BlockDeviceMapping { + device_name: device_name.ok_or(::serde::de::Error::missing_field("DeviceName"))?, + ebs: ebs, + no_device: no_device, + virtual_name: virtual_name, }) } } @@ -9721,62 +13649,64 @@ pub mod client_vpn_endpoint { } } - /// The [`AWS::EC2::ClientVpnEndpoint.FederatedAuthenticationRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-federatedauthenticationrequest.html) property type. + /// The [`AWS::EC2::Instance.CpuOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-cpuoptions.html) property type. #[derive(Debug, Default)] - pub struct FederatedAuthenticationRequest { - /// Property [`SAMLProviderArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-federatedauthenticationrequest.html#cfn-ec2-clientvpnendpoint-federatedauthenticationrequest-samlproviderarn). + pub struct CpuOptions { + /// Property [`CoreCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-cpuoptions.html#cfn-ec2-instance-cpuoptions-corecount). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub saml_provider_arn: ::Value, - /// Property [`SelfServiceSAMLProviderArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-federatedauthenticationrequest.html#cfn-ec2-clientvpnendpoint-federatedauthenticationrequest-selfservicesamlproviderarn). + pub core_count: Option<::Value>, + /// Property [`ThreadsPerCore`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-cpuoptions.html#cfn-ec2-instance-cpuoptions-threadspercore). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub self_service_saml_provider_arn: Option<::Value>, + pub threads_per_core: Option<::Value>, } - impl ::codec::SerializeValue for FederatedAuthenticationRequest { + impl ::codec::SerializeValue for CpuOptions { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SAMLProviderArn", &self.saml_provider_arn)?; - if let Some(ref self_service_saml_provider_arn) = self.self_service_saml_provider_arn { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SelfServiceSAMLProviderArn", self_service_saml_provider_arn)?; + if let Some(ref core_count) = self.core_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CoreCount", core_count)?; + } + if let Some(ref threads_per_core) = self.threads_per_core { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ThreadsPerCore", threads_per_core)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for FederatedAuthenticationRequest { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for CpuOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = FederatedAuthenticationRequest; + type Value = CpuOptions; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type FederatedAuthenticationRequest") + write!(f, "a struct of type CpuOptions") } fn visit_map>(self, mut map: A) -> Result { - let mut saml_provider_arn: Option<::Value> = None; - let mut self_service_saml_provider_arn: Option<::Value> = None; + let mut core_count: Option<::Value> = None; + let mut threads_per_core: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "SAMLProviderArn" => { - saml_provider_arn = ::serde::de::MapAccess::next_value(&mut map)?; + "CoreCount" => { + core_count = ::serde::de::MapAccess::next_value(&mut map)?; } - "SelfServiceSAMLProviderArn" => { - self_service_saml_provider_arn = ::serde::de::MapAccess::next_value(&mut map)?; + "ThreadsPerCore" => { + threads_per_core = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(FederatedAuthenticationRequest { - saml_provider_arn: saml_provider_arn.ok_or(::serde::de::Error::missing_field("SAMLProviderArn"))?, - self_service_saml_provider_arn: self_service_saml_provider_arn, + Ok(CpuOptions { + core_count: core_count, + threads_per_core: threads_per_core, }) } } @@ -9785,60 +13715,51 @@ pub mod client_vpn_endpoint { } } - /// The [`AWS::EC2::ClientVpnEndpoint.TagSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-tagspecification.html) property type. + /// The [`AWS::EC2::Instance.CreditSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-creditspecification.html) property type. #[derive(Debug, Default)] - pub struct TagSpecification { - /// Property [`ResourceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-tagspecification.html#cfn-ec2-clientvpnendpoint-tagspecification-resourcetype). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub resource_type: ::Value, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-clientvpnendpoint-tagspecification.html#cfn-ec2-clientvpnendpoint-tagspecification-tags). + pub struct CreditSpecification { + /// Property [`CPUCredits`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-creditspecification.html#cfn-ec2-instance-creditspecification-cpucredits). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub tags: ::ValueList<::Tag>, + pub cpu_credits: Option<::Value>, } - impl ::codec::SerializeValue for TagSpecification { + impl ::codec::SerializeValue for CreditSpecification { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceType", &self.resource_type)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", &self.tags)?; + if let Some(ref cpu_credits) = self.cpu_credits { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CPUCredits", cpu_credits)?; + } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for TagSpecification { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for CreditSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = TagSpecification; + type Value = CreditSpecification; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type TagSpecification") + write!(f, "a struct of type CreditSpecification") } fn visit_map>(self, mut map: A) -> Result { - let mut resource_type: Option<::Value> = None; - let mut tags: Option<::ValueList<::Tag>> = None; + let mut cpu_credits: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "ResourceType" => { - resource_type = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Tags" => { - tags = ::serde::de::MapAccess::next_value(&mut map)?; + "CPUCredits" => { + cpu_credits = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(TagSpecification { - resource_type: resource_type.ok_or(::serde::de::Error::missing_field("ResourceType"))?, - tags: tags.ok_or(::serde::de::Error::missing_field("Tags"))?, + Ok(CreditSpecification { + cpu_credits: cpu_credits, }) } } @@ -9846,56 +13767,130 @@ pub mod client_vpn_endpoint { d.deserialize_map(Visitor) } } -} - -pub mod ec2_fleet { - //! Property types for the `EC2Fleet` resource. - /// The [`AWS::EC2::EC2Fleet.CapacityReservationOptionsRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-capacityreservationoptionsrequest.html) property type. + /// The [`AWS::EC2::Instance.Ebs`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html) property type. #[derive(Debug, Default)] - pub struct CapacityReservationOptionsRequest { - /// Property [`UsageStrategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-capacityreservationoptionsrequest.html#cfn-ec2-ec2fleet-capacityreservationoptionsrequest-usagestrategy). + pub struct Ebs { + /// Property [`DeleteOnTermination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html#cfn-ec2-blockdev-template-deleteontermination). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub delete_on_termination: Option<::Value>, + /// Property [`Encrypted`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html#cfn-ec2-blockdev-template-encrypted). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub encrypted: Option<::Value>, + /// Property [`Iops`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html#cfn-ec2-blockdev-template-iops). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub iops: Option<::Value>, + /// Property [`KmsKeyId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html#cfn-ec2-instance-ebs-kmskeyid). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub usage_strategy: Option<::Value>, + pub kms_key_id: Option<::Value>, + /// Property [`SnapshotId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html#cfn-ec2-blockdev-template-snapshotid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub snapshot_id: Option<::Value>, + /// Property [`VolumeSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html#cfn-ec2-blockdev-template-volumesize). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub volume_size: Option<::Value>, + /// Property [`VolumeType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html#cfn-ec2-blockdev-template-volumetype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub volume_type: Option<::Value>, } - impl ::codec::SerializeValue for CapacityReservationOptionsRequest { + impl ::codec::SerializeValue for Ebs { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref usage_strategy) = self.usage_strategy { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "UsageStrategy", usage_strategy)?; + if let Some(ref delete_on_termination) = self.delete_on_termination { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeleteOnTermination", delete_on_termination)?; + } + if let Some(ref encrypted) = self.encrypted { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Encrypted", encrypted)?; + } + if let Some(ref iops) = self.iops { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Iops", iops)?; + } + if let Some(ref kms_key_id) = self.kms_key_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "KmsKeyId", kms_key_id)?; + } + if let Some(ref snapshot_id) = self.snapshot_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SnapshotId", snapshot_id)?; + } + if let Some(ref volume_size) = self.volume_size { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VolumeSize", volume_size)?; + } + if let Some(ref volume_type) = self.volume_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VolumeType", volume_type)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for CapacityReservationOptionsRequest { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for Ebs { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = CapacityReservationOptionsRequest; + type Value = Ebs; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type CapacityReservationOptionsRequest") + write!(f, "a struct of type Ebs") } fn visit_map>(self, mut map: A) -> Result { - let mut usage_strategy: Option<::Value> = None; + let mut delete_on_termination: Option<::Value> = None; + let mut encrypted: Option<::Value> = None; + let mut iops: Option<::Value> = None; + let mut kms_key_id: Option<::Value> = None; + let mut snapshot_id: Option<::Value> = None; + let mut volume_size: Option<::Value> = None; + let mut volume_type: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "UsageStrategy" => { - usage_strategy = ::serde::de::MapAccess::next_value(&mut map)?; + "DeleteOnTermination" => { + delete_on_termination = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Encrypted" => { + encrypted = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Iops" => { + iops = ::serde::de::MapAccess::next_value(&mut map)?; + } + "KmsKeyId" => { + kms_key_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SnapshotId" => { + snapshot_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VolumeSize" => { + volume_size = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VolumeType" => { + volume_type = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(CapacityReservationOptionsRequest { - usage_strategy: usage_strategy, + Ok(Ebs { + delete_on_termination: delete_on_termination, + encrypted: encrypted, + iops: iops, + kms_key_id: kms_key_id, + snapshot_id: snapshot_id, + volume_size: volume_size, + volume_type: volume_type, }) } } @@ -9904,195 +13899,113 @@ pub mod ec2_fleet { } } - /// The [`AWS::EC2::EC2Fleet.FleetLaunchTemplateConfigRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateconfigrequest.html) property type. + /// The [`AWS::EC2::Instance.ElasticGpuSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-elasticgpuspecification.html) property type. #[derive(Debug, Default)] - pub struct FleetLaunchTemplateConfigRequest { - /// Property [`LaunchTemplateSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateconfigrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateconfigrequest-launchtemplatespecification). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub launch_template_specification: Option<::Value>, - /// Property [`Overrides`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateconfigrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateconfigrequest-overrides). + pub struct ElasticGpuSpecification { + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-elasticgpuspecification.html#cfn-ec2-instance-elasticgpuspecification-type). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub overrides: Option<::ValueList>, + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#type: ::Value, } - impl ::codec::SerializeValue for FleetLaunchTemplateConfigRequest { + impl ::codec::SerializeValue for ElasticGpuSpecification { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref launch_template_specification) = self.launch_template_specification { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplateSpecification", launch_template_specification)?; - } - if let Some(ref overrides) = self.overrides { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Overrides", overrides)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for FleetLaunchTemplateConfigRequest { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for ElasticGpuSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = FleetLaunchTemplateConfigRequest; + type Value = ElasticGpuSpecification; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type FleetLaunchTemplateConfigRequest") + write!(f, "a struct of type ElasticGpuSpecification") } fn visit_map>(self, mut map: A) -> Result { - let mut launch_template_specification: Option<::Value> = None; - let mut overrides: Option<::ValueList> = None; + let mut r#type: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "LaunchTemplateSpecification" => { - launch_template_specification = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Overrides" => { - overrides = ::serde::de::MapAccess::next_value(&mut map)?; + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(FleetLaunchTemplateConfigRequest { - launch_template_specification: launch_template_specification, - overrides: overrides, + Ok(ElasticGpuSpecification { + r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?, }) - } - } - - d.deserialize_map(Visitor) - } - } - - /// The [`AWS::EC2::EC2Fleet.FleetLaunchTemplateOverridesRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html) property type. - #[derive(Debug, Default)] - pub struct FleetLaunchTemplateOverridesRequest { - /// Property [`AvailabilityZone`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest-availabilityzone). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub availability_zone: Option<::Value>, - /// Property [`InstanceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest-instancetype). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub instance_type: Option<::Value>, - /// Property [`MaxPrice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest-maxprice). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub max_price: Option<::Value>, - /// Property [`Placement`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest-placement). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub placement: Option<::Value>, - /// Property [`Priority`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest-priority). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub priority: Option<::Value>, - /// Property [`SubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest-subnetid). + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::Instance.ElasticInferenceAccelerator`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-elasticinferenceaccelerator.html) property type. + #[derive(Debug, Default)] + pub struct ElasticInferenceAccelerator { + /// Property [`Count`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-elasticinferenceaccelerator.html#cfn-ec2-instance-elasticinferenceaccelerator-count). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub subnet_id: Option<::Value>, - /// Property [`WeightedCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplateoverridesrequest-weightedcapacity). + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub count: Option<::Value>, + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-elasticinferenceaccelerator.html#cfn-ec2-instance-elasticinferenceaccelerator-type). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub weighted_capacity: Option<::Value>, + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#type: ::Value, } - impl ::codec::SerializeValue for FleetLaunchTemplateOverridesRequest { + impl ::codec::SerializeValue for ElasticInferenceAccelerator { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref availability_zone) = self.availability_zone { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AvailabilityZone", availability_zone)?; - } - if let Some(ref instance_type) = self.instance_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceType", instance_type)?; - } - if let Some(ref max_price) = self.max_price { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxPrice", max_price)?; - } - if let Some(ref placement) = self.placement { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Placement", placement)?; - } - if let Some(ref priority) = self.priority { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Priority", priority)?; - } - if let Some(ref subnet_id) = self.subnet_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetId", subnet_id)?; - } - if let Some(ref weighted_capacity) = self.weighted_capacity { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "WeightedCapacity", weighted_capacity)?; + if let Some(ref count) = self.count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Count", count)?; } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for FleetLaunchTemplateOverridesRequest { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for ElasticInferenceAccelerator { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = FleetLaunchTemplateOverridesRequest; + type Value = ElasticInferenceAccelerator; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type FleetLaunchTemplateOverridesRequest") + write!(f, "a struct of type ElasticInferenceAccelerator") } fn visit_map>(self, mut map: A) -> Result { - let mut availability_zone: Option<::Value> = None; - let mut instance_type: Option<::Value> = None; - let mut max_price: Option<::Value> = None; - let mut placement: Option<::Value> = None; - let mut priority: Option<::Value> = None; - let mut subnet_id: Option<::Value> = None; - let mut weighted_capacity: Option<::Value> = None; + let mut count: Option<::Value> = None; + let mut r#type: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "AvailabilityZone" => { - availability_zone = ::serde::de::MapAccess::next_value(&mut map)?; - } - "InstanceType" => { - instance_type = ::serde::de::MapAccess::next_value(&mut map)?; - } - "MaxPrice" => { - max_price = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Placement" => { - placement = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Priority" => { - priority = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SubnetId" => { - subnet_id = ::serde::de::MapAccess::next_value(&mut map)?; + "Count" => { + count = ::serde::de::MapAccess::next_value(&mut map)?; } - "WeightedCapacity" => { - weighted_capacity = ::serde::de::MapAccess::next_value(&mut map)?; + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(FleetLaunchTemplateOverridesRequest { - availability_zone: availability_zone, - instance_type: instance_type, - max_price: max_price, - placement: placement, - priority: priority, - subnet_id: subnet_id, - weighted_capacity: weighted_capacity, + Ok(ElasticInferenceAccelerator { + count: count, + r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?, }) } } @@ -10101,77 +14014,51 @@ pub mod ec2_fleet { } } - /// The [`AWS::EC2::EC2Fleet.FleetLaunchTemplateSpecificationRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplatespecificationrequest.html) property type. + /// The [`AWS::EC2::Instance.EnclaveOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-enclaveoptions.html) property type. #[derive(Debug, Default)] - pub struct FleetLaunchTemplateSpecificationRequest { - /// Property [`LaunchTemplateId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplatespecificationrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplatespecificationrequest-launchtemplateid). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub launch_template_id: Option<::Value>, - /// Property [`LaunchTemplateName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplatespecificationrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplatespecificationrequest-launchtemplatename). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub launch_template_name: Option<::Value>, - /// Property [`Version`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-fleetlaunchtemplatespecificationrequest.html#cfn-ec2-ec2fleet-fleetlaunchtemplatespecificationrequest-version). + pub struct EnclaveOptions { + /// Property [`Enabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-enclaveoptions.html#cfn-ec2-instance-enclaveoptions-enabled). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub version: Option<::Value>, + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enabled: Option<::Value>, } - impl ::codec::SerializeValue for FleetLaunchTemplateSpecificationRequest { + impl ::codec::SerializeValue for EnclaveOptions { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref launch_template_id) = self.launch_template_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplateId", launch_template_id)?; - } - if let Some(ref launch_template_name) = self.launch_template_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplateName", launch_template_name)?; - } - if let Some(ref version) = self.version { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Version", version)?; + if let Some(ref enabled) = self.enabled { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Enabled", enabled)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for FleetLaunchTemplateSpecificationRequest { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for EnclaveOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = FleetLaunchTemplateSpecificationRequest; + type Value = EnclaveOptions; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type FleetLaunchTemplateSpecificationRequest") + write!(f, "a struct of type EnclaveOptions") } fn visit_map>(self, mut map: A) -> Result { - let mut launch_template_id: Option<::Value> = None; - let mut launch_template_name: Option<::Value> = None; - let mut version: Option<::Value> = None; + let mut enabled: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "LaunchTemplateId" => { - launch_template_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "LaunchTemplateName" => { - launch_template_name = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Version" => { - version = ::serde::de::MapAccess::next_value(&mut map)?; + "Enabled" => { + enabled = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(FleetLaunchTemplateSpecificationRequest { - launch_template_id: launch_template_id, - launch_template_name: launch_template_name, - version: version, + Ok(EnclaveOptions { + enabled: enabled, }) } } @@ -10180,116 +14067,51 @@ pub mod ec2_fleet { } } - /// The [`AWS::EC2::EC2Fleet.OnDemandOptionsRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-ondemandoptionsrequest.html) property type. + /// The [`AWS::EC2::Instance.HibernationOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-hibernationoptions.html) property type. #[derive(Debug, Default)] - pub struct OnDemandOptionsRequest { - /// Property [`AllocationStrategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-ondemandoptionsrequest.html#cfn-ec2-ec2fleet-ondemandoptionsrequest-allocationstrategy). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub allocation_strategy: Option<::Value>, - /// Property [`CapacityReservationOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-ondemandoptionsrequest.html#cfn-ec2-ec2fleet-ondemandoptionsrequest-capacityreservationoptions). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub capacity_reservation_options: Option<::Value>, - /// Property [`MaxTotalPrice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-ondemandoptionsrequest.html#cfn-ec2-ec2fleet-ondemandoptionsrequest-maxtotalprice). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub max_total_price: Option<::Value>, - /// Property [`MinTargetCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-ondemandoptionsrequest.html#cfn-ec2-ec2fleet-ondemandoptionsrequest-mintargetcapacity). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub min_target_capacity: Option<::Value>, - /// Property [`SingleAvailabilityZone`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-ondemandoptionsrequest.html#cfn-ec2-ec2fleet-ondemandoptionsrequest-singleavailabilityzone). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub single_availability_zone: Option<::Value>, - /// Property [`SingleInstanceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-ondemandoptionsrequest.html#cfn-ec2-ec2fleet-ondemandoptionsrequest-singleinstancetype). + pub struct HibernationOptions { + /// Property [`Configured`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-hibernationoptions.html#cfn-ec2-instance-hibernationoptions-configured). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub single_instance_type: Option<::Value>, + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub configured: Option<::Value>, } - impl ::codec::SerializeValue for OnDemandOptionsRequest { + impl ::codec::SerializeValue for HibernationOptions { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref allocation_strategy) = self.allocation_strategy { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AllocationStrategy", allocation_strategy)?; - } - if let Some(ref capacity_reservation_options) = self.capacity_reservation_options { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CapacityReservationOptions", capacity_reservation_options)?; - } - if let Some(ref max_total_price) = self.max_total_price { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxTotalPrice", max_total_price)?; - } - if let Some(ref min_target_capacity) = self.min_target_capacity { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "MinTargetCapacity", min_target_capacity)?; - } - if let Some(ref single_availability_zone) = self.single_availability_zone { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SingleAvailabilityZone", single_availability_zone)?; - } - if let Some(ref single_instance_type) = self.single_instance_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SingleInstanceType", single_instance_type)?; + if let Some(ref configured) = self.configured { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Configured", configured)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for OnDemandOptionsRequest { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for HibernationOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = OnDemandOptionsRequest; + type Value = HibernationOptions; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type OnDemandOptionsRequest") + write!(f, "a struct of type HibernationOptions") } fn visit_map>(self, mut map: A) -> Result { - let mut allocation_strategy: Option<::Value> = None; - let mut capacity_reservation_options: Option<::Value> = None; - let mut max_total_price: Option<::Value> = None; - let mut min_target_capacity: Option<::Value> = None; - let mut single_availability_zone: Option<::Value> = None; - let mut single_instance_type: Option<::Value> = None; - - while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { - match __cfn_key.as_ref() { - "AllocationStrategy" => { - allocation_strategy = ::serde::de::MapAccess::next_value(&mut map)?; - } - "CapacityReservationOptions" => { - capacity_reservation_options = ::serde::de::MapAccess::next_value(&mut map)?; - } - "MaxTotalPrice" => { - max_total_price = ::serde::de::MapAccess::next_value(&mut map)?; - } - "MinTargetCapacity" => { - min_target_capacity = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SingleAvailabilityZone" => { - single_availability_zone = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SingleInstanceType" => { - single_instance_type = ::serde::de::MapAccess::next_value(&mut map)?; + let mut configured: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Configured" => { + configured = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(OnDemandOptionsRequest { - allocation_strategy: allocation_strategy, - capacity_reservation_options: capacity_reservation_options, - max_total_price: max_total_price, - min_target_capacity: min_target_capacity, - single_availability_zone: single_availability_zone, - single_instance_type: single_instance_type, + Ok(HibernationOptions { + configured: configured, }) } } @@ -10298,142 +14120,49 @@ pub mod ec2_fleet { } } - /// The [`AWS::EC2::EC2Fleet.Placement`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html) property type. + /// The [`AWS::EC2::Instance.InstanceIpv6Address`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-instanceipv6address.html) property type. #[derive(Debug, Default)] - pub struct Placement { - /// Property [`Affinity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-affinity). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub affinity: Option<::Value>, - /// Property [`AvailabilityZone`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-availabilityzone). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub availability_zone: Option<::Value>, - /// Property [`GroupName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-groupname). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub group_name: Option<::Value>, - /// Property [`HostId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-hostid). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub host_id: Option<::Value>, - /// Property [`HostResourceGroupArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-hostresourcegrouparn). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub host_resource_group_arn: Option<::Value>, - /// Property [`PartitionNumber`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-partitionnumber). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub partition_number: Option<::Value>, - /// Property [`SpreadDomain`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-spreaddomain). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub spread_domain: Option<::Value>, - /// Property [`Tenancy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-placement.html#cfn-ec2-ec2fleet-placement-tenancy). + pub struct InstanceIpv6Address { + /// Property [`Ipv6Address`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-instanceipv6address.html#cfn-ec2-instance-instanceipv6address-ipv6address). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub tenancy: Option<::Value>, + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ipv6_address: ::Value, } - impl ::codec::SerializeValue for Placement { + impl ::codec::SerializeValue for InstanceIpv6Address { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref affinity) = self.affinity { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Affinity", affinity)?; - } - if let Some(ref availability_zone) = self.availability_zone { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AvailabilityZone", availability_zone)?; - } - if let Some(ref group_name) = self.group_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupName", group_name)?; - } - if let Some(ref host_id) = self.host_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "HostId", host_id)?; - } - if let Some(ref host_resource_group_arn) = self.host_resource_group_arn { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "HostResourceGroupArn", host_resource_group_arn)?; - } - if let Some(ref partition_number) = self.partition_number { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PartitionNumber", partition_number)?; - } - if let Some(ref spread_domain) = self.spread_domain { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpreadDomain", spread_domain)?; - } - if let Some(ref tenancy) = self.tenancy { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tenancy", tenancy)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6Address", &self.ipv6_address)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for Placement { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for InstanceIpv6Address { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = Placement; + type Value = InstanceIpv6Address; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type Placement") + write!(f, "a struct of type InstanceIpv6Address") } fn visit_map>(self, mut map: A) -> Result { - let mut affinity: Option<::Value> = None; - let mut availability_zone: Option<::Value> = None; - let mut group_name: Option<::Value> = None; - let mut host_id: Option<::Value> = None; - let mut host_resource_group_arn: Option<::Value> = None; - let mut partition_number: Option<::Value> = None; - let mut spread_domain: Option<::Value> = None; - let mut tenancy: Option<::Value> = None; + let mut ipv6_address: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Affinity" => { - affinity = ::serde::de::MapAccess::next_value(&mut map)?; - } - "AvailabilityZone" => { - availability_zone = ::serde::de::MapAccess::next_value(&mut map)?; - } - "GroupName" => { - group_name = ::serde::de::MapAccess::next_value(&mut map)?; - } - "HostId" => { - host_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "HostResourceGroupArn" => { - host_resource_group_arn = ::serde::de::MapAccess::next_value(&mut map)?; - } - "PartitionNumber" => { - partition_number = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SpreadDomain" => { - spread_domain = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Tenancy" => { - tenancy = ::serde::de::MapAccess::next_value(&mut map)?; + "Ipv6Address" => { + ipv6_address = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(Placement { - affinity: affinity, - availability_zone: availability_zone, - group_name: group_name, - host_id: host_id, - host_resource_group_arn: host_resource_group_arn, - partition_number: partition_number, - spread_domain: spread_domain, - tenancy: tenancy, + Ok(InstanceIpv6Address { + ipv6_address: ipv6_address.ok_or(::serde::de::Error::missing_field("Ipv6Address"))?, }) } } @@ -10442,129 +14171,75 @@ pub mod ec2_fleet { } } - /// The [`AWS::EC2::EC2Fleet.SpotOptionsRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html) property type. + /// The [`AWS::EC2::Instance.LaunchTemplateSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-launchtemplatespecification.html) property type. #[derive(Debug, Default)] - pub struct SpotOptionsRequest { - /// Property [`AllocationStrategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html#cfn-ec2-ec2fleet-spotoptionsrequest-allocationstrategy). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub allocation_strategy: Option<::Value>, - /// Property [`InstanceInterruptionBehavior`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html#cfn-ec2-ec2fleet-spotoptionsrequest-instanceinterruptionbehavior). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub instance_interruption_behavior: Option<::Value>, - /// Property [`InstancePoolsToUseCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html#cfn-ec2-ec2fleet-spotoptionsrequest-instancepoolstousecount). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub instance_pools_to_use_count: Option<::Value>, - /// Property [`MaxTotalPrice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html#cfn-ec2-ec2fleet-spotoptionsrequest-maxtotalprice). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub max_total_price: Option<::Value>, - /// Property [`MinTargetCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html#cfn-ec2-ec2fleet-spotoptionsrequest-mintargetcapacity). + pub struct LaunchTemplateSpecification { + /// Property [`LaunchTemplateId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-launchtemplatespecification.html#cfn-ec2-instance-launchtemplatespecification-launchtemplateid). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub min_target_capacity: Option<::Value>, - /// Property [`SingleAvailabilityZone`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html#cfn-ec2-ec2fleet-spotoptionsrequest-singleavailabilityzone). + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub launch_template_id: Option<::Value>, + /// Property [`LaunchTemplateName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-launchtemplatespecification.html#cfn-ec2-instance-launchtemplatespecification-launchtemplatename). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub single_availability_zone: Option<::Value>, - /// Property [`SingleInstanceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-spotoptionsrequest.html#cfn-ec2-ec2fleet-spotoptionsrequest-singleinstancetype). + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub launch_template_name: Option<::Value>, + /// Property [`Version`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-launchtemplatespecification.html#cfn-ec2-instance-launchtemplatespecification-version). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub single_instance_type: Option<::Value>, + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub version: ::Value, } - impl ::codec::SerializeValue for SpotOptionsRequest { + impl ::codec::SerializeValue for LaunchTemplateSpecification { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref allocation_strategy) = self.allocation_strategy { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AllocationStrategy", allocation_strategy)?; - } - if let Some(ref instance_interruption_behavior) = self.instance_interruption_behavior { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceInterruptionBehavior", instance_interruption_behavior)?; - } - if let Some(ref instance_pools_to_use_count) = self.instance_pools_to_use_count { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstancePoolsToUseCount", instance_pools_to_use_count)?; - } - if let Some(ref max_total_price) = self.max_total_price { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxTotalPrice", max_total_price)?; - } - if let Some(ref min_target_capacity) = self.min_target_capacity { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "MinTargetCapacity", min_target_capacity)?; - } - if let Some(ref single_availability_zone) = self.single_availability_zone { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SingleAvailabilityZone", single_availability_zone)?; + if let Some(ref launch_template_id) = self.launch_template_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplateId", launch_template_id)?; } - if let Some(ref single_instance_type) = self.single_instance_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SingleInstanceType", single_instance_type)?; + if let Some(ref launch_template_name) = self.launch_template_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplateName", launch_template_name)?; } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Version", &self.version)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for SpotOptionsRequest { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for LaunchTemplateSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = SpotOptionsRequest; + type Value = LaunchTemplateSpecification; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type SpotOptionsRequest") + write!(f, "a struct of type LaunchTemplateSpecification") } fn visit_map>(self, mut map: A) -> Result { - let mut allocation_strategy: Option<::Value> = None; - let mut instance_interruption_behavior: Option<::Value> = None; - let mut instance_pools_to_use_count: Option<::Value> = None; - let mut max_total_price: Option<::Value> = None; - let mut min_target_capacity: Option<::Value> = None; - let mut single_availability_zone: Option<::Value> = None; - let mut single_instance_type: Option<::Value> = None; + let mut launch_template_id: Option<::Value> = None; + let mut launch_template_name: Option<::Value> = None; + let mut version: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "AllocationStrategy" => { - allocation_strategy = ::serde::de::MapAccess::next_value(&mut map)?; - } - "InstanceInterruptionBehavior" => { - instance_interruption_behavior = ::serde::de::MapAccess::next_value(&mut map)?; - } - "InstancePoolsToUseCount" => { - instance_pools_to_use_count = ::serde::de::MapAccess::next_value(&mut map)?; - } - "MaxTotalPrice" => { - max_total_price = ::serde::de::MapAccess::next_value(&mut map)?; - } - "MinTargetCapacity" => { - min_target_capacity = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SingleAvailabilityZone" => { - single_availability_zone = ::serde::de::MapAccess::next_value(&mut map)?; + "LaunchTemplateId" => { + launch_template_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "SingleInstanceType" => { - single_instance_type = ::serde::de::MapAccess::next_value(&mut map)?; + "LaunchTemplateName" => { + launch_template_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Version" => { + version = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(SpotOptionsRequest { - allocation_strategy: allocation_strategy, - instance_interruption_behavior: instance_interruption_behavior, - instance_pools_to_use_count: instance_pools_to_use_count, - max_total_price: max_total_price, - min_target_capacity: min_target_capacity, - single_availability_zone: single_availability_zone, - single_instance_type: single_instance_type, + Ok(LaunchTemplateSpecification { + launch_template_id: launch_template_id, + launch_template_name: launch_template_name, + version: version.ok_or(::serde::de::Error::missing_field("Version"))?, }) } } @@ -10573,64 +14248,49 @@ pub mod ec2_fleet { } } - /// The [`AWS::EC2::EC2Fleet.TagSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-tagspecification.html) property type. + /// The [`AWS::EC2::Instance.LicenseSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-licensespecification.html) property type. #[derive(Debug, Default)] - pub struct TagSpecification { - /// Property [`ResourceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-tagspecification.html#cfn-ec2-ec2fleet-tagspecification-resourcetype). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub resource_type: Option<::Value>, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-tagspecification.html#cfn-ec2-ec2fleet-tagspecification-tags). + pub struct LicenseSpecification { + /// Property [`LicenseConfigurationArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-licensespecification.html#cfn-ec2-instance-licensespecification-licenseconfigurationarn). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub tags: Option<::ValueList<::Tag>>, + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub license_configuration_arn: ::Value, } - impl ::codec::SerializeValue for TagSpecification { + impl ::codec::SerializeValue for LicenseSpecification { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref resource_type) = self.resource_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceType", resource_type)?; - } - if let Some(ref tags) = self.tags { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LicenseConfigurationArn", &self.license_configuration_arn)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for TagSpecification { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for LicenseSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = TagSpecification; + type Value = LicenseSpecification; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type TagSpecification") + write!(f, "a struct of type LicenseSpecification") } fn visit_map>(self, mut map: A) -> Result { - let mut resource_type: Option<::Value> = None; - let mut tags: Option<::ValueList<::Tag>> = None; + let mut license_configuration_arn: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "ResourceType" => { - resource_type = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Tags" => { - tags = ::serde::de::MapAccess::next_value(&mut map)?; + "LicenseConfigurationArn" => { + license_configuration_arn = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(TagSpecification { - resource_type: resource_type, - tags: tags, + Ok(LicenseSpecification { + license_configuration_arn: license_configuration_arn.ok_or(::serde::de::Error::missing_field("LicenseConfigurationArn"))?, }) } } @@ -10639,154 +14299,303 @@ pub mod ec2_fleet { } } - /// The [`AWS::EC2::EC2Fleet.TargetCapacitySpecificationRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-targetcapacityspecificationrequest.html) property type. + /// The [`AWS::EC2::Instance.NetworkInterface`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html) property type. #[derive(Debug, Default)] - pub struct TargetCapacitySpecificationRequest { - /// Property [`DefaultTargetCapacityType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-targetcapacityspecificationrequest.html#cfn-ec2-ec2fleet-targetcapacityspecificationrequest-defaulttargetcapacitytype). + pub struct NetworkInterface { + /// Property [`AssociatePublicIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-associatepubip). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub default_target_capacity_type: Option<::Value>, - /// Property [`OnDemandTargetCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-targetcapacityspecificationrequest.html#cfn-ec2-ec2fleet-targetcapacityspecificationrequest-ondemandtargetcapacity). + pub associate_public_ip_address: Option<::Value>, + /// Property [`DeleteOnTermination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-delete). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub on_demand_target_capacity: Option<::Value>, - /// Property [`SpotTargetCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-targetcapacityspecificationrequest.html#cfn-ec2-ec2fleet-targetcapacityspecificationrequest-spottargetcapacity). + pub delete_on_termination: Option<::Value>, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-description). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub spot_target_capacity: Option<::Value>, - /// Property [`TotalTargetCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-ec2fleet-targetcapacityspecificationrequest.html#cfn-ec2-ec2fleet-targetcapacityspecificationrequest-totaltargetcapacity). + pub description: Option<::Value>, + /// Property [`DeviceIndex`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-deviceindex). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub total_target_capacity: ::Value, + pub device_index: ::Value, + /// Property [`GroupSet`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-groupset). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub group_set: Option<::ValueList>, + /// Property [`Ipv6AddressCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#cfn-ec2-instance-networkinterface-ipv6addresscount). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ipv6_address_count: Option<::Value>, + /// Property [`Ipv6Addresses`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#cfn-ec2-instance-networkinterface-ipv6addresses). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ipv6_addresses: Option<::ValueList>, + /// Property [`NetworkInterfaceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-network-iface). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub network_interface_id: Option<::Value>, + /// Property [`PrivateIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-privateipaddress). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub private_ip_address: Option<::Value>, + /// Property [`PrivateIpAddresses`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-privateipaddresses). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub private_ip_addresses: Option<::ValueList>, + /// Property [`SecondaryPrivateIpAddressCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-secondprivateip). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub secondary_private_ip_address_count: Option<::Value>, + /// Property [`SubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-subnetid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub subnet_id: Option<::Value>, } - impl ::codec::SerializeValue for TargetCapacitySpecificationRequest { + impl ::codec::SerializeValue for NetworkInterface { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref default_target_capacity_type) = self.default_target_capacity_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DefaultTargetCapacityType", default_target_capacity_type)?; + if let Some(ref associate_public_ip_address) = self.associate_public_ip_address { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AssociatePublicIpAddress", associate_public_ip_address)?; } - if let Some(ref on_demand_target_capacity) = self.on_demand_target_capacity { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "OnDemandTargetCapacity", on_demand_target_capacity)?; + if let Some(ref delete_on_termination) = self.delete_on_termination { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeleteOnTermination", delete_on_termination)?; } - if let Some(ref spot_target_capacity) = self.spot_target_capacity { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpotTargetCapacity", spot_target_capacity)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeviceIndex", &self.device_index)?; + if let Some(ref group_set) = self.group_set { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupSet", group_set)?; + } + if let Some(ref ipv6_address_count) = self.ipv6_address_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6AddressCount", ipv6_address_count)?; + } + if let Some(ref ipv6_addresses) = self.ipv6_addresses { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6Addresses", ipv6_addresses)?; + } + if let Some(ref network_interface_id) = self.network_interface_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaceId", network_interface_id)?; + } + if let Some(ref private_ip_address) = self.private_ip_address { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateIpAddress", private_ip_address)?; + } + if let Some(ref private_ip_addresses) = self.private_ip_addresses { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateIpAddresses", private_ip_addresses)?; + } + if let Some(ref secondary_private_ip_address_count) = self.secondary_private_ip_address_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecondaryPrivateIpAddressCount", secondary_private_ip_address_count)?; + } + if let Some(ref subnet_id) = self.subnet_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetId", subnet_id)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TotalTargetCapacity", &self.total_target_capacity)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for TargetCapacitySpecificationRequest { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for NetworkInterface { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = TargetCapacitySpecificationRequest; + type Value = NetworkInterface; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type TargetCapacitySpecificationRequest") + write!(f, "a struct of type NetworkInterface") } fn visit_map>(self, mut map: A) -> Result { - let mut default_target_capacity_type: Option<::Value> = None; - let mut on_demand_target_capacity: Option<::Value> = None; - let mut spot_target_capacity: Option<::Value> = None; - let mut total_target_capacity: Option<::Value> = None; + let mut associate_public_ip_address: Option<::Value> = None; + let mut delete_on_termination: Option<::Value> = None; + let mut description: Option<::Value> = None; + let mut device_index: Option<::Value> = None; + let mut group_set: Option<::ValueList> = None; + let mut ipv6_address_count: Option<::Value> = None; + let mut ipv6_addresses: Option<::ValueList> = None; + let mut network_interface_id: Option<::Value> = None; + let mut private_ip_address: Option<::Value> = None; + let mut private_ip_addresses: Option<::ValueList> = None; + let mut secondary_private_ip_address_count: Option<::Value> = None; + let mut subnet_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "DefaultTargetCapacityType" => { - default_target_capacity_type = ::serde::de::MapAccess::next_value(&mut map)?; + "AssociatePublicIpAddress" => { + associate_public_ip_address = ::serde::de::MapAccess::next_value(&mut map)?; } - "OnDemandTargetCapacity" => { - on_demand_target_capacity = ::serde::de::MapAccess::next_value(&mut map)?; + "DeleteOnTermination" => { + delete_on_termination = ::serde::de::MapAccess::next_value(&mut map)?; } - "SpotTargetCapacity" => { - spot_target_capacity = ::serde::de::MapAccess::next_value(&mut map)?; + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; } - "TotalTargetCapacity" => { - total_target_capacity = ::serde::de::MapAccess::next_value(&mut map)?; + "DeviceIndex" => { + device_index = ::serde::de::MapAccess::next_value(&mut map)?; + } + "GroupSet" => { + group_set = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Ipv6AddressCount" => { + ipv6_address_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Ipv6Addresses" => { + ipv6_addresses = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NetworkInterfaceId" => { + network_interface_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PrivateIpAddress" => { + private_ip_address = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PrivateIpAddresses" => { + private_ip_addresses = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SecondaryPrivateIpAddressCount" => { + secondary_private_ip_address_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SubnetId" => { + subnet_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(TargetCapacitySpecificationRequest { - default_target_capacity_type: default_target_capacity_type, - on_demand_target_capacity: on_demand_target_capacity, - spot_target_capacity: spot_target_capacity, - total_target_capacity: total_target_capacity.ok_or(::serde::de::Error::missing_field("TotalTargetCapacity"))?, - }) + Ok(NetworkInterface { + associate_public_ip_address: associate_public_ip_address, + delete_on_termination: delete_on_termination, + description: description, + device_index: device_index.ok_or(::serde::de::Error::missing_field("DeviceIndex"))?, + group_set: group_set, + ipv6_address_count: ipv6_address_count, + ipv6_addresses: ipv6_addresses, + network_interface_id: network_interface_id, + private_ip_address: private_ip_address, + private_ip_addresses: private_ip_addresses, + secondary_private_ip_address_count: secondary_private_ip_address_count, + subnet_id: subnet_id, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::Instance.NoDevice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-nodevice.html) property type. + #[derive(Debug, Default)] + pub struct NoDevice { + } + + impl ::codec::SerializeValue for NoDevice { + fn serialize(&self, s: S) -> Result { + let map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for NoDevice { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = NoDevice; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type NoDevice") + } + + fn visit_map>(self, _map: A) -> Result { + Ok(NoDevice {}) } } d.deserialize_map(Visitor) } } -} - -pub mod instance { - //! Property types for the `Instance` resource. - /// The [`AWS::EC2::Instance.AssociationParameter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-ssmassociations-associationparameters.html) property type. + /// The [`AWS::EC2::Instance.PrivateDnsNameOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-privatednsnameoptions.html) property type. #[derive(Debug, Default)] - pub struct AssociationParameter { - /// Property [`Key`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-ssmassociations-associationparameters.html#cfn-ec2-instance-ssmassociations-associationparameters-key). + pub struct PrivateDnsNameOptions { + /// Property [`EnableResourceNameDnsAAAARecord`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-privatednsnameoptions.html#cfn-ec2-instance-privatednsnameoptions-enableresourcenamednsaaaarecord). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub key: ::Value, - /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-ssmassociations-associationparameters.html#cfn-ec2-instance-ssmassociations-associationparameters-value). + pub enable_resource_name_dns_aaaa_record: Option<::Value>, + /// Property [`EnableResourceNameDnsARecord`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-privatednsnameoptions.html#cfn-ec2-instance-privatednsnameoptions-enableresourcenamednsarecord). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub value: ::ValueList, + pub enable_resource_name_dns_a_record: Option<::Value>, + /// Property [`HostnameType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-privatednsnameoptions.html#cfn-ec2-instance-privatednsnameoptions-hostnametype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub hostname_type: Option<::Value>, } - impl ::codec::SerializeValue for AssociationParameter { + impl ::codec::SerializeValue for PrivateDnsNameOptions { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Key", &self.key)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", &self.value)?; + if let Some(ref enable_resource_name_dns_aaaa_record) = self.enable_resource_name_dns_aaaa_record { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EnableResourceNameDnsAAAARecord", enable_resource_name_dns_aaaa_record)?; + } + if let Some(ref enable_resource_name_dns_a_record) = self.enable_resource_name_dns_a_record { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EnableResourceNameDnsARecord", enable_resource_name_dns_a_record)?; + } + if let Some(ref hostname_type) = self.hostname_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HostnameType", hostname_type)?; + } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for AssociationParameter { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for PrivateDnsNameOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = AssociationParameter; + type Value = PrivateDnsNameOptions; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type AssociationParameter") + write!(f, "a struct of type PrivateDnsNameOptions") } fn visit_map>(self, mut map: A) -> Result { - let mut key: Option<::Value> = None; - let mut value: Option<::ValueList> = None; + let mut enable_resource_name_dns_aaaa_record: Option<::Value> = None; + let mut enable_resource_name_dns_a_record: Option<::Value> = None; + let mut hostname_type: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Key" => { - key = ::serde::de::MapAccess::next_value(&mut map)?; + "EnableResourceNameDnsAAAARecord" => { + enable_resource_name_dns_aaaa_record = ::serde::de::MapAccess::next_value(&mut map)?; } - "Value" => { - value = ::serde::de::MapAccess::next_value(&mut map)?; + "EnableResourceNameDnsARecord" => { + enable_resource_name_dns_a_record = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HostnameType" => { + hostname_type = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(AssociationParameter { - key: key.ok_or(::serde::de::Error::missing_field("Key"))?, - value: value.ok_or(::serde::de::Error::missing_field("Value"))?, + Ok(PrivateDnsNameOptions { + enable_resource_name_dns_aaaa_record: enable_resource_name_dns_aaaa_record, + enable_resource_name_dns_a_record: enable_resource_name_dns_a_record, + hostname_type: hostname_type, }) } } @@ -10795,88 +14604,60 @@ pub mod instance { } } - /// The [`AWS::EC2::Instance.BlockDeviceMapping`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-mapping.html) property type. + /// The [`AWS::EC2::Instance.PrivateIpAddressSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-interface-privateipspec.html) property type. #[derive(Debug, Default)] - pub struct BlockDeviceMapping { - /// Property [`DeviceName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-mapping.html#cfn-ec2-blockdev-mapping-devicename). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub device_name: ::Value, - /// Property [`Ebs`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-mapping.html#cfn-ec2-blockdev-mapping-ebs). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub ebs: Option<::Value>, - /// Property [`NoDevice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-mapping.html#cfn-ec2-blockdev-mapping-nodevice). + pub struct PrivateIpAddressSpecification { + /// Property [`Primary`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-interface-privateipspec.html#cfn-ec2-networkinterface-privateipspecification-primary). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub no_device: Option<::Value>, - /// Property [`VirtualName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-mapping.html#cfn-ec2-blockdev-mapping-virtualname). + pub primary: ::Value, + /// Property [`PrivateIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-interface-privateipspec.html#cfn-ec2-networkinterface-privateipspecification-privateipaddress). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub virtual_name: Option<::Value>, + pub private_ip_address: ::Value, } - impl ::codec::SerializeValue for BlockDeviceMapping { + impl ::codec::SerializeValue for PrivateIpAddressSpecification { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeviceName", &self.device_name)?; - if let Some(ref ebs) = self.ebs { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ebs", ebs)?; - } - if let Some(ref no_device) = self.no_device { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NoDevice", no_device)?; - } - if let Some(ref virtual_name) = self.virtual_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VirtualName", virtual_name)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Primary", &self.primary)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateIpAddress", &self.private_ip_address)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for BlockDeviceMapping { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for PrivateIpAddressSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = BlockDeviceMapping; + type Value = PrivateIpAddressSpecification; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type BlockDeviceMapping") + write!(f, "a struct of type PrivateIpAddressSpecification") } fn visit_map>(self, mut map: A) -> Result { - let mut device_name: Option<::Value> = None; - let mut ebs: Option<::Value> = None; - let mut no_device: Option<::Value> = None; - let mut virtual_name: Option<::Value> = None; + let mut primary: Option<::Value> = None; + let mut private_ip_address: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "DeviceName" => { - device_name = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Ebs" => { - ebs = ::serde::de::MapAccess::next_value(&mut map)?; - } - "NoDevice" => { - no_device = ::serde::de::MapAccess::next_value(&mut map)?; + "Primary" => { + primary = ::serde::de::MapAccess::next_value(&mut map)?; } - "VirtualName" => { - virtual_name = ::serde::de::MapAccess::next_value(&mut map)?; + "PrivateIpAddress" => { + private_ip_address = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(BlockDeviceMapping { - device_name: device_name.ok_or(::serde::de::Error::missing_field("DeviceName"))?, - ebs: ebs, - no_device: no_device, - virtual_name: virtual_name, + Ok(PrivateIpAddressSpecification { + primary: primary.ok_or(::serde::de::Error::missing_field("Primary"))?, + private_ip_address: private_ip_address.ok_or(::serde::de::Error::missing_field("PrivateIpAddress"))?, }) } } @@ -10885,64 +14666,62 @@ pub mod instance { } } - /// The [`AWS::EC2::Instance.CpuOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-cpuoptions.html) property type. + /// The [`AWS::EC2::Instance.SsmAssociation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-ssmassociations.html) property type. #[derive(Debug, Default)] - pub struct CpuOptions { - /// Property [`CoreCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-cpuoptions.html#cfn-ec2-instance-cpuoptions-corecount). + pub struct SsmAssociation { + /// Property [`AssociationParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-ssmassociations.html#cfn-ec2-instance-ssmassociations-associationparameters). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub core_count: Option<::Value>, - /// Property [`ThreadsPerCore`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-cpuoptions.html#cfn-ec2-instance-cpuoptions-threadspercore). + pub association_parameters: Option<::ValueList>, + /// Property [`DocumentName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-ssmassociations.html#cfn-ec2-instance-ssmassociations-documentname). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub threads_per_core: Option<::Value>, + pub document_name: ::Value, } - impl ::codec::SerializeValue for CpuOptions { + impl ::codec::SerializeValue for SsmAssociation { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref core_count) = self.core_count { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CoreCount", core_count)?; - } - if let Some(ref threads_per_core) = self.threads_per_core { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ThreadsPerCore", threads_per_core)?; + if let Some(ref association_parameters) = self.association_parameters { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AssociationParameters", association_parameters)?; } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentName", &self.document_name)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for CpuOptions { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for SsmAssociation { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = CpuOptions; + type Value = SsmAssociation; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type CpuOptions") + write!(f, "a struct of type SsmAssociation") } fn visit_map>(self, mut map: A) -> Result { - let mut core_count: Option<::Value> = None; - let mut threads_per_core: Option<::Value> = None; + let mut association_parameters: Option<::ValueList> = None; + let mut document_name: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "CoreCount" => { - core_count = ::serde::de::MapAccess::next_value(&mut map)?; + "AssociationParameters" => { + association_parameters = ::serde::de::MapAccess::next_value(&mut map)?; } - "ThreadsPerCore" => { - threads_per_core = ::serde::de::MapAccess::next_value(&mut map)?; + "DocumentName" => { + document_name = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(CpuOptions { - core_count: core_count, - threads_per_core: threads_per_core, + Ok(SsmAssociation { + association_parameters: association_parameters, + document_name: document_name.ok_or(::serde::de::Error::missing_field("DocumentName"))?, }) } } @@ -10951,51 +14730,60 @@ pub mod instance { } } - /// The [`AWS::EC2::Instance.CreditSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-creditspecification.html) property type. + /// The [`AWS::EC2::Instance.Volume`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-mount-point.html) property type. #[derive(Debug, Default)] - pub struct CreditSpecification { - /// Property [`CPUCredits`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-creditspecification.html#cfn-ec2-instance-creditspecification-cpucredits). + pub struct Volume { + /// Property [`Device`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-mount-point.html#cfn-ec2-mountpoint-device). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub cpu_credits: Option<::Value>, + pub device: ::Value, + /// Property [`VolumeId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-mount-point.html#cfn-ec2-mountpoint-volumeid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub volume_id: ::Value, } - impl ::codec::SerializeValue for CreditSpecification { + impl ::codec::SerializeValue for Volume { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref cpu_credits) = self.cpu_credits { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CPUCredits", cpu_credits)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Device", &self.device)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VolumeId", &self.volume_id)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for CreditSpecification { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for Volume { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = CreditSpecification; + type Value = Volume; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type CreditSpecification") + write!(f, "a struct of type Volume") } fn visit_map>(self, mut map: A) -> Result { - let mut cpu_credits: Option<::Value> = None; + let mut device: Option<::Value> = None; + let mut volume_id: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "CPUCredits" => { - cpu_credits = ::serde::de::MapAccess::next_value(&mut map)?; + "Device" => { + device = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VolumeId" => { + volume_id = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(CreditSpecification { - cpu_credits: cpu_credits, + Ok(Volume { + device: device.ok_or(::serde::de::Error::missing_field("Device"))?, + volume_id: volume_id.ok_or(::serde::de::Error::missing_field("VolumeId"))?, }) } } @@ -11003,130 +14791,69 @@ pub mod instance { d.deserialize_map(Visitor) } } +} - /// The [`AWS::EC2::Instance.Ebs`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html) property type. +pub mod launch_template { + //! Property types for the `LaunchTemplate` resource. + + /// The [`AWS::EC2::LaunchTemplate.AcceleratorCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-acceleratorcount.html) property type. #[derive(Debug, Default)] - pub struct Ebs { - /// Property [`DeleteOnTermination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html#cfn-ec2-blockdev-template-deleteontermination). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub delete_on_termination: Option<::Value>, - /// Property [`Encrypted`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html#cfn-ec2-blockdev-template-encrypted). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub encrypted: Option<::Value>, - /// Property [`Iops`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html#cfn-ec2-blockdev-template-iops). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub iops: Option<::Value>, - /// Property [`KmsKeyId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html#cfn-ec2-instance-ebs-kmskeyid). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub kms_key_id: Option<::Value>, - /// Property [`SnapshotId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html#cfn-ec2-blockdev-template-snapshotid). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub snapshot_id: Option<::Value>, - /// Property [`VolumeSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html#cfn-ec2-blockdev-template-volumesize). + pub struct AcceleratorCount { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-acceleratorcount.html#cfn-ec2-launchtemplate-acceleratorcount-max). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub volume_size: Option<::Value>, - /// Property [`VolumeType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-blockdev-template.html#cfn-ec2-blockdev-template-volumetype). + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-acceleratorcount.html#cfn-ec2-launchtemplate-acceleratorcount-min). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub volume_type: Option<::Value>, + pub min: Option<::Value>, } - impl ::codec::SerializeValue for Ebs { + impl ::codec::SerializeValue for AcceleratorCount { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref delete_on_termination) = self.delete_on_termination { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeleteOnTermination", delete_on_termination)?; - } - if let Some(ref encrypted) = self.encrypted { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Encrypted", encrypted)?; - } - if let Some(ref iops) = self.iops { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Iops", iops)?; - } - if let Some(ref kms_key_id) = self.kms_key_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "KmsKeyId", kms_key_id)?; - } - if let Some(ref snapshot_id) = self.snapshot_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SnapshotId", snapshot_id)?; - } - if let Some(ref volume_size) = self.volume_size { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VolumeSize", volume_size)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; } - if let Some(ref volume_type) = self.volume_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VolumeType", volume_type)?; + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for Ebs { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for AcceleratorCount { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = Ebs; + type Value = AcceleratorCount; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type Ebs") + write!(f, "a struct of type AcceleratorCount") } fn visit_map>(self, mut map: A) -> Result { - let mut delete_on_termination: Option<::Value> = None; - let mut encrypted: Option<::Value> = None; - let mut iops: Option<::Value> = None; - let mut kms_key_id: Option<::Value> = None; - let mut snapshot_id: Option<::Value> = None; - let mut volume_size: Option<::Value> = None; - let mut volume_type: Option<::Value> = None; + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "DeleteOnTermination" => { - delete_on_termination = ::serde::de::MapAccess::next_value(&mut map)?; + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; } - "Encrypted" => { - encrypted = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Iops" => { - iops = ::serde::de::MapAccess::next_value(&mut map)?; - } - "KmsKeyId" => { - kms_key_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SnapshotId" => { - snapshot_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "VolumeSize" => { - volume_size = ::serde::de::MapAccess::next_value(&mut map)?; - } - "VolumeType" => { - volume_type = ::serde::de::MapAccess::next_value(&mut map)?; + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(Ebs { - delete_on_termination: delete_on_termination, - encrypted: encrypted, - iops: iops, - kms_key_id: kms_key_id, - snapshot_id: snapshot_id, - volume_size: volume_size, - volume_type: volume_type, + Ok(AcceleratorCount { + max: max, + min: min, }) } } @@ -11135,49 +14862,64 @@ pub mod instance { } } - /// The [`AWS::EC2::Instance.ElasticGpuSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-elasticgpuspecification.html) property type. + /// The [`AWS::EC2::LaunchTemplate.AcceleratorTotalMemoryMiB`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-acceleratortotalmemorymib.html) property type. #[derive(Debug, Default)] - pub struct ElasticGpuSpecification { - /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-elasticgpuspecification.html#cfn-ec2-instance-elasticgpuspecification-type). + pub struct AcceleratorTotalMemoryMiB { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-acceleratortotalmemorymib.html#cfn-ec2-launchtemplate-acceleratortotalmemorymib-max). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub r#type: ::Value, + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-acceleratortotalmemorymib.html#cfn-ec2-launchtemplate-acceleratortotalmemorymib-min). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub min: Option<::Value>, } - impl ::codec::SerializeValue for ElasticGpuSpecification { + impl ::codec::SerializeValue for AcceleratorTotalMemoryMiB { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; + } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for ElasticGpuSpecification { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for AcceleratorTotalMemoryMiB { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = ElasticGpuSpecification; + type Value = AcceleratorTotalMemoryMiB; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type ElasticGpuSpecification") + write!(f, "a struct of type AcceleratorTotalMemoryMiB") } fn visit_map>(self, mut map: A) -> Result { - let mut r#type: Option<::Value> = None; + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Type" => { - r#type = ::serde::de::MapAccess::next_value(&mut map)?; + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(ElasticGpuSpecification { - r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?, + Ok(AcceleratorTotalMemoryMiB { + max: max, + min: min, }) } } @@ -11186,62 +14928,64 @@ pub mod instance { } } - /// The [`AWS::EC2::Instance.ElasticInferenceAccelerator`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-elasticinferenceaccelerator.html) property type. + /// The [`AWS::EC2::LaunchTemplate.BaselineEbsBandwidthMbps`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-baselineebsbandwidthmbps.html) property type. #[derive(Debug, Default)] - pub struct ElasticInferenceAccelerator { - /// Property [`Count`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-elasticinferenceaccelerator.html#cfn-ec2-instance-elasticinferenceaccelerator-count). + pub struct BaselineEbsBandwidthMbps { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-baselineebsbandwidthmbps.html#cfn-ec2-launchtemplate-baselineebsbandwidthmbps-max). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub count: Option<::Value>, - /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-elasticinferenceaccelerator.html#cfn-ec2-instance-elasticinferenceaccelerator-type). + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-baselineebsbandwidthmbps.html#cfn-ec2-launchtemplate-baselineebsbandwidthmbps-min). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub r#type: ::Value, + pub min: Option<::Value>, } - impl ::codec::SerializeValue for ElasticInferenceAccelerator { + impl ::codec::SerializeValue for BaselineEbsBandwidthMbps { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref count) = self.count { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Count", count)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for ElasticInferenceAccelerator { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for BaselineEbsBandwidthMbps { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = ElasticInferenceAccelerator; + type Value = BaselineEbsBandwidthMbps; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type ElasticInferenceAccelerator") + write!(f, "a struct of type BaselineEbsBandwidthMbps") } fn visit_map>(self, mut map: A) -> Result { - let mut count: Option<::Value> = None; - let mut r#type: Option<::Value> = None; + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Count" => { - count = ::serde::de::MapAccess::next_value(&mut map)?; + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; } - "Type" => { - r#type = ::serde::de::MapAccess::next_value(&mut map)?; + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(ElasticInferenceAccelerator { - count: count, - r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?, + Ok(BaselineEbsBandwidthMbps { + max: max, + min: min, }) } } @@ -11250,51 +14994,90 @@ pub mod instance { } } - /// The [`AWS::EC2::Instance.EnclaveOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-enclaveoptions.html) property type. + /// The [`AWS::EC2::LaunchTemplate.BlockDeviceMapping`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping.html) property type. #[derive(Debug, Default)] - pub struct EnclaveOptions { - /// Property [`Enabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-enclaveoptions.html#cfn-ec2-instance-enclaveoptions-enabled). + pub struct BlockDeviceMapping { + /// Property [`DeviceName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping.html#cfn-ec2-launchtemplate-blockdevicemapping-devicename). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub enabled: Option<::Value>, + pub device_name: Option<::Value>, + /// Property [`Ebs`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping.html#cfn-ec2-launchtemplate-blockdevicemapping-ebs). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ebs: Option<::Value>, + /// Property [`NoDevice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping.html#cfn-ec2-launchtemplate-blockdevicemapping-nodevice). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub no_device: Option<::Value>, + /// Property [`VirtualName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping.html#cfn-ec2-launchtemplate-blockdevicemapping-virtualname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub virtual_name: Option<::Value>, } - impl ::codec::SerializeValue for EnclaveOptions { + impl ::codec::SerializeValue for BlockDeviceMapping { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref enabled) = self.enabled { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Enabled", enabled)?; + if let Some(ref device_name) = self.device_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeviceName", device_name)?; + } + if let Some(ref ebs) = self.ebs { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ebs", ebs)?; + } + if let Some(ref no_device) = self.no_device { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NoDevice", no_device)?; + } + if let Some(ref virtual_name) = self.virtual_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VirtualName", virtual_name)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for EnclaveOptions { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for BlockDeviceMapping { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = EnclaveOptions; + type Value = BlockDeviceMapping; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type EnclaveOptions") + write!(f, "a struct of type BlockDeviceMapping") } fn visit_map>(self, mut map: A) -> Result { - let mut enabled: Option<::Value> = None; + let mut device_name: Option<::Value> = None; + let mut ebs: Option<::Value> = None; + let mut no_device: Option<::Value> = None; + let mut virtual_name: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Enabled" => { - enabled = ::serde::de::MapAccess::next_value(&mut map)?; + "DeviceName" => { + device_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Ebs" => { + ebs = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NoDevice" => { + no_device = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VirtualName" => { + virtual_name = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(EnclaveOptions { - enabled: enabled, + Ok(BlockDeviceMapping { + device_name: device_name, + ebs: ebs, + no_device: no_device, + virtual_name: virtual_name, }) } } @@ -11303,51 +15086,64 @@ pub mod instance { } } - /// The [`AWS::EC2::Instance.HibernationOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-hibernationoptions.html) property type. + /// The [`AWS::EC2::LaunchTemplate.CapacityReservationSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-capacityreservationspecification.html) property type. #[derive(Debug, Default)] - pub struct HibernationOptions { - /// Property [`Configured`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-hibernationoptions.html#cfn-ec2-instance-hibernationoptions-configured). + pub struct CapacityReservationSpecification { + /// Property [`CapacityReservationPreference`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-capacityreservationspecification.html#cfn-ec2-launchtemplate-launchtemplatedata-capacityreservationspecification-capacityreservationpreference). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub configured: Option<::Value>, + pub capacity_reservation_preference: Option<::Value>, + /// Property [`CapacityReservationTarget`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-capacityreservationspecification.html#cfn-ec2-launchtemplate-launchtemplatedata-capacityreservationspecification-capacityreservationtarget). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub capacity_reservation_target: Option<::Value>, } - impl ::codec::SerializeValue for HibernationOptions { + impl ::codec::SerializeValue for CapacityReservationSpecification { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref configured) = self.configured { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Configured", configured)?; + if let Some(ref capacity_reservation_preference) = self.capacity_reservation_preference { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CapacityReservationPreference", capacity_reservation_preference)?; + } + if let Some(ref capacity_reservation_target) = self.capacity_reservation_target { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CapacityReservationTarget", capacity_reservation_target)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for HibernationOptions { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for CapacityReservationSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = HibernationOptions; + type Value = CapacityReservationSpecification; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type HibernationOptions") + write!(f, "a struct of type CapacityReservationSpecification") } fn visit_map>(self, mut map: A) -> Result { - let mut configured: Option<::Value> = None; + let mut capacity_reservation_preference: Option<::Value> = None; + let mut capacity_reservation_target: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Configured" => { - configured = ::serde::de::MapAccess::next_value(&mut map)?; + "CapacityReservationPreference" => { + capacity_reservation_preference = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CapacityReservationTarget" => { + capacity_reservation_target = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(HibernationOptions { - configured: configured, + Ok(CapacityReservationSpecification { + capacity_reservation_preference: capacity_reservation_preference, + capacity_reservation_target: capacity_reservation_target, }) } } @@ -11356,49 +15152,64 @@ pub mod instance { } } - /// The [`AWS::EC2::Instance.InstanceIpv6Address`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-instanceipv6address.html) property type. + /// The [`AWS::EC2::LaunchTemplate.CapacityReservationTarget`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-capacityreservationtarget.html) property type. #[derive(Debug, Default)] - pub struct InstanceIpv6Address { - /// Property [`Ipv6Address`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-instanceipv6address.html#cfn-ec2-instance-instanceipv6address-ipv6address). + pub struct CapacityReservationTarget { + /// Property [`CapacityReservationId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-capacityreservationtarget.html#cfn-ec2-launchtemplate-capacityreservationtarget-capacityreservationid). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub ipv6_address: ::Value, + pub capacity_reservation_id: Option<::Value>, + /// Property [`CapacityReservationResourceGroupArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-capacityreservationtarget.html#cfn-ec2-launchtemplate-capacityreservationtarget-capacityreservationresourcegrouparn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub capacity_reservation_resource_group_arn: Option<::Value>, } - impl ::codec::SerializeValue for InstanceIpv6Address { + impl ::codec::SerializeValue for CapacityReservationTarget { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6Address", &self.ipv6_address)?; + if let Some(ref capacity_reservation_id) = self.capacity_reservation_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CapacityReservationId", capacity_reservation_id)?; + } + if let Some(ref capacity_reservation_resource_group_arn) = self.capacity_reservation_resource_group_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CapacityReservationResourceGroupArn", capacity_reservation_resource_group_arn)?; + } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for InstanceIpv6Address { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for CapacityReservationTarget { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = InstanceIpv6Address; + type Value = CapacityReservationTarget; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type InstanceIpv6Address") + write!(f, "a struct of type CapacityReservationTarget") } fn visit_map>(self, mut map: A) -> Result { - let mut ipv6_address: Option<::Value> = None; + let mut capacity_reservation_id: Option<::Value> = None; + let mut capacity_reservation_resource_group_arn: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Ipv6Address" => { - ipv6_address = ::serde::de::MapAccess::next_value(&mut map)?; + "CapacityReservationId" => { + capacity_reservation_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CapacityReservationResourceGroupArn" => { + capacity_reservation_resource_group_arn = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(InstanceIpv6Address { - ipv6_address: ipv6_address.ok_or(::serde::de::Error::missing_field("Ipv6Address"))?, + Ok(CapacityReservationTarget { + capacity_reservation_id: capacity_reservation_id, + capacity_reservation_resource_group_arn: capacity_reservation_resource_group_arn, }) } } @@ -11407,75 +15218,64 @@ pub mod instance { } } - /// The [`AWS::EC2::Instance.LaunchTemplateSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-launchtemplatespecification.html) property type. + /// The [`AWS::EC2::LaunchTemplate.CpuOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-cpuoptions.html) property type. #[derive(Debug, Default)] - pub struct LaunchTemplateSpecification { - /// Property [`LaunchTemplateId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-launchtemplatespecification.html#cfn-ec2-instance-launchtemplatespecification-launchtemplateid). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub launch_template_id: Option<::Value>, - /// Property [`LaunchTemplateName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-launchtemplatespecification.html#cfn-ec2-instance-launchtemplatespecification-launchtemplatename). + pub struct CpuOptions { + /// Property [`CoreCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-cpuoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-cpuoptions-corecount). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub launch_template_name: Option<::Value>, - /// Property [`Version`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-launchtemplatespecification.html#cfn-ec2-instance-launchtemplatespecification-version). + pub core_count: Option<::Value>, + /// Property [`ThreadsPerCore`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-cpuoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-cpuoptions-threadspercore). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub version: ::Value, + pub threads_per_core: Option<::Value>, } - impl ::codec::SerializeValue for LaunchTemplateSpecification { + impl ::codec::SerializeValue for CpuOptions { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref launch_template_id) = self.launch_template_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplateId", launch_template_id)?; + if let Some(ref core_count) = self.core_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CoreCount", core_count)?; } - if let Some(ref launch_template_name) = self.launch_template_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LaunchTemplateName", launch_template_name)?; + if let Some(ref threads_per_core) = self.threads_per_core { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ThreadsPerCore", threads_per_core)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Version", &self.version)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for LaunchTemplateSpecification { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for CpuOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = LaunchTemplateSpecification; + type Value = CpuOptions; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type LaunchTemplateSpecification") + write!(f, "a struct of type CpuOptions") } fn visit_map>(self, mut map: A) -> Result { - let mut launch_template_id: Option<::Value> = None; - let mut launch_template_name: Option<::Value> = None; - let mut version: Option<::Value> = None; + let mut core_count: Option<::Value> = None; + let mut threads_per_core: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "LaunchTemplateId" => { - launch_template_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "LaunchTemplateName" => { - launch_template_name = ::serde::de::MapAccess::next_value(&mut map)?; + "CoreCount" => { + core_count = ::serde::de::MapAccess::next_value(&mut map)?; } - "Version" => { - version = ::serde::de::MapAccess::next_value(&mut map)?; + "ThreadsPerCore" => { + threads_per_core = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(LaunchTemplateSpecification { - launch_template_id: launch_template_id, - launch_template_name: launch_template_name, - version: version.ok_or(::serde::de::Error::missing_field("Version"))?, + Ok(CpuOptions { + core_count: core_count, + threads_per_core: threads_per_core, }) } } @@ -11484,49 +15284,51 @@ pub mod instance { } } - /// The [`AWS::EC2::Instance.LicenseSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-licensespecification.html) property type. + /// The [`AWS::EC2::LaunchTemplate.CreditSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-creditspecification.html) property type. #[derive(Debug, Default)] - pub struct LicenseSpecification { - /// Property [`LicenseConfigurationArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-licensespecification.html#cfn-ec2-instance-licensespecification-licenseconfigurationarn). + pub struct CreditSpecification { + /// Property [`CpuCredits`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-creditspecification.html#cfn-ec2-launchtemplate-launchtemplatedata-creditspecification-cpucredits). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub license_configuration_arn: ::Value, + pub cpu_credits: Option<::Value>, } - impl ::codec::SerializeValue for LicenseSpecification { + impl ::codec::SerializeValue for CreditSpecification { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LicenseConfigurationArn", &self.license_configuration_arn)?; + if let Some(ref cpu_credits) = self.cpu_credits { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CpuCredits", cpu_credits)?; + } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for LicenseSpecification { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for CreditSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = LicenseSpecification; + type Value = CreditSpecification; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type LicenseSpecification") + write!(f, "a struct of type CreditSpecification") } fn visit_map>(self, mut map: A) -> Result { - let mut license_configuration_arn: Option<::Value> = None; + let mut cpu_credits: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "LicenseConfigurationArn" => { - license_configuration_arn = ::serde::de::MapAccess::next_value(&mut map)?; + "CpuCredits" => { + cpu_credits = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(LicenseSpecification { - license_configuration_arn: license_configuration_arn.ok_or(::serde::de::Error::missing_field("LicenseConfigurationArn"))?, + Ok(CreditSpecification { + cpu_credits: cpu_credits, }) } } @@ -11535,192 +15337,248 @@ pub mod instance { } } - /// The [`AWS::EC2::Instance.NetworkInterface`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html) property type. + /// The [`AWS::EC2::LaunchTemplate.Ebs`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping-ebs.html) property type. #[derive(Debug, Default)] - pub struct NetworkInterface { - /// Property [`AssociatePublicIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-associatepubip). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub associate_public_ip_address: Option<::Value>, - /// Property [`DeleteOnTermination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-delete). + pub struct Ebs { + /// Property [`DeleteOnTermination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping-ebs.html#cfn-ec2-launchtemplate-blockdevicemapping-ebs-deleteontermination). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub delete_on_termination: Option<::Value>, - /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-description). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub description: Option<::Value>, - /// Property [`DeviceIndex`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-deviceindex). + /// Property [`Encrypted`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping-ebs.html#cfn-ec2-launchtemplate-blockdevicemapping-ebs-encrypted). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub device_index: ::Value, - /// Property [`GroupSet`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-groupset). + pub encrypted: Option<::Value>, + /// Property [`Iops`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping-ebs.html#cfn-ec2-launchtemplate-blockdevicemapping-ebs-iops). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub group_set: Option<::ValueList>, - /// Property [`Ipv6AddressCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#cfn-ec2-instance-networkinterface-ipv6addresscount). + pub iops: Option<::Value>, + /// Property [`KmsKeyId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping-ebs.html#cfn-ec2-launchtemplate-blockdevicemapping-ebs-kmskeyid). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub ipv6_address_count: Option<::Value>, - /// Property [`Ipv6Addresses`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#cfn-ec2-instance-networkinterface-ipv6addresses). + pub kms_key_id: Option<::Value>, + /// Property [`SnapshotId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping-ebs.html#cfn-ec2-launchtemplate-blockdevicemapping-ebs-snapshotid). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub ipv6_addresses: Option<::ValueList>, - /// Property [`NetworkInterfaceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-network-iface). + pub snapshot_id: Option<::Value>, + /// Property [`Throughput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping-ebs.html#cfn-ec2-launchtemplate-blockdevicemapping-ebs-throughput). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub network_interface_id: Option<::Value>, - /// Property [`PrivateIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-privateipaddress). + pub throughput: Option<::Value>, + /// Property [`VolumeSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping-ebs.html#cfn-ec2-launchtemplate-blockdevicemapping-ebs-volumesize). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub private_ip_address: Option<::Value>, - /// Property [`PrivateIpAddresses`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-privateipaddresses). + pub volume_size: Option<::Value>, + /// Property [`VolumeType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping-ebs.html#cfn-ec2-launchtemplate-blockdevicemapping-ebs-volumetype). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub private_ip_addresses: Option<::ValueList>, - /// Property [`SecondaryPrivateIpAddressCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-secondprivateip). + pub volume_type: Option<::Value>, + } + + impl ::codec::SerializeValue for Ebs { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref delete_on_termination) = self.delete_on_termination { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeleteOnTermination", delete_on_termination)?; + } + if let Some(ref encrypted) = self.encrypted { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Encrypted", encrypted)?; + } + if let Some(ref iops) = self.iops { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Iops", iops)?; + } + if let Some(ref kms_key_id) = self.kms_key_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "KmsKeyId", kms_key_id)?; + } + if let Some(ref snapshot_id) = self.snapshot_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SnapshotId", snapshot_id)?; + } + if let Some(ref throughput) = self.throughput { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Throughput", throughput)?; + } + if let Some(ref volume_size) = self.volume_size { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VolumeSize", volume_size)?; + } + if let Some(ref volume_type) = self.volume_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VolumeType", volume_type)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Ebs { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Ebs; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Ebs") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut delete_on_termination: Option<::Value> = None; + let mut encrypted: Option<::Value> = None; + let mut iops: Option<::Value> = None; + let mut kms_key_id: Option<::Value> = None; + let mut snapshot_id: Option<::Value> = None; + let mut throughput: Option<::Value> = None; + let mut volume_size: Option<::Value> = None; + let mut volume_type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DeleteOnTermination" => { + delete_on_termination = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Encrypted" => { + encrypted = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Iops" => { + iops = ::serde::de::MapAccess::next_value(&mut map)?; + } + "KmsKeyId" => { + kms_key_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SnapshotId" => { + snapshot_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Throughput" => { + throughput = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VolumeSize" => { + volume_size = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VolumeType" => { + volume_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Ebs { + delete_on_termination: delete_on_termination, + encrypted: encrypted, + iops: iops, + kms_key_id: kms_key_id, + snapshot_id: snapshot_id, + throughput: throughput, + volume_size: volume_size, + volume_type: volume_type, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::LaunchTemplate.ElasticGpuSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-elasticgpuspecification.html) property type. + #[derive(Debug, Default)] + pub struct ElasticGpuSpecification { + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-elasticgpuspecification.html#cfn-ec2-launchtemplate-elasticgpuspecification-type). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub secondary_private_ip_address_count: Option<::Value>, - /// Property [`SubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-iface-embedded.html#aws-properties-ec2-network-iface-embedded-subnetid). + pub r#type: Option<::Value>, + } + + impl ::codec::SerializeValue for ElasticGpuSpecification { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref r#type) = self.r#type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", r#type)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ElasticGpuSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ElasticGpuSpecification; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ElasticGpuSpecification") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut r#type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ElasticGpuSpecification { + r#type: r#type, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::LaunchTemplate.EnclaveOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-enclaveoptions.html) property type. + #[derive(Debug, Default)] + pub struct EnclaveOptions { + /// Property [`Enabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-enclaveoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-enclaveoptions-enabled). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub subnet_id: Option<::Value>, + pub enabled: Option<::Value>, } - impl ::codec::SerializeValue for NetworkInterface { + impl ::codec::SerializeValue for EnclaveOptions { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref associate_public_ip_address) = self.associate_public_ip_address { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AssociatePublicIpAddress", associate_public_ip_address)?; - } - if let Some(ref delete_on_termination) = self.delete_on_termination { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeleteOnTermination", delete_on_termination)?; - } - if let Some(ref description) = self.description { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; - } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeviceIndex", &self.device_index)?; - if let Some(ref group_set) = self.group_set { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupSet", group_set)?; - } - if let Some(ref ipv6_address_count) = self.ipv6_address_count { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6AddressCount", ipv6_address_count)?; - } - if let Some(ref ipv6_addresses) = self.ipv6_addresses { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6Addresses", ipv6_addresses)?; - } - if let Some(ref network_interface_id) = self.network_interface_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaceId", network_interface_id)?; - } - if let Some(ref private_ip_address) = self.private_ip_address { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateIpAddress", private_ip_address)?; - } - if let Some(ref private_ip_addresses) = self.private_ip_addresses { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateIpAddresses", private_ip_addresses)?; - } - if let Some(ref secondary_private_ip_address_count) = self.secondary_private_ip_address_count { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecondaryPrivateIpAddressCount", secondary_private_ip_address_count)?; - } - if let Some(ref subnet_id) = self.subnet_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetId", subnet_id)?; + if let Some(ref enabled) = self.enabled { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Enabled", enabled)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for NetworkInterface { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for EnclaveOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = NetworkInterface; + type Value = EnclaveOptions; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type NetworkInterface") + write!(f, "a struct of type EnclaveOptions") } fn visit_map>(self, mut map: A) -> Result { - let mut associate_public_ip_address: Option<::Value> = None; - let mut delete_on_termination: Option<::Value> = None; - let mut description: Option<::Value> = None; - let mut device_index: Option<::Value> = None; - let mut group_set: Option<::ValueList> = None; - let mut ipv6_address_count: Option<::Value> = None; - let mut ipv6_addresses: Option<::ValueList> = None; - let mut network_interface_id: Option<::Value> = None; - let mut private_ip_address: Option<::Value> = None; - let mut private_ip_addresses: Option<::ValueList> = None; - let mut secondary_private_ip_address_count: Option<::Value> = None; - let mut subnet_id: Option<::Value> = None; + let mut enabled: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "AssociatePublicIpAddress" => { - associate_public_ip_address = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DeleteOnTermination" => { - delete_on_termination = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Description" => { - description = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DeviceIndex" => { - device_index = ::serde::de::MapAccess::next_value(&mut map)?; - } - "GroupSet" => { - group_set = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Ipv6AddressCount" => { - ipv6_address_count = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Ipv6Addresses" => { - ipv6_addresses = ::serde::de::MapAccess::next_value(&mut map)?; - } - "NetworkInterfaceId" => { - network_interface_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "PrivateIpAddress" => { - private_ip_address = ::serde::de::MapAccess::next_value(&mut map)?; - } - "PrivateIpAddresses" => { - private_ip_addresses = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SecondaryPrivateIpAddressCount" => { - secondary_private_ip_address_count = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SubnetId" => { - subnet_id = ::serde::de::MapAccess::next_value(&mut map)?; + "Enabled" => { + enabled = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(NetworkInterface { - associate_public_ip_address: associate_public_ip_address, - delete_on_termination: delete_on_termination, - description: description, - device_index: device_index.ok_or(::serde::de::Error::missing_field("DeviceIndex"))?, - group_set: group_set, - ipv6_address_count: ipv6_address_count, - ipv6_addresses: ipv6_addresses, - network_interface_id: network_interface_id, - private_ip_address: private_ip_address, - private_ip_addresses: private_ip_addresses, - secondary_private_ip_address_count: secondary_private_ip_address_count, - subnet_id: subnet_id, + Ok(EnclaveOptions { + enabled: enabled, }) } } @@ -11729,31 +15587,52 @@ pub mod instance { } } - /// The [`AWS::EC2::Instance.NoDevice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-nodevice.html) property type. + /// The [`AWS::EC2::LaunchTemplate.HibernationOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-hibernationoptions.html) property type. #[derive(Debug, Default)] - pub struct NoDevice { + pub struct HibernationOptions { + /// Property [`Configured`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-hibernationoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-hibernationoptions-configured). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub configured: Option<::Value>, } - impl ::codec::SerializeValue for NoDevice { + impl ::codec::SerializeValue for HibernationOptions { fn serialize(&self, s: S) -> Result { - let map = ::serde::Serializer::serialize_map(s, None)?; + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref configured) = self.configured { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Configured", configured)?; + } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for NoDevice { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for HibernationOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = NoDevice; + type Value = HibernationOptions; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type NoDevice") + write!(f, "a struct of type HibernationOptions") } - fn visit_map>(self, _map: A) -> Result { - Ok(NoDevice {}) + fn visit_map>(self, mut map: A) -> Result { + let mut configured: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Configured" => { + configured = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(HibernationOptions { + configured: configured, + }) } } @@ -11761,60 +15640,64 @@ pub mod instance { } } - /// The [`AWS::EC2::Instance.PrivateIpAddressSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-interface-privateipspec.html) property type. + /// The [`AWS::EC2::LaunchTemplate.IamInstanceProfile`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-iaminstanceprofile.html) property type. #[derive(Debug, Default)] - pub struct PrivateIpAddressSpecification { - /// Property [`Primary`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-interface-privateipspec.html#cfn-ec2-networkinterface-privateipspecification-primary). + pub struct IamInstanceProfile { + /// Property [`Arn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-iaminstanceprofile.html#cfn-ec2-launchtemplate-launchtemplatedata-iaminstanceprofile-arn). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub primary: ::Value, - /// Property [`PrivateIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-interface-privateipspec.html#cfn-ec2-networkinterface-privateipspecification-privateipaddress). + pub arn: Option<::Value>, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-iaminstanceprofile.html#cfn-ec2-launchtemplate-launchtemplatedata-iaminstanceprofile-name). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub private_ip_address: ::Value, + pub name: Option<::Value>, } - impl ::codec::SerializeValue for PrivateIpAddressSpecification { + impl ::codec::SerializeValue for IamInstanceProfile { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Primary", &self.primary)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateIpAddress", &self.private_ip_address)?; + if let Some(ref arn) = self.arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Arn", arn)?; + } + if let Some(ref name) = self.name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; + } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for PrivateIpAddressSpecification { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for IamInstanceProfile { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = PrivateIpAddressSpecification; + type Value = IamInstanceProfile; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type PrivateIpAddressSpecification") + write!(f, "a struct of type IamInstanceProfile") } fn visit_map>(self, mut map: A) -> Result { - let mut primary: Option<::Value> = None; - let mut private_ip_address: Option<::Value> = None; + let mut arn: Option<::Value> = None; + let mut name: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Primary" => { - primary = ::serde::de::MapAccess::next_value(&mut map)?; + "Arn" => { + arn = ::serde::de::MapAccess::next_value(&mut map)?; } - "PrivateIpAddress" => { - private_ip_address = ::serde::de::MapAccess::next_value(&mut map)?; + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(PrivateIpAddressSpecification { - primary: primary.ok_or(::serde::de::Error::missing_field("Primary"))?, - private_ip_address: private_ip_address.ok_or(::serde::de::Error::missing_field("PrivateIpAddress"))?, + Ok(IamInstanceProfile { + arn: arn, + name: name, }) } } @@ -11823,62 +15706,64 @@ pub mod instance { } } - /// The [`AWS::EC2::Instance.SsmAssociation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-ssmassociations.html) property type. + /// The [`AWS::EC2::LaunchTemplate.InstanceMarketOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancemarketoptions.html) property type. #[derive(Debug, Default)] - pub struct SsmAssociation { - /// Property [`AssociationParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-ssmassociations.html#cfn-ec2-instance-ssmassociations-associationparameters). + pub struct InstanceMarketOptions { + /// Property [`MarketType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancemarketoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-markettype). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub association_parameters: Option<::ValueList>, - /// Property [`DocumentName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance-ssmassociations.html#cfn-ec2-instance-ssmassociations-documentname). + pub market_type: Option<::Value>, + /// Property [`SpotOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancemarketoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub document_name: ::Value, + pub spot_options: Option<::Value>, } - impl ::codec::SerializeValue for SsmAssociation { + impl ::codec::SerializeValue for InstanceMarketOptions { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref association_parameters) = self.association_parameters { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AssociationParameters", association_parameters)?; + if let Some(ref market_type) = self.market_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MarketType", market_type)?; + } + if let Some(ref spot_options) = self.spot_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpotOptions", spot_options)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentName", &self.document_name)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for SsmAssociation { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for InstanceMarketOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = SsmAssociation; + type Value = InstanceMarketOptions; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type SsmAssociation") + write!(f, "a struct of type InstanceMarketOptions") } fn visit_map>(self, mut map: A) -> Result { - let mut association_parameters: Option<::ValueList> = None; - let mut document_name: Option<::Value> = None; + let mut market_type: Option<::Value> = None; + let mut spot_options: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "AssociationParameters" => { - association_parameters = ::serde::de::MapAccess::next_value(&mut map)?; + "MarketType" => { + market_type = ::serde::de::MapAccess::next_value(&mut map)?; } - "DocumentName" => { - document_name = ::serde::de::MapAccess::next_value(&mut map)?; + "SpotOptions" => { + spot_options = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(SsmAssociation { - association_parameters: association_parameters, - document_name: document_name.ok_or(::serde::de::Error::missing_field("DocumentName"))?, + Ok(InstanceMarketOptions { + market_type: market_type, + spot_options: spot_options, }) } } @@ -11887,60 +15772,311 @@ pub mod instance { } } - /// The [`AWS::EC2::Instance.Volume`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-mount-point.html) property type. + /// The [`AWS::EC2::LaunchTemplate.InstanceRequirements`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancerequirements.html) property type. #[derive(Debug, Default)] - pub struct Volume { - /// Property [`Device`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-mount-point.html#cfn-ec2-mountpoint-device). + pub struct InstanceRequirements { + /// Property [`AcceleratorCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancerequirements.html#cfn-ec2-launchtemplate-launchtemplatedata-instancerequirements-acceleratorcount). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub device: ::Value, - /// Property [`VolumeId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-mount-point.html#cfn-ec2-mountpoint-volumeid). + pub accelerator_count: Option<::Value>, + /// Property [`AcceleratorManufacturers`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancerequirements.html#cfn-ec2-launchtemplate-launchtemplatedata-instancerequirements-acceleratormanufacturers). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub volume_id: ::Value, + pub accelerator_manufacturers: Option<::ValueList>, + /// Property [`AcceleratorNames`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancerequirements.html#cfn-ec2-launchtemplate-launchtemplatedata-instancerequirements-acceleratornames). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub accelerator_names: Option<::ValueList>, + /// Property [`AcceleratorTotalMemoryMiB`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancerequirements.html#cfn-ec2-launchtemplate-launchtemplatedata-instancerequirements-acceleratortotalmemorymib). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub accelerator_total_memory_mi_b: Option<::Value>, + /// Property [`AcceleratorTypes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancerequirements.html#cfn-ec2-launchtemplate-launchtemplatedata-instancerequirements-acceleratortypes). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub accelerator_types: Option<::ValueList>, + /// Property [`BareMetal`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancerequirements.html#cfn-ec2-launchtemplate-launchtemplatedata-instancerequirements-baremetal). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub bare_metal: Option<::Value>, + /// Property [`BaselineEbsBandwidthMbps`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancerequirements.html#cfn-ec2-launchtemplate-launchtemplatedata-instancerequirements-baselineebsbandwidthmbps). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub baseline_ebs_bandwidth_mbps: Option<::Value>, + /// Property [`BurstablePerformance`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancerequirements.html#cfn-ec2-launchtemplate-launchtemplatedata-instancerequirements-burstableperformance). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub burstable_performance: Option<::Value>, + /// Property [`CpuManufacturers`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancerequirements.html#cfn-ec2-launchtemplate-launchtemplatedata-instancerequirements-cpumanufacturers). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub cpu_manufacturers: Option<::ValueList>, + /// Property [`ExcludedInstanceTypes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancerequirements.html#cfn-ec2-launchtemplate-launchtemplatedata-instancerequirements-excludedinstancetypes). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub excluded_instance_types: Option<::ValueList>, + /// Property [`InstanceGenerations`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancerequirements.html#cfn-ec2-launchtemplate-launchtemplatedata-instancerequirements-instancegenerations). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub instance_generations: Option<::ValueList>, + /// Property [`LocalStorage`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancerequirements.html#cfn-ec2-launchtemplate-launchtemplatedata-instancerequirements-localstorage). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub local_storage: Option<::Value>, + /// Property [`LocalStorageTypes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancerequirements.html#cfn-ec2-launchtemplate-launchtemplatedata-instancerequirements-localstoragetypes). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub local_storage_types: Option<::ValueList>, + /// Property [`MemoryGiBPerVCpu`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancerequirements.html#cfn-ec2-launchtemplate-launchtemplatedata-instancerequirements-memorygibpervcpu). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub memory_gi_b_per_v_cpu: Option<::Value>, + /// Property [`MemoryMiB`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancerequirements.html#cfn-ec2-launchtemplate-launchtemplatedata-instancerequirements-memorymib). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub memory_mi_b: Option<::Value>, + /// Property [`NetworkInterfaceCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancerequirements.html#cfn-ec2-launchtemplate-launchtemplatedata-instancerequirements-networkinterfacecount). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub network_interface_count: Option<::Value>, + /// Property [`OnDemandMaxPricePercentageOverLowestPrice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancerequirements.html#cfn-ec2-launchtemplate-launchtemplatedata-instancerequirements-ondemandmaxpricepercentageoverlowestprice). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub on_demand_max_price_percentage_over_lowest_price: Option<::Value>, + /// Property [`RequireHibernateSupport`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancerequirements.html#cfn-ec2-launchtemplate-launchtemplatedata-instancerequirements-requirehibernatesupport). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub require_hibernate_support: Option<::Value>, + /// Property [`SpotMaxPricePercentageOverLowestPrice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancerequirements.html#cfn-ec2-launchtemplate-launchtemplatedata-instancerequirements-spotmaxpricepercentageoverlowestprice). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub spot_max_price_percentage_over_lowest_price: Option<::Value>, + /// Property [`TotalLocalStorageGB`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancerequirements.html#cfn-ec2-launchtemplate-launchtemplatedata-instancerequirements-totallocalstoragegb). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub total_local_storage_gb: Option<::Value>, + /// Property [`VCpuCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancerequirements.html#cfn-ec2-launchtemplate-launchtemplatedata-instancerequirements-vcpucount). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub v_cpu_count: Option<::Value>, } - impl ::codec::SerializeValue for Volume { + impl ::codec::SerializeValue for InstanceRequirements { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Device", &self.device)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VolumeId", &self.volume_id)?; + if let Some(ref accelerator_count) = self.accelerator_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcceleratorCount", accelerator_count)?; + } + if let Some(ref accelerator_manufacturers) = self.accelerator_manufacturers { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcceleratorManufacturers", accelerator_manufacturers)?; + } + if let Some(ref accelerator_names) = self.accelerator_names { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcceleratorNames", accelerator_names)?; + } + if let Some(ref accelerator_total_memory_mi_b) = self.accelerator_total_memory_mi_b { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcceleratorTotalMemoryMiB", accelerator_total_memory_mi_b)?; + } + if let Some(ref accelerator_types) = self.accelerator_types { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcceleratorTypes", accelerator_types)?; + } + if let Some(ref bare_metal) = self.bare_metal { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BareMetal", bare_metal)?; + } + if let Some(ref baseline_ebs_bandwidth_mbps) = self.baseline_ebs_bandwidth_mbps { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BaselineEbsBandwidthMbps", baseline_ebs_bandwidth_mbps)?; + } + if let Some(ref burstable_performance) = self.burstable_performance { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BurstablePerformance", burstable_performance)?; + } + if let Some(ref cpu_manufacturers) = self.cpu_manufacturers { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CpuManufacturers", cpu_manufacturers)?; + } + if let Some(ref excluded_instance_types) = self.excluded_instance_types { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExcludedInstanceTypes", excluded_instance_types)?; + } + if let Some(ref instance_generations) = self.instance_generations { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceGenerations", instance_generations)?; + } + if let Some(ref local_storage) = self.local_storage { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LocalStorage", local_storage)?; + } + if let Some(ref local_storage_types) = self.local_storage_types { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LocalStorageTypes", local_storage_types)?; + } + if let Some(ref memory_gi_b_per_v_cpu) = self.memory_gi_b_per_v_cpu { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MemoryGiBPerVCpu", memory_gi_b_per_v_cpu)?; + } + if let Some(ref memory_mi_b) = self.memory_mi_b { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MemoryMiB", memory_mi_b)?; + } + if let Some(ref network_interface_count) = self.network_interface_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaceCount", network_interface_count)?; + } + if let Some(ref on_demand_max_price_percentage_over_lowest_price) = self.on_demand_max_price_percentage_over_lowest_price { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OnDemandMaxPricePercentageOverLowestPrice", on_demand_max_price_percentage_over_lowest_price)?; + } + if let Some(ref require_hibernate_support) = self.require_hibernate_support { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RequireHibernateSupport", require_hibernate_support)?; + } + if let Some(ref spot_max_price_percentage_over_lowest_price) = self.spot_max_price_percentage_over_lowest_price { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpotMaxPricePercentageOverLowestPrice", spot_max_price_percentage_over_lowest_price)?; + } + if let Some(ref total_local_storage_gb) = self.total_local_storage_gb { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TotalLocalStorageGB", total_local_storage_gb)?; + } + if let Some(ref v_cpu_count) = self.v_cpu_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VCpuCount", v_cpu_count)?; + } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for Volume { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for InstanceRequirements { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = Volume; + type Value = InstanceRequirements; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type Volume") + write!(f, "a struct of type InstanceRequirements") } fn visit_map>(self, mut map: A) -> Result { - let mut device: Option<::Value> = None; - let mut volume_id: Option<::Value> = None; + let mut accelerator_count: Option<::Value> = None; + let mut accelerator_manufacturers: Option<::ValueList> = None; + let mut accelerator_names: Option<::ValueList> = None; + let mut accelerator_total_memory_mi_b: Option<::Value> = None; + let mut accelerator_types: Option<::ValueList> = None; + let mut bare_metal: Option<::Value> = None; + let mut baseline_ebs_bandwidth_mbps: Option<::Value> = None; + let mut burstable_performance: Option<::Value> = None; + let mut cpu_manufacturers: Option<::ValueList> = None; + let mut excluded_instance_types: Option<::ValueList> = None; + let mut instance_generations: Option<::ValueList> = None; + let mut local_storage: Option<::Value> = None; + let mut local_storage_types: Option<::ValueList> = None; + let mut memory_gi_b_per_v_cpu: Option<::Value> = None; + let mut memory_mi_b: Option<::Value> = None; + let mut network_interface_count: Option<::Value> = None; + let mut on_demand_max_price_percentage_over_lowest_price: Option<::Value> = None; + let mut require_hibernate_support: Option<::Value> = None; + let mut spot_max_price_percentage_over_lowest_price: Option<::Value> = None; + let mut total_local_storage_gb: Option<::Value> = None; + let mut v_cpu_count: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Device" => { - device = ::serde::de::MapAccess::next_value(&mut map)?; + "AcceleratorCount" => { + accelerator_count = ::serde::de::MapAccess::next_value(&mut map)?; } - "VolumeId" => { - volume_id = ::serde::de::MapAccess::next_value(&mut map)?; + "AcceleratorManufacturers" => { + accelerator_manufacturers = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AcceleratorNames" => { + accelerator_names = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AcceleratorTotalMemoryMiB" => { + accelerator_total_memory_mi_b = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AcceleratorTypes" => { + accelerator_types = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BareMetal" => { + bare_metal = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BaselineEbsBandwidthMbps" => { + baseline_ebs_bandwidth_mbps = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BurstablePerformance" => { + burstable_performance = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CpuManufacturers" => { + cpu_manufacturers = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ExcludedInstanceTypes" => { + excluded_instance_types = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceGenerations" => { + instance_generations = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LocalStorage" => { + local_storage = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LocalStorageTypes" => { + local_storage_types = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MemoryGiBPerVCpu" => { + memory_gi_b_per_v_cpu = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MemoryMiB" => { + memory_mi_b = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NetworkInterfaceCount" => { + network_interface_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OnDemandMaxPricePercentageOverLowestPrice" => { + on_demand_max_price_percentage_over_lowest_price = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RequireHibernateSupport" => { + require_hibernate_support = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SpotMaxPricePercentageOverLowestPrice" => { + spot_max_price_percentage_over_lowest_price = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TotalLocalStorageGB" => { + total_local_storage_gb = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VCpuCount" => { + v_cpu_count = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(Volume { - device: device.ok_or(::serde::de::Error::missing_field("Device"))?, - volume_id: volume_id.ok_or(::serde::de::Error::missing_field("VolumeId"))?, + Ok(InstanceRequirements { + accelerator_count: accelerator_count, + accelerator_manufacturers: accelerator_manufacturers, + accelerator_names: accelerator_names, + accelerator_total_memory_mi_b: accelerator_total_memory_mi_b, + accelerator_types: accelerator_types, + bare_metal: bare_metal, + baseline_ebs_bandwidth_mbps: baseline_ebs_bandwidth_mbps, + burstable_performance: burstable_performance, + cpu_manufacturers: cpu_manufacturers, + excluded_instance_types: excluded_instance_types, + instance_generations: instance_generations, + local_storage: local_storage, + local_storage_types: local_storage_types, + memory_gi_b_per_v_cpu: memory_gi_b_per_v_cpu, + memory_mi_b: memory_mi_b, + network_interface_count: network_interface_count, + on_demand_max_price_percentage_over_lowest_price: on_demand_max_price_percentage_over_lowest_price, + require_hibernate_support: require_hibernate_support, + spot_max_price_percentage_over_lowest_price: spot_max_price_percentage_over_lowest_price, + total_local_storage_gb: total_local_storage_gb, + v_cpu_count: v_cpu_count, }) } } @@ -11948,95 +16084,52 @@ pub mod instance { d.deserialize_map(Visitor) } } -} - -pub mod launch_template { - //! Property types for the `LaunchTemplate` resource. - /// The [`AWS::EC2::LaunchTemplate.BlockDeviceMapping`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping.html) property type. + /// The [`AWS::EC2::LaunchTemplate.Ipv4PrefixSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ipv4prefixspecification.html) property type. #[derive(Debug, Default)] - pub struct BlockDeviceMapping { - /// Property [`DeviceName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping.html#cfn-ec2-launchtemplate-blockdevicemapping-devicename). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub device_name: Option<::Value>, - /// Property [`Ebs`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping.html#cfn-ec2-launchtemplate-blockdevicemapping-ebs). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub ebs: Option<::Value>, - /// Property [`NoDevice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping.html#cfn-ec2-launchtemplate-blockdevicemapping-nodevice). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub no_device: Option<::Value>, - /// Property [`VirtualName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping.html#cfn-ec2-launchtemplate-blockdevicemapping-virtualname). + pub struct Ipv4PrefixSpecification { + /// Property [`Ipv4Prefix`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ipv4prefixspecification.html#cfn-ec2-launchtemplate-ipv4prefixspecification-ipv4prefix). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub virtual_name: Option<::Value>, + pub ipv4_prefix: Option<::Value>, } - impl ::codec::SerializeValue for BlockDeviceMapping { + impl ::codec::SerializeValue for Ipv4PrefixSpecification { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref device_name) = self.device_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeviceName", device_name)?; - } - if let Some(ref ebs) = self.ebs { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ebs", ebs)?; - } - if let Some(ref no_device) = self.no_device { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NoDevice", no_device)?; - } - if let Some(ref virtual_name) = self.virtual_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VirtualName", virtual_name)?; + if let Some(ref ipv4_prefix) = self.ipv4_prefix { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv4Prefix", ipv4_prefix)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for BlockDeviceMapping { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for Ipv4PrefixSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = BlockDeviceMapping; + type Value = Ipv4PrefixSpecification; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type BlockDeviceMapping") + write!(f, "a struct of type Ipv4PrefixSpecification") } fn visit_map>(self, mut map: A) -> Result { - let mut device_name: Option<::Value> = None; - let mut ebs: Option<::Value> = None; - let mut no_device: Option<::Value> = None; - let mut virtual_name: Option<::Value> = None; + let mut ipv4_prefix: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "DeviceName" => { - device_name = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Ebs" => { - ebs = ::serde::de::MapAccess::next_value(&mut map)?; - } - "NoDevice" => { - no_device = ::serde::de::MapAccess::next_value(&mut map)?; - } - "VirtualName" => { - virtual_name = ::serde::de::MapAccess::next_value(&mut map)?; + "Ipv4Prefix" => { + ipv4_prefix = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(BlockDeviceMapping { - device_name: device_name, - ebs: ebs, - no_device: no_device, - virtual_name: virtual_name, + Ok(Ipv4PrefixSpecification { + ipv4_prefix: ipv4_prefix, }) } } @@ -12045,64 +16138,51 @@ pub mod launch_template { } } - /// The [`AWS::EC2::LaunchTemplate.CapacityReservationSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-capacityreservationspecification.html) property type. + /// The [`AWS::EC2::LaunchTemplate.Ipv6Add`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ipv6add.html) property type. #[derive(Debug, Default)] - pub struct CapacityReservationSpecification { - /// Property [`CapacityReservationPreference`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-capacityreservationspecification.html#cfn-ec2-launchtemplate-launchtemplatedata-capacityreservationspecification-capacityreservationpreference). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub capacity_reservation_preference: Option<::Value>, - /// Property [`CapacityReservationTarget`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-capacityreservationspecification.html#cfn-ec2-launchtemplate-launchtemplatedata-capacityreservationspecification-capacityreservationtarget). + pub struct Ipv6Add { + /// Property [`Ipv6Address`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ipv6add.html#cfn-ec2-launchtemplate-ipv6add-ipv6address). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub capacity_reservation_target: Option<::Value>, + pub ipv6_address: Option<::Value>, } - impl ::codec::SerializeValue for CapacityReservationSpecification { + impl ::codec::SerializeValue for Ipv6Add { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref capacity_reservation_preference) = self.capacity_reservation_preference { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CapacityReservationPreference", capacity_reservation_preference)?; - } - if let Some(ref capacity_reservation_target) = self.capacity_reservation_target { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CapacityReservationTarget", capacity_reservation_target)?; + if let Some(ref ipv6_address) = self.ipv6_address { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6Address", ipv6_address)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for CapacityReservationSpecification { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for Ipv6Add { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = CapacityReservationSpecification; + type Value = Ipv6Add; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type CapacityReservationSpecification") + write!(f, "a struct of type Ipv6Add") } fn visit_map>(self, mut map: A) -> Result { - let mut capacity_reservation_preference: Option<::Value> = None; - let mut capacity_reservation_target: Option<::Value> = None; - - while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { - match __cfn_key.as_ref() { - "CapacityReservationPreference" => { - capacity_reservation_preference = ::serde::de::MapAccess::next_value(&mut map)?; - } - "CapacityReservationTarget" => { - capacity_reservation_target = ::serde::de::MapAccess::next_value(&mut map)?; + let mut ipv6_address: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Ipv6Address" => { + ipv6_address = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(CapacityReservationSpecification { - capacity_reservation_preference: capacity_reservation_preference, - capacity_reservation_target: capacity_reservation_target, + Ok(Ipv6Add { + ipv6_address: ipv6_address, }) } } @@ -12111,64 +16191,51 @@ pub mod launch_template { } } - /// The [`AWS::EC2::LaunchTemplate.CapacityReservationTarget`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-capacityreservationtarget.html) property type. + /// The [`AWS::EC2::LaunchTemplate.Ipv6PrefixSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ipv6prefixspecification.html) property type. #[derive(Debug, Default)] - pub struct CapacityReservationTarget { - /// Property [`CapacityReservationId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-capacityreservationtarget.html#cfn-ec2-launchtemplate-capacityreservationtarget-capacityreservationid). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub capacity_reservation_id: Option<::Value>, - /// Property [`CapacityReservationResourceGroupArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-capacityreservationtarget.html#cfn-ec2-launchtemplate-capacityreservationtarget-capacityreservationresourcegrouparn). + pub struct Ipv6PrefixSpecification { + /// Property [`Ipv6Prefix`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ipv6prefixspecification.html#cfn-ec2-launchtemplate-ipv6prefixspecification-ipv6prefix). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub capacity_reservation_resource_group_arn: Option<::Value>, + pub ipv6_prefix: Option<::Value>, } - impl ::codec::SerializeValue for CapacityReservationTarget { + impl ::codec::SerializeValue for Ipv6PrefixSpecification { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref capacity_reservation_id) = self.capacity_reservation_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CapacityReservationId", capacity_reservation_id)?; - } - if let Some(ref capacity_reservation_resource_group_arn) = self.capacity_reservation_resource_group_arn { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CapacityReservationResourceGroupArn", capacity_reservation_resource_group_arn)?; + if let Some(ref ipv6_prefix) = self.ipv6_prefix { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6Prefix", ipv6_prefix)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for CapacityReservationTarget { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for Ipv6PrefixSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = CapacityReservationTarget; + type Value = Ipv6PrefixSpecification; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type CapacityReservationTarget") + write!(f, "a struct of type Ipv6PrefixSpecification") } fn visit_map>(self, mut map: A) -> Result { - let mut capacity_reservation_id: Option<::Value> = None; - let mut capacity_reservation_resource_group_arn: Option<::Value> = None; + let mut ipv6_prefix: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "CapacityReservationId" => { - capacity_reservation_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "CapacityReservationResourceGroupArn" => { - capacity_reservation_resource_group_arn = ::serde::de::MapAccess::next_value(&mut map)?; + "Ipv6Prefix" => { + ipv6_prefix = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(CapacityReservationTarget { - capacity_reservation_id: capacity_reservation_id, - capacity_reservation_resource_group_arn: capacity_reservation_resource_group_arn, + Ok(Ipv6PrefixSpecification { + ipv6_prefix: ipv6_prefix, }) } } @@ -12177,64 +16244,428 @@ pub mod launch_template { } } - /// The [`AWS::EC2::LaunchTemplate.CpuOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-cpuoptions.html) property type. + /// The [`AWS::EC2::LaunchTemplate.LaunchTemplateData`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html) property type. #[derive(Debug, Default)] - pub struct CpuOptions { - /// Property [`CoreCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-cpuoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-cpuoptions-corecount). + pub struct LaunchTemplateData { + /// Property [`BlockDeviceMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-blockdevicemappings). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub core_count: Option<::Value>, - /// Property [`ThreadsPerCore`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-cpuoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-cpuoptions-threadspercore). + pub block_device_mappings: Option<::ValueList>, + /// Property [`CapacityReservationSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-capacityreservationspecification). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub threads_per_core: Option<::Value>, + pub capacity_reservation_specification: Option<::Value>, + /// Property [`CpuOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-cpuoptions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub cpu_options: Option<::Value>, + /// Property [`CreditSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-creditspecification). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub credit_specification: Option<::Value>, + /// Property [`DisableApiTermination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-disableapitermination). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub disable_api_termination: Option<::Value>, + /// Property [`EbsOptimized`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-ebsoptimized). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ebs_optimized: Option<::Value>, + /// Property [`ElasticGpuSpecifications`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-elasticgpuspecifications). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub elastic_gpu_specifications: Option<::ValueList>, + /// Property [`ElasticInferenceAccelerators`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-elasticinferenceaccelerators). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub elastic_inference_accelerators: Option<::ValueList>, + /// Property [`EnclaveOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-enclaveoptions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enclave_options: Option<::Value>, + /// Property [`HibernationOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-hibernationoptions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub hibernation_options: Option<::Value>, + /// Property [`IamInstanceProfile`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-iaminstanceprofile). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub iam_instance_profile: Option<::Value>, + /// Property [`ImageId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-imageid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub image_id: Option<::Value>, + /// Property [`InstanceInitiatedShutdownBehavior`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-instanceinitiatedshutdownbehavior). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub instance_initiated_shutdown_behavior: Option<::Value>, + /// Property [`InstanceMarketOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-instancemarketoptions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub instance_market_options: Option<::Value>, + /// Property [`InstanceRequirements`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-instancerequirements). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub instance_requirements: Option<::Value>, + /// Property [`InstanceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-instancetype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub instance_type: Option<::Value>, + /// Property [`KernelId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-kernelid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub kernel_id: Option<::Value>, + /// Property [`KeyName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-keyname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub key_name: Option<::Value>, + /// Property [`LicenseSpecifications`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-licensespecifications). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub license_specifications: Option<::ValueList>, + /// Property [`MaintenanceOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-maintenanceoptions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub maintenance_options: Option<::Value>, + /// Property [`MetadataOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-metadataoptions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub metadata_options: Option<::Value>, + /// Property [`Monitoring`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-monitoring). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub monitoring: Option<::Value>, + /// Property [`NetworkInterfaces`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-networkinterfaces). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub network_interfaces: Option<::ValueList>, + /// Property [`Placement`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-placement). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub placement: Option<::Value>, + /// Property [`PrivateDnsNameOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-privatednsnameoptions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub private_dns_name_options: Option<::Value>, + /// Property [`RamDiskId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-ramdiskid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ram_disk_id: Option<::Value>, + /// Property [`SecurityGroupIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-securitygroupids). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub security_group_ids: Option<::ValueList>, + /// Property [`SecurityGroups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-securitygroups). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub security_groups: Option<::ValueList>, + /// Property [`TagSpecifications`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-tagspecifications). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tag_specifications: Option<::ValueList>, + /// Property [`UserData`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-userdata). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub user_data: Option<::Value>, } - impl ::codec::SerializeValue for CpuOptions { + impl ::codec::SerializeValue for LaunchTemplateData { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref core_count) = self.core_count { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CoreCount", core_count)?; + if let Some(ref block_device_mappings) = self.block_device_mappings { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BlockDeviceMappings", block_device_mappings)?; + } + if let Some(ref capacity_reservation_specification) = self.capacity_reservation_specification { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CapacityReservationSpecification", capacity_reservation_specification)?; + } + if let Some(ref cpu_options) = self.cpu_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CpuOptions", cpu_options)?; + } + if let Some(ref credit_specification) = self.credit_specification { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CreditSpecification", credit_specification)?; + } + if let Some(ref disable_api_termination) = self.disable_api_termination { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DisableApiTermination", disable_api_termination)?; + } + if let Some(ref ebs_optimized) = self.ebs_optimized { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EbsOptimized", ebs_optimized)?; + } + if let Some(ref elastic_gpu_specifications) = self.elastic_gpu_specifications { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ElasticGpuSpecifications", elastic_gpu_specifications)?; + } + if let Some(ref elastic_inference_accelerators) = self.elastic_inference_accelerators { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ElasticInferenceAccelerators", elastic_inference_accelerators)?; + } + if let Some(ref enclave_options) = self.enclave_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EnclaveOptions", enclave_options)?; + } + if let Some(ref hibernation_options) = self.hibernation_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HibernationOptions", hibernation_options)?; + } + if let Some(ref iam_instance_profile) = self.iam_instance_profile { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IamInstanceProfile", iam_instance_profile)?; + } + if let Some(ref image_id) = self.image_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ImageId", image_id)?; + } + if let Some(ref instance_initiated_shutdown_behavior) = self.instance_initiated_shutdown_behavior { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceInitiatedShutdownBehavior", instance_initiated_shutdown_behavior)?; + } + if let Some(ref instance_market_options) = self.instance_market_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceMarketOptions", instance_market_options)?; + } + if let Some(ref instance_requirements) = self.instance_requirements { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceRequirements", instance_requirements)?; + } + if let Some(ref instance_type) = self.instance_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceType", instance_type)?; + } + if let Some(ref kernel_id) = self.kernel_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "KernelId", kernel_id)?; + } + if let Some(ref key_name) = self.key_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "KeyName", key_name)?; + } + if let Some(ref license_specifications) = self.license_specifications { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LicenseSpecifications", license_specifications)?; + } + if let Some(ref maintenance_options) = self.maintenance_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaintenanceOptions", maintenance_options)?; + } + if let Some(ref metadata_options) = self.metadata_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MetadataOptions", metadata_options)?; + } + if let Some(ref monitoring) = self.monitoring { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Monitoring", monitoring)?; + } + if let Some(ref network_interfaces) = self.network_interfaces { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaces", network_interfaces)?; + } + if let Some(ref placement) = self.placement { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Placement", placement)?; } - if let Some(ref threads_per_core) = self.threads_per_core { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ThreadsPerCore", threads_per_core)?; + if let Some(ref private_dns_name_options) = self.private_dns_name_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateDnsNameOptions", private_dns_name_options)?; + } + if let Some(ref ram_disk_id) = self.ram_disk_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RamDiskId", ram_disk_id)?; + } + if let Some(ref security_group_ids) = self.security_group_ids { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityGroupIds", security_group_ids)?; + } + if let Some(ref security_groups) = self.security_groups { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityGroups", security_groups)?; + } + if let Some(ref tag_specifications) = self.tag_specifications { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TagSpecifications", tag_specifications)?; + } + if let Some(ref user_data) = self.user_data { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UserData", user_data)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for CpuOptions { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for LaunchTemplateData { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = CpuOptions; + type Value = LaunchTemplateData; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type CpuOptions") + write!(f, "a struct of type LaunchTemplateData") } fn visit_map>(self, mut map: A) -> Result { - let mut core_count: Option<::Value> = None; - let mut threads_per_core: Option<::Value> = None; + let mut block_device_mappings: Option<::ValueList> = None; + let mut capacity_reservation_specification: Option<::Value> = None; + let mut cpu_options: Option<::Value> = None; + let mut credit_specification: Option<::Value> = None; + let mut disable_api_termination: Option<::Value> = None; + let mut ebs_optimized: Option<::Value> = None; + let mut elastic_gpu_specifications: Option<::ValueList> = None; + let mut elastic_inference_accelerators: Option<::ValueList> = None; + let mut enclave_options: Option<::Value> = None; + let mut hibernation_options: Option<::Value> = None; + let mut iam_instance_profile: Option<::Value> = None; + let mut image_id: Option<::Value> = None; + let mut instance_initiated_shutdown_behavior: Option<::Value> = None; + let mut instance_market_options: Option<::Value> = None; + let mut instance_requirements: Option<::Value> = None; + let mut instance_type: Option<::Value> = None; + let mut kernel_id: Option<::Value> = None; + let mut key_name: Option<::Value> = None; + let mut license_specifications: Option<::ValueList> = None; + let mut maintenance_options: Option<::Value> = None; + let mut metadata_options: Option<::Value> = None; + let mut monitoring: Option<::Value> = None; + let mut network_interfaces: Option<::ValueList> = None; + let mut placement: Option<::Value> = None; + let mut private_dns_name_options: Option<::Value> = None; + let mut ram_disk_id: Option<::Value> = None; + let mut security_group_ids: Option<::ValueList> = None; + let mut security_groups: Option<::ValueList> = None; + let mut tag_specifications: Option<::ValueList> = None; + let mut user_data: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "CoreCount" => { - core_count = ::serde::de::MapAccess::next_value(&mut map)?; + "BlockDeviceMappings" => { + block_device_mappings = ::serde::de::MapAccess::next_value(&mut map)?; } - "ThreadsPerCore" => { - threads_per_core = ::serde::de::MapAccess::next_value(&mut map)?; + "CapacityReservationSpecification" => { + capacity_reservation_specification = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CpuOptions" => { + cpu_options = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CreditSpecification" => { + credit_specification = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DisableApiTermination" => { + disable_api_termination = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EbsOptimized" => { + ebs_optimized = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ElasticGpuSpecifications" => { + elastic_gpu_specifications = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ElasticInferenceAccelerators" => { + elastic_inference_accelerators = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EnclaveOptions" => { + enclave_options = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HibernationOptions" => { + hibernation_options = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IamInstanceProfile" => { + iam_instance_profile = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ImageId" => { + image_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceInitiatedShutdownBehavior" => { + instance_initiated_shutdown_behavior = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceMarketOptions" => { + instance_market_options = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceRequirements" => { + instance_requirements = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceType" => { + instance_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "KernelId" => { + kernel_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "KeyName" => { + key_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LicenseSpecifications" => { + license_specifications = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MaintenanceOptions" => { + maintenance_options = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MetadataOptions" => { + metadata_options = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Monitoring" => { + monitoring = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NetworkInterfaces" => { + network_interfaces = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Placement" => { + placement = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PrivateDnsNameOptions" => { + private_dns_name_options = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RamDiskId" => { + ram_disk_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SecurityGroupIds" => { + security_group_ids = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SecurityGroups" => { + security_groups = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TagSpecifications" => { + tag_specifications = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UserData" => { + user_data = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(CpuOptions { - core_count: core_count, - threads_per_core: threads_per_core, + Ok(LaunchTemplateData { + block_device_mappings: block_device_mappings, + capacity_reservation_specification: capacity_reservation_specification, + cpu_options: cpu_options, + credit_specification: credit_specification, + disable_api_termination: disable_api_termination, + ebs_optimized: ebs_optimized, + elastic_gpu_specifications: elastic_gpu_specifications, + elastic_inference_accelerators: elastic_inference_accelerators, + enclave_options: enclave_options, + hibernation_options: hibernation_options, + iam_instance_profile: iam_instance_profile, + image_id: image_id, + instance_initiated_shutdown_behavior: instance_initiated_shutdown_behavior, + instance_market_options: instance_market_options, + instance_requirements: instance_requirements, + instance_type: instance_type, + kernel_id: kernel_id, + key_name: key_name, + license_specifications: license_specifications, + maintenance_options: maintenance_options, + metadata_options: metadata_options, + monitoring: monitoring, + network_interfaces: network_interfaces, + placement: placement, + private_dns_name_options: private_dns_name_options, + ram_disk_id: ram_disk_id, + security_group_ids: security_group_ids, + security_groups: security_groups, + tag_specifications: tag_specifications, + user_data: user_data, }) } } @@ -12243,195 +16674,130 @@ pub mod launch_template { } } - /// The [`AWS::EC2::LaunchTemplate.CreditSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-creditspecification.html) property type. + /// The [`AWS::EC2::LaunchTemplate.LaunchTemplateElasticInferenceAccelerator`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplateelasticinferenceaccelerator.html) property type. #[derive(Debug, Default)] - pub struct CreditSpecification { - /// Property [`CpuCredits`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-creditspecification.html#cfn-ec2-launchtemplate-launchtemplatedata-creditspecification-cpucredits). + pub struct LaunchTemplateElasticInferenceAccelerator { + /// Property [`Count`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplateelasticinferenceaccelerator.html#cfn-ec2-launchtemplate-launchtemplateelasticinferenceaccelerator-count). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub cpu_credits: Option<::Value>, + pub count: Option<::Value>, + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplateelasticinferenceaccelerator.html#cfn-ec2-launchtemplate-launchtemplateelasticinferenceaccelerator-type). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#type: Option<::Value>, } - impl ::codec::SerializeValue for CreditSpecification { + impl ::codec::SerializeValue for LaunchTemplateElasticInferenceAccelerator { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref cpu_credits) = self.cpu_credits { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CpuCredits", cpu_credits)?; + if let Some(ref count) = self.count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Count", count)?; + } + if let Some(ref r#type) = self.r#type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", r#type)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for CreditSpecification { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for LaunchTemplateElasticInferenceAccelerator { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = CreditSpecification; + type Value = LaunchTemplateElasticInferenceAccelerator; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type CreditSpecification") + write!(f, "a struct of type LaunchTemplateElasticInferenceAccelerator") } fn visit_map>(self, mut map: A) -> Result { - let mut cpu_credits: Option<::Value> = None; + let mut count: Option<::Value> = None; + let mut r#type: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "CpuCredits" => { - cpu_credits = ::serde::de::MapAccess::next_value(&mut map)?; + "Count" => { + count = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(CreditSpecification { - cpu_credits: cpu_credits, - }) - } - } - - d.deserialize_map(Visitor) - } - } - - /// The [`AWS::EC2::LaunchTemplate.Ebs`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping-ebs.html) property type. - #[derive(Debug, Default)] - pub struct Ebs { - /// Property [`DeleteOnTermination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping-ebs.html#cfn-ec2-launchtemplate-blockdevicemapping-ebs-deleteontermination). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub delete_on_termination: Option<::Value>, - /// Property [`Encrypted`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping-ebs.html#cfn-ec2-launchtemplate-blockdevicemapping-ebs-encrypted). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub encrypted: Option<::Value>, - /// Property [`Iops`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping-ebs.html#cfn-ec2-launchtemplate-blockdevicemapping-ebs-iops). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub iops: Option<::Value>, - /// Property [`KmsKeyId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping-ebs.html#cfn-ec2-launchtemplate-blockdevicemapping-ebs-kmskeyid). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub kms_key_id: Option<::Value>, - /// Property [`SnapshotId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping-ebs.html#cfn-ec2-launchtemplate-blockdevicemapping-ebs-snapshotid). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub snapshot_id: Option<::Value>, - /// Property [`Throughput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping-ebs.html#cfn-ec2-launchtemplate-blockdevicemapping-ebs-throughput). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub throughput: Option<::Value>, - /// Property [`VolumeSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping-ebs.html#cfn-ec2-launchtemplate-blockdevicemapping-ebs-volumesize). + Ok(LaunchTemplateElasticInferenceAccelerator { + count: count, + r#type: r#type, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::LaunchTemplate.LaunchTemplateTagSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatetagspecification.html) property type. + #[derive(Debug, Default)] + pub struct LaunchTemplateTagSpecification { + /// Property [`ResourceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatetagspecification.html#cfn-ec2-launchtemplate-launchtemplatetagspecification-resourcetype). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub volume_size: Option<::Value>, - /// Property [`VolumeType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-blockdevicemapping-ebs.html#cfn-ec2-launchtemplate-blockdevicemapping-ebs-volumetype). + pub resource_type: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatetagspecification.html#cfn-ec2-launchtemplate-launchtemplatetagspecification-tags). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub volume_type: Option<::Value>, + pub tags: Option<::ValueList<::Tag>>, } - impl ::codec::SerializeValue for Ebs { + impl ::codec::SerializeValue for LaunchTemplateTagSpecification { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref delete_on_termination) = self.delete_on_termination { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeleteOnTermination", delete_on_termination)?; - } - if let Some(ref encrypted) = self.encrypted { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Encrypted", encrypted)?; - } - if let Some(ref iops) = self.iops { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Iops", iops)?; - } - if let Some(ref kms_key_id) = self.kms_key_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "KmsKeyId", kms_key_id)?; - } - if let Some(ref snapshot_id) = self.snapshot_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SnapshotId", snapshot_id)?; - } - if let Some(ref throughput) = self.throughput { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Throughput", throughput)?; - } - if let Some(ref volume_size) = self.volume_size { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VolumeSize", volume_size)?; + if let Some(ref resource_type) = self.resource_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceType", resource_type)?; } - if let Some(ref volume_type) = self.volume_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "VolumeType", volume_type)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for Ebs { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for LaunchTemplateTagSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = Ebs; + type Value = LaunchTemplateTagSpecification; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type Ebs") + write!(f, "a struct of type LaunchTemplateTagSpecification") } fn visit_map>(self, mut map: A) -> Result { - let mut delete_on_termination: Option<::Value> = None; - let mut encrypted: Option<::Value> = None; - let mut iops: Option<::Value> = None; - let mut kms_key_id: Option<::Value> = None; - let mut snapshot_id: Option<::Value> = None; - let mut throughput: Option<::Value> = None; - let mut volume_size: Option<::Value> = None; - let mut volume_type: Option<::Value> = None; + let mut resource_type: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "DeleteOnTermination" => { - delete_on_termination = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Encrypted" => { - encrypted = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Iops" => { - iops = ::serde::de::MapAccess::next_value(&mut map)?; - } - "KmsKeyId" => { - kms_key_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SnapshotId" => { - snapshot_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Throughput" => { - throughput = ::serde::de::MapAccess::next_value(&mut map)?; - } - "VolumeSize" => { - volume_size = ::serde::de::MapAccess::next_value(&mut map)?; + "ResourceType" => { + resource_type = ::serde::de::MapAccess::next_value(&mut map)?; } - "VolumeType" => { - volume_type = ::serde::de::MapAccess::next_value(&mut map)?; + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(Ebs { - delete_on_termination: delete_on_termination, - encrypted: encrypted, - iops: iops, - kms_key_id: kms_key_id, - snapshot_id: snapshot_id, - throughput: throughput, - volume_size: volume_size, - volume_type: volume_type, + Ok(LaunchTemplateTagSpecification { + resource_type: resource_type, + tags: tags, }) } } @@ -12440,51 +16806,51 @@ pub mod launch_template { } } - /// The [`AWS::EC2::LaunchTemplate.ElasticGpuSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-elasticgpuspecification.html) property type. + /// The [`AWS::EC2::LaunchTemplate.LicenseSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-licensespecification.html) property type. #[derive(Debug, Default)] - pub struct ElasticGpuSpecification { - /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-elasticgpuspecification.html#cfn-ec2-launchtemplate-elasticgpuspecification-type). + pub struct LicenseSpecification { + /// Property [`LicenseConfigurationArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-licensespecification.html#cfn-ec2-launchtemplate-licensespecification-licenseconfigurationarn). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub r#type: Option<::Value>, + pub license_configuration_arn: Option<::Value>, } - impl ::codec::SerializeValue for ElasticGpuSpecification { + impl ::codec::SerializeValue for LicenseSpecification { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref r#type) = self.r#type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", r#type)?; + if let Some(ref license_configuration_arn) = self.license_configuration_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LicenseConfigurationArn", license_configuration_arn)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for ElasticGpuSpecification { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for LicenseSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = ElasticGpuSpecification; + type Value = LicenseSpecification; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type ElasticGpuSpecification") + write!(f, "a struct of type LicenseSpecification") } fn visit_map>(self, mut map: A) -> Result { - let mut r#type: Option<::Value> = None; + let mut license_configuration_arn: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Type" => { - r#type = ::serde::de::MapAccess::next_value(&mut map)?; + "LicenseConfigurationArn" => { + license_configuration_arn = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(ElasticGpuSpecification { - r#type: r#type, + Ok(LicenseSpecification { + license_configuration_arn: license_configuration_arn, }) } } @@ -12493,51 +16859,51 @@ pub mod launch_template { } } - /// The [`AWS::EC2::LaunchTemplate.EnclaveOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-enclaveoptions.html) property type. + /// The [`AWS::EC2::LaunchTemplate.MaintenanceOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-maintenanceoptions.html) property type. #[derive(Debug, Default)] - pub struct EnclaveOptions { - /// Property [`Enabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-enclaveoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-enclaveoptions-enabled). + pub struct MaintenanceOptions { + /// Property [`AutoRecovery`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-maintenanceoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-maintenanceoptions-autorecovery). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub enabled: Option<::Value>, + pub auto_recovery: Option<::Value>, } - impl ::codec::SerializeValue for EnclaveOptions { + impl ::codec::SerializeValue for MaintenanceOptions { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref enabled) = self.enabled { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Enabled", enabled)?; + if let Some(ref auto_recovery) = self.auto_recovery { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AutoRecovery", auto_recovery)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for EnclaveOptions { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for MaintenanceOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = EnclaveOptions; + type Value = MaintenanceOptions; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type EnclaveOptions") + write!(f, "a struct of type MaintenanceOptions") } fn visit_map>(self, mut map: A) -> Result { - let mut enabled: Option<::Value> = None; + let mut auto_recovery: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Enabled" => { - enabled = ::serde::de::MapAccess::next_value(&mut map)?; + "AutoRecovery" => { + auto_recovery = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(EnclaveOptions { - enabled: enabled, + Ok(MaintenanceOptions { + auto_recovery: auto_recovery, }) } } @@ -12546,51 +16912,64 @@ pub mod launch_template { } } - /// The [`AWS::EC2::LaunchTemplate.HibernationOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-hibernationoptions.html) property type. + /// The [`AWS::EC2::LaunchTemplate.MemoryGiBPerVCpu`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-memorygibpervcpu.html) property type. #[derive(Debug, Default)] - pub struct HibernationOptions { - /// Property [`Configured`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-hibernationoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-hibernationoptions-configured). + pub struct MemoryGiBPerVCpu { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-memorygibpervcpu.html#cfn-ec2-launchtemplate-memorygibpervcpu-max). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub configured: Option<::Value>, + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-memorygibpervcpu.html#cfn-ec2-launchtemplate-memorygibpervcpu-min). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub min: Option<::Value>, } - impl ::codec::SerializeValue for HibernationOptions { + impl ::codec::SerializeValue for MemoryGiBPerVCpu { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref configured) = self.configured { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Configured", configured)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for HibernationOptions { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for MemoryGiBPerVCpu { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = HibernationOptions; + type Value = MemoryGiBPerVCpu; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type HibernationOptions") + write!(f, "a struct of type MemoryGiBPerVCpu") } fn visit_map>(self, mut map: A) -> Result { - let mut configured: Option<::Value> = None; + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Configured" => { - configured = ::serde::de::MapAccess::next_value(&mut map)?; + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(HibernationOptions { - configured: configured, + Ok(MemoryGiBPerVCpu { + max: max, + min: min, }) } } @@ -12599,64 +16978,64 @@ pub mod launch_template { } } - /// The [`AWS::EC2::LaunchTemplate.IamInstanceProfile`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-iaminstanceprofile.html) property type. + /// The [`AWS::EC2::LaunchTemplate.MemoryMiB`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-memorymib.html) property type. #[derive(Debug, Default)] - pub struct IamInstanceProfile { - /// Property [`Arn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-iaminstanceprofile.html#cfn-ec2-launchtemplate-launchtemplatedata-iaminstanceprofile-arn). + pub struct MemoryMiB { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-memorymib.html#cfn-ec2-launchtemplate-memorymib-max). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub arn: Option<::Value>, - /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-iaminstanceprofile.html#cfn-ec2-launchtemplate-launchtemplatedata-iaminstanceprofile-name). + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-memorymib.html#cfn-ec2-launchtemplate-memorymib-min). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub name: Option<::Value>, + pub min: Option<::Value>, } - impl ::codec::SerializeValue for IamInstanceProfile { + impl ::codec::SerializeValue for MemoryMiB { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref arn) = self.arn { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Arn", arn)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; } - if let Some(ref name) = self.name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for IamInstanceProfile { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for MemoryMiB { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = IamInstanceProfile; + type Value = MemoryMiB; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type IamInstanceProfile") + write!(f, "a struct of type MemoryMiB") } fn visit_map>(self, mut map: A) -> Result { - let mut arn: Option<::Value> = None; - let mut name: Option<::Value> = None; + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Arn" => { - arn = ::serde::de::MapAccess::next_value(&mut map)?; + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; } - "Name" => { - name = ::serde::de::MapAccess::next_value(&mut map)?; + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(IamInstanceProfile { - arn: arn, - name: name, + Ok(MemoryMiB { + max: max, + min: min, }) } } @@ -12665,64 +17044,103 @@ pub mod launch_template { } } - /// The [`AWS::EC2::LaunchTemplate.InstanceMarketOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancemarketoptions.html) property type. + /// The [`AWS::EC2::LaunchTemplate.MetadataOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-metadataoptions.html) property type. #[derive(Debug, Default)] - pub struct InstanceMarketOptions { - /// Property [`MarketType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancemarketoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-markettype). + pub struct MetadataOptions { + /// Property [`HttpEndpoint`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-metadataoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-metadataoptions-httpendpoint). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub market_type: Option<::Value>, - /// Property [`SpotOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancemarketoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions). + pub http_endpoint: Option<::Value>, + /// Property [`HttpProtocolIpv6`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-metadataoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-metadataoptions-httpprotocolipv6). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub spot_options: Option<::Value>, + pub http_protocol_ipv6: Option<::Value>, + /// Property [`HttpPutResponseHopLimit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-metadataoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-metadataoptions-httpputresponsehoplimit). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub http_put_response_hop_limit: Option<::Value>, + /// Property [`HttpTokens`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-metadataoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-metadataoptions-httptokens). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub http_tokens: Option<::Value>, + /// Property [`InstanceMetadataTags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-metadataoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-metadataoptions-instancemetadatatags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub instance_metadata_tags: Option<::Value>, } - impl ::codec::SerializeValue for InstanceMarketOptions { + impl ::codec::SerializeValue for MetadataOptions { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref market_type) = self.market_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "MarketType", market_type)?; + if let Some(ref http_endpoint) = self.http_endpoint { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HttpEndpoint", http_endpoint)?; } - if let Some(ref spot_options) = self.spot_options { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpotOptions", spot_options)?; + if let Some(ref http_protocol_ipv6) = self.http_protocol_ipv6 { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HttpProtocolIpv6", http_protocol_ipv6)?; + } + if let Some(ref http_put_response_hop_limit) = self.http_put_response_hop_limit { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HttpPutResponseHopLimit", http_put_response_hop_limit)?; + } + if let Some(ref http_tokens) = self.http_tokens { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HttpTokens", http_tokens)?; + } + if let Some(ref instance_metadata_tags) = self.instance_metadata_tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceMetadataTags", instance_metadata_tags)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for InstanceMarketOptions { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for MetadataOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = InstanceMarketOptions; + type Value = MetadataOptions; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type InstanceMarketOptions") + write!(f, "a struct of type MetadataOptions") } fn visit_map>(self, mut map: A) -> Result { - let mut market_type: Option<::Value> = None; - let mut spot_options: Option<::Value> = None; + let mut http_endpoint: Option<::Value> = None; + let mut http_protocol_ipv6: Option<::Value> = None; + let mut http_put_response_hop_limit: Option<::Value> = None; + let mut http_tokens: Option<::Value> = None; + let mut instance_metadata_tags: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "MarketType" => { - market_type = ::serde::de::MapAccess::next_value(&mut map)?; + "HttpEndpoint" => { + http_endpoint = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HttpProtocolIpv6" => { + http_protocol_ipv6 = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HttpPutResponseHopLimit" => { + http_put_response_hop_limit = ::serde::de::MapAccess::next_value(&mut map)?; } - "SpotOptions" => { - spot_options = ::serde::de::MapAccess::next_value(&mut map)?; + "HttpTokens" => { + http_tokens = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceMetadataTags" => { + instance_metadata_tags = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(InstanceMarketOptions { - market_type: market_type, - spot_options: spot_options, + Ok(MetadataOptions { + http_endpoint: http_endpoint, + http_protocol_ipv6: http_protocol_ipv6, + http_put_response_hop_limit: http_put_response_hop_limit, + http_tokens: http_tokens, + instance_metadata_tags: instance_metadata_tags, }) } } @@ -12731,51 +17149,51 @@ pub mod launch_template { } } - /// The [`AWS::EC2::LaunchTemplate.Ipv6Add`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ipv6add.html) property type. + /// The [`AWS::EC2::LaunchTemplate.Monitoring`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-monitoring.html) property type. #[derive(Debug, Default)] - pub struct Ipv6Add { - /// Property [`Ipv6Address`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-ipv6add.html#cfn-ec2-launchtemplate-ipv6add-ipv6address). + pub struct Monitoring { + /// Property [`Enabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-monitoring.html#cfn-ec2-launchtemplate-launchtemplatedata-monitoring-enabled). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub ipv6_address: Option<::Value>, + pub enabled: Option<::Value>, } - impl ::codec::SerializeValue for Ipv6Add { + impl ::codec::SerializeValue for Monitoring { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref ipv6_address) = self.ipv6_address { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6Address", ipv6_address)?; + if let Some(ref enabled) = self.enabled { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Enabled", enabled)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for Ipv6Add { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for Monitoring { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = Ipv6Add; + type Value = Monitoring; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type Ipv6Add") + write!(f, "a struct of type Monitoring") } fn visit_map>(self, mut map: A) -> Result { - let mut ipv6_address: Option<::Value> = None; + let mut enabled: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Ipv6Address" => { - ipv6_address = ::serde::de::MapAccess::next_value(&mut map)?; + "Enabled" => { + enabled = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(Ipv6Add { - ipv6_address: ipv6_address, + Ok(Monitoring { + enabled: enabled, }) } } @@ -12784,389 +17202,640 @@ pub mod launch_template { } } - /// The [`AWS::EC2::LaunchTemplate.LaunchTemplateData`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html) property type. + /// The [`AWS::EC2::LaunchTemplate.NetworkInterface`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html) property type. #[derive(Debug, Default)] - pub struct LaunchTemplateData { - /// Property [`BlockDeviceMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-blockdevicemappings). + pub struct NetworkInterface { + /// Property [`AssociateCarrierIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-associatecarrieripaddress). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub block_device_mappings: Option<::ValueList>, - /// Property [`CapacityReservationSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-capacityreservationspecification). + pub associate_carrier_ip_address: Option<::Value>, + /// Property [`AssociatePublicIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-associatepublicipaddress). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub capacity_reservation_specification: Option<::Value>, - /// Property [`CpuOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-cpuoptions). + pub associate_public_ip_address: Option<::Value>, + /// Property [`DeleteOnTermination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-deleteontermination). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub cpu_options: Option<::Value>, - /// Property [`CreditSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-creditspecification). + pub delete_on_termination: Option<::Value>, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-description). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub credit_specification: Option<::Value>, - /// Property [`DisableApiTermination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-disableapitermination). + pub description: Option<::Value>, + /// Property [`DeviceIndex`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-deviceindex). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub disable_api_termination: Option<::Value>, - /// Property [`EbsOptimized`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-ebsoptimized). + pub device_index: Option<::Value>, + /// Property [`Groups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-groups). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub ebs_optimized: Option<::Value>, - /// Property [`ElasticGpuSpecifications`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-elasticgpuspecifications). + pub groups: Option<::ValueList>, + /// Property [`InterfaceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-interfacetype). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub elastic_gpu_specifications: Option<::ValueList>, - /// Property [`ElasticInferenceAccelerators`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-elasticinferenceaccelerators). + pub interface_type: Option<::Value>, + /// Property [`Ipv4PrefixCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-ipv4prefixcount). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub elastic_inference_accelerators: Option<::ValueList>, - /// Property [`EnclaveOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-enclaveoptions). + pub ipv4_prefix_count: Option<::Value>, + /// Property [`Ipv4Prefixes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-ipv4prefixes). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub enclave_options: Option<::Value>, - /// Property [`HibernationOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-hibernationoptions). + pub ipv4_prefixes: Option<::ValueList>, + /// Property [`Ipv6AddressCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-ipv6addresscount). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub hibernation_options: Option<::Value>, - /// Property [`IamInstanceProfile`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-iaminstanceprofile). + pub ipv6_address_count: Option<::Value>, + /// Property [`Ipv6Addresses`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-ipv6addresses). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub iam_instance_profile: Option<::Value>, - /// Property [`ImageId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-imageid). + pub ipv6_addresses: Option<::ValueList>, + /// Property [`Ipv6PrefixCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-ipv6prefixcount). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub image_id: Option<::Value>, - /// Property [`InstanceInitiatedShutdownBehavior`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-instanceinitiatedshutdownbehavior). + pub ipv6_prefix_count: Option<::Value>, + /// Property [`Ipv6Prefixes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-ipv6prefixes). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub instance_initiated_shutdown_behavior: Option<::Value>, - /// Property [`InstanceMarketOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-instancemarketoptions). + pub ipv6_prefixes: Option<::ValueList>, + /// Property [`NetworkCardIndex`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-networkcardindex). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub instance_market_options: Option<::Value>, - /// Property [`InstanceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-instancetype). + pub network_card_index: Option<::Value>, + /// Property [`NetworkInterfaceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-networkinterfaceid). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub instance_type: Option<::Value>, - /// Property [`KernelId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-kernelid). + pub network_interface_id: Option<::Value>, + /// Property [`PrivateIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-privateipaddress). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub kernel_id: Option<::Value>, - /// Property [`KeyName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-keyname). + pub private_ip_address: Option<::Value>, + /// Property [`PrivateIpAddresses`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-privateipaddresses). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub key_name: Option<::Value>, - /// Property [`LicenseSpecifications`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-licensespecifications). + pub private_ip_addresses: Option<::ValueList>, + /// Property [`SecondaryPrivateIpAddressCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-secondaryprivateipaddresscount). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub secondary_private_ip_address_count: Option<::Value>, + /// Property [`SubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-subnetid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub subnet_id: Option<::Value>, + } + + impl ::codec::SerializeValue for NetworkInterface { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref associate_carrier_ip_address) = self.associate_carrier_ip_address { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AssociateCarrierIpAddress", associate_carrier_ip_address)?; + } + if let Some(ref associate_public_ip_address) = self.associate_public_ip_address { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AssociatePublicIpAddress", associate_public_ip_address)?; + } + if let Some(ref delete_on_termination) = self.delete_on_termination { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeleteOnTermination", delete_on_termination)?; + } + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + if let Some(ref device_index) = self.device_index { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeviceIndex", device_index)?; + } + if let Some(ref groups) = self.groups { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Groups", groups)?; + } + if let Some(ref interface_type) = self.interface_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InterfaceType", interface_type)?; + } + if let Some(ref ipv4_prefix_count) = self.ipv4_prefix_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv4PrefixCount", ipv4_prefix_count)?; + } + if let Some(ref ipv4_prefixes) = self.ipv4_prefixes { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv4Prefixes", ipv4_prefixes)?; + } + if let Some(ref ipv6_address_count) = self.ipv6_address_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6AddressCount", ipv6_address_count)?; + } + if let Some(ref ipv6_addresses) = self.ipv6_addresses { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6Addresses", ipv6_addresses)?; + } + if let Some(ref ipv6_prefix_count) = self.ipv6_prefix_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6PrefixCount", ipv6_prefix_count)?; + } + if let Some(ref ipv6_prefixes) = self.ipv6_prefixes { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6Prefixes", ipv6_prefixes)?; + } + if let Some(ref network_card_index) = self.network_card_index { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkCardIndex", network_card_index)?; + } + if let Some(ref network_interface_id) = self.network_interface_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaceId", network_interface_id)?; + } + if let Some(ref private_ip_address) = self.private_ip_address { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateIpAddress", private_ip_address)?; + } + if let Some(ref private_ip_addresses) = self.private_ip_addresses { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateIpAddresses", private_ip_addresses)?; + } + if let Some(ref secondary_private_ip_address_count) = self.secondary_private_ip_address_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecondaryPrivateIpAddressCount", secondary_private_ip_address_count)?; + } + if let Some(ref subnet_id) = self.subnet_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetId", subnet_id)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for NetworkInterface { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = NetworkInterface; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type NetworkInterface") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut associate_carrier_ip_address: Option<::Value> = None; + let mut associate_public_ip_address: Option<::Value> = None; + let mut delete_on_termination: Option<::Value> = None; + let mut description: Option<::Value> = None; + let mut device_index: Option<::Value> = None; + let mut groups: Option<::ValueList> = None; + let mut interface_type: Option<::Value> = None; + let mut ipv4_prefix_count: Option<::Value> = None; + let mut ipv4_prefixes: Option<::ValueList> = None; + let mut ipv6_address_count: Option<::Value> = None; + let mut ipv6_addresses: Option<::ValueList> = None; + let mut ipv6_prefix_count: Option<::Value> = None; + let mut ipv6_prefixes: Option<::ValueList> = None; + let mut network_card_index: Option<::Value> = None; + let mut network_interface_id: Option<::Value> = None; + let mut private_ip_address: Option<::Value> = None; + let mut private_ip_addresses: Option<::ValueList> = None; + let mut secondary_private_ip_address_count: Option<::Value> = None; + let mut subnet_id: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AssociateCarrierIpAddress" => { + associate_carrier_ip_address = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AssociatePublicIpAddress" => { + associate_public_ip_address = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DeleteOnTermination" => { + delete_on_termination = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DeviceIndex" => { + device_index = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Groups" => { + groups = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InterfaceType" => { + interface_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Ipv4PrefixCount" => { + ipv4_prefix_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Ipv4Prefixes" => { + ipv4_prefixes = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Ipv6AddressCount" => { + ipv6_address_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Ipv6Addresses" => { + ipv6_addresses = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Ipv6PrefixCount" => { + ipv6_prefix_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Ipv6Prefixes" => { + ipv6_prefixes = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NetworkCardIndex" => { + network_card_index = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NetworkInterfaceId" => { + network_interface_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PrivateIpAddress" => { + private_ip_address = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PrivateIpAddresses" => { + private_ip_addresses = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SecondaryPrivateIpAddressCount" => { + secondary_private_ip_address_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SubnetId" => { + subnet_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(NetworkInterface { + associate_carrier_ip_address: associate_carrier_ip_address, + associate_public_ip_address: associate_public_ip_address, + delete_on_termination: delete_on_termination, + description: description, + device_index: device_index, + groups: groups, + interface_type: interface_type, + ipv4_prefix_count: ipv4_prefix_count, + ipv4_prefixes: ipv4_prefixes, + ipv6_address_count: ipv6_address_count, + ipv6_addresses: ipv6_addresses, + ipv6_prefix_count: ipv6_prefix_count, + ipv6_prefixes: ipv6_prefixes, + network_card_index: network_card_index, + network_interface_id: network_interface_id, + private_ip_address: private_ip_address, + private_ip_addresses: private_ip_addresses, + secondary_private_ip_address_count: secondary_private_ip_address_count, + subnet_id: subnet_id, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::LaunchTemplate.NetworkInterfaceCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterfacecount.html) property type. + #[derive(Debug, Default)] + pub struct NetworkInterfaceCount { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterfacecount.html#cfn-ec2-launchtemplate-networkinterfacecount-max). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub license_specifications: Option<::ValueList>, - /// Property [`MetadataOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-metadataoptions). + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterfacecount.html#cfn-ec2-launchtemplate-networkinterfacecount-min). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub metadata_options: Option<::Value>, - /// Property [`Monitoring`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-monitoring). + pub min: Option<::Value>, + } + + impl ::codec::SerializeValue for NetworkInterfaceCount { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for NetworkInterfaceCount { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = NetworkInterfaceCount; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type NetworkInterfaceCount") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(NetworkInterfaceCount { + max: max, + min: min, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::LaunchTemplate.Placement`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-placement.html) property type. + #[derive(Debug, Default)] + pub struct Placement { + /// Property [`Affinity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-placement.html#cfn-ec2-launchtemplate-launchtemplatedata-placement-affinity). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub monitoring: Option<::Value>, - /// Property [`NetworkInterfaces`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-networkinterfaces). + pub affinity: Option<::Value>, + /// Property [`AvailabilityZone`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-placement.html#cfn-ec2-launchtemplate-launchtemplatedata-placement-availabilityzone). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub network_interfaces: Option<::ValueList>, - /// Property [`Placement`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-placement). + pub availability_zone: Option<::Value>, + /// Property [`GroupName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-placement.html#cfn-ec2-launchtemplate-launchtemplatedata-placement-groupname). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub placement: Option<::Value>, - /// Property [`RamDiskId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-ramdiskid). + pub group_name: Option<::Value>, + /// Property [`HostId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-placement.html#cfn-ec2-launchtemplate-launchtemplatedata-placement-hostid). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub ram_disk_id: Option<::Value>, - /// Property [`SecurityGroupIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-securitygroupids). + pub host_id: Option<::Value>, + /// Property [`HostResourceGroupArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-placement.html#cfn-ec2-launchtemplate-launchtemplatedata-placement-hostresourcegrouparn). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub security_group_ids: Option<::ValueList>, - /// Property [`SecurityGroups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-securitygroups). + pub host_resource_group_arn: Option<::Value>, + /// Property [`PartitionNumber`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-placement.html#cfn-ec2-launchtemplate-launchtemplatedata-placement-partitionnumber). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub security_groups: Option<::ValueList>, - /// Property [`TagSpecifications`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-tagspecifications). + pub partition_number: Option<::Value>, + /// Property [`SpreadDomain`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-placement.html#cfn-ec2-launchtemplate-launchtemplatedata-placement-spreaddomain). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub tag_specifications: Option<::ValueList>, - /// Property [`UserData`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata.html#cfn-ec2-launchtemplate-launchtemplatedata-userdata). + pub spread_domain: Option<::Value>, + /// Property [`Tenancy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-placement.html#cfn-ec2-launchtemplate-launchtemplatedata-placement-tenancy). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub user_data: Option<::Value>, + pub tenancy: Option<::Value>, } - impl ::codec::SerializeValue for LaunchTemplateData { + impl ::codec::SerializeValue for Placement { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref block_device_mappings) = self.block_device_mappings { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "BlockDeviceMappings", block_device_mappings)?; - } - if let Some(ref capacity_reservation_specification) = self.capacity_reservation_specification { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CapacityReservationSpecification", capacity_reservation_specification)?; - } - if let Some(ref cpu_options) = self.cpu_options { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CpuOptions", cpu_options)?; - } - if let Some(ref credit_specification) = self.credit_specification { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CreditSpecification", credit_specification)?; - } - if let Some(ref disable_api_termination) = self.disable_api_termination { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DisableApiTermination", disable_api_termination)?; - } - if let Some(ref ebs_optimized) = self.ebs_optimized { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "EbsOptimized", ebs_optimized)?; - } - if let Some(ref elastic_gpu_specifications) = self.elastic_gpu_specifications { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ElasticGpuSpecifications", elastic_gpu_specifications)?; - } - if let Some(ref elastic_inference_accelerators) = self.elastic_inference_accelerators { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ElasticInferenceAccelerators", elastic_inference_accelerators)?; - } - if let Some(ref enclave_options) = self.enclave_options { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "EnclaveOptions", enclave_options)?; - } - if let Some(ref hibernation_options) = self.hibernation_options { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "HibernationOptions", hibernation_options)?; - } - if let Some(ref iam_instance_profile) = self.iam_instance_profile { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "IamInstanceProfile", iam_instance_profile)?; - } - if let Some(ref image_id) = self.image_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ImageId", image_id)?; - } - if let Some(ref instance_initiated_shutdown_behavior) = self.instance_initiated_shutdown_behavior { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceInitiatedShutdownBehavior", instance_initiated_shutdown_behavior)?; - } - if let Some(ref instance_market_options) = self.instance_market_options { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceMarketOptions", instance_market_options)?; - } - if let Some(ref instance_type) = self.instance_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceType", instance_type)?; - } - if let Some(ref kernel_id) = self.kernel_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "KernelId", kernel_id)?; + if let Some(ref affinity) = self.affinity { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Affinity", affinity)?; } - if let Some(ref key_name) = self.key_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "KeyName", key_name)?; + if let Some(ref availability_zone) = self.availability_zone { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AvailabilityZone", availability_zone)?; } - if let Some(ref license_specifications) = self.license_specifications { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LicenseSpecifications", license_specifications)?; + if let Some(ref group_name) = self.group_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupName", group_name)?; } - if let Some(ref metadata_options) = self.metadata_options { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "MetadataOptions", metadata_options)?; + if let Some(ref host_id) = self.host_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HostId", host_id)?; } - if let Some(ref monitoring) = self.monitoring { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Monitoring", monitoring)?; + if let Some(ref host_resource_group_arn) = self.host_resource_group_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HostResourceGroupArn", host_resource_group_arn)?; } - if let Some(ref network_interfaces) = self.network_interfaces { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaces", network_interfaces)?; + if let Some(ref partition_number) = self.partition_number { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PartitionNumber", partition_number)?; } - if let Some(ref placement) = self.placement { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Placement", placement)?; + if let Some(ref spread_domain) = self.spread_domain { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpreadDomain", spread_domain)?; } - if let Some(ref ram_disk_id) = self.ram_disk_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "RamDiskId", ram_disk_id)?; + if let Some(ref tenancy) = self.tenancy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tenancy", tenancy)?; } - if let Some(ref security_group_ids) = self.security_group_ids { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityGroupIds", security_group_ids)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Placement { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Placement; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Placement") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut affinity: Option<::Value> = None; + let mut availability_zone: Option<::Value> = None; + let mut group_name: Option<::Value> = None; + let mut host_id: Option<::Value> = None; + let mut host_resource_group_arn: Option<::Value> = None; + let mut partition_number: Option<::Value> = None; + let mut spread_domain: Option<::Value> = None; + let mut tenancy: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Affinity" => { + affinity = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AvailabilityZone" => { + availability_zone = ::serde::de::MapAccess::next_value(&mut map)?; + } + "GroupName" => { + group_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HostId" => { + host_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HostResourceGroupArn" => { + host_resource_group_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PartitionNumber" => { + partition_number = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SpreadDomain" => { + spread_domain = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tenancy" => { + tenancy = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Placement { + affinity: affinity, + availability_zone: availability_zone, + group_name: group_name, + host_id: host_id, + host_resource_group_arn: host_resource_group_arn, + partition_number: partition_number, + spread_domain: spread_domain, + tenancy: tenancy, + }) + } } - if let Some(ref security_groups) = self.security_groups { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityGroups", security_groups)?; + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::LaunchTemplate.PrivateDnsNameOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-privatednsnameoptions.html) property type. + #[derive(Debug, Default)] + pub struct PrivateDnsNameOptions { + /// Property [`EnableResourceNameDnsAAAARecord`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-privatednsnameoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-privatednsnameoptions-enableresourcenamednsaaaarecord). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enable_resource_name_dns_aaaa_record: Option<::Value>, + /// Property [`EnableResourceNameDnsARecord`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-privatednsnameoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-privatednsnameoptions-enableresourcenamednsarecord). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enable_resource_name_dns_a_record: Option<::Value>, + /// Property [`HostnameType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-privatednsnameoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-privatednsnameoptions-hostnametype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub hostname_type: Option<::Value>, + } + + impl ::codec::SerializeValue for PrivateDnsNameOptions { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref enable_resource_name_dns_aaaa_record) = self.enable_resource_name_dns_aaaa_record { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EnableResourceNameDnsAAAARecord", enable_resource_name_dns_aaaa_record)?; } - if let Some(ref tag_specifications) = self.tag_specifications { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TagSpecifications", tag_specifications)?; + if let Some(ref enable_resource_name_dns_a_record) = self.enable_resource_name_dns_a_record { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EnableResourceNameDnsARecord", enable_resource_name_dns_a_record)?; } - if let Some(ref user_data) = self.user_data { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "UserData", user_data)?; + if let Some(ref hostname_type) = self.hostname_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HostnameType", hostname_type)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for LaunchTemplateData { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for PrivateDnsNameOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = LaunchTemplateData; + type Value = PrivateDnsNameOptions; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type LaunchTemplateData") + write!(f, "a struct of type PrivateDnsNameOptions") } fn visit_map>(self, mut map: A) -> Result { - let mut block_device_mappings: Option<::ValueList> = None; - let mut capacity_reservation_specification: Option<::Value> = None; - let mut cpu_options: Option<::Value> = None; - let mut credit_specification: Option<::Value> = None; - let mut disable_api_termination: Option<::Value> = None; - let mut ebs_optimized: Option<::Value> = None; - let mut elastic_gpu_specifications: Option<::ValueList> = None; - let mut elastic_inference_accelerators: Option<::ValueList> = None; - let mut enclave_options: Option<::Value> = None; - let mut hibernation_options: Option<::Value> = None; - let mut iam_instance_profile: Option<::Value> = None; - let mut image_id: Option<::Value> = None; - let mut instance_initiated_shutdown_behavior: Option<::Value> = None; - let mut instance_market_options: Option<::Value> = None; - let mut instance_type: Option<::Value> = None; - let mut kernel_id: Option<::Value> = None; - let mut key_name: Option<::Value> = None; - let mut license_specifications: Option<::ValueList> = None; - let mut metadata_options: Option<::Value> = None; - let mut monitoring: Option<::Value> = None; - let mut network_interfaces: Option<::ValueList> = None; - let mut placement: Option<::Value> = None; - let mut ram_disk_id: Option<::Value> = None; - let mut security_group_ids: Option<::ValueList> = None; - let mut security_groups: Option<::ValueList> = None; - let mut tag_specifications: Option<::ValueList> = None; - let mut user_data: Option<::Value> = None; + let mut enable_resource_name_dns_aaaa_record: Option<::Value> = None; + let mut enable_resource_name_dns_a_record: Option<::Value> = None; + let mut hostname_type: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "BlockDeviceMappings" => { - block_device_mappings = ::serde::de::MapAccess::next_value(&mut map)?; - } - "CapacityReservationSpecification" => { - capacity_reservation_specification = ::serde::de::MapAccess::next_value(&mut map)?; - } - "CpuOptions" => { - cpu_options = ::serde::de::MapAccess::next_value(&mut map)?; - } - "CreditSpecification" => { - credit_specification = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DisableApiTermination" => { - disable_api_termination = ::serde::de::MapAccess::next_value(&mut map)?; - } - "EbsOptimized" => { - ebs_optimized = ::serde::de::MapAccess::next_value(&mut map)?; - } - "ElasticGpuSpecifications" => { - elastic_gpu_specifications = ::serde::de::MapAccess::next_value(&mut map)?; - } - "ElasticInferenceAccelerators" => { - elastic_inference_accelerators = ::serde::de::MapAccess::next_value(&mut map)?; - } - "EnclaveOptions" => { - enclave_options = ::serde::de::MapAccess::next_value(&mut map)?; - } - "HibernationOptions" => { - hibernation_options = ::serde::de::MapAccess::next_value(&mut map)?; - } - "IamInstanceProfile" => { - iam_instance_profile = ::serde::de::MapAccess::next_value(&mut map)?; - } - "ImageId" => { - image_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "InstanceInitiatedShutdownBehavior" => { - instance_initiated_shutdown_behavior = ::serde::de::MapAccess::next_value(&mut map)?; - } - "InstanceMarketOptions" => { - instance_market_options = ::serde::de::MapAccess::next_value(&mut map)?; - } - "InstanceType" => { - instance_type = ::serde::de::MapAccess::next_value(&mut map)?; - } - "KernelId" => { - kernel_id = ::serde::de::MapAccess::next_value(&mut map)?; + "EnableResourceNameDnsAAAARecord" => { + enable_resource_name_dns_aaaa_record = ::serde::de::MapAccess::next_value(&mut map)?; } - "KeyName" => { - key_name = ::serde::de::MapAccess::next_value(&mut map)?; - } - "LicenseSpecifications" => { - license_specifications = ::serde::de::MapAccess::next_value(&mut map)?; - } - "MetadataOptions" => { - metadata_options = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Monitoring" => { - monitoring = ::serde::de::MapAccess::next_value(&mut map)?; - } - "NetworkInterfaces" => { - network_interfaces = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Placement" => { - placement = ::serde::de::MapAccess::next_value(&mut map)?; - } - "RamDiskId" => { - ram_disk_id = ::serde::de::MapAccess::next_value(&mut map)?; + "EnableResourceNameDnsARecord" => { + enable_resource_name_dns_a_record = ::serde::de::MapAccess::next_value(&mut map)?; } - "SecurityGroupIds" => { - security_group_ids = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SecurityGroups" => { - security_groups = ::serde::de::MapAccess::next_value(&mut map)?; + "HostnameType" => { + hostname_type = ::serde::de::MapAccess::next_value(&mut map)?; } - "TagSpecifications" => { - tag_specifications = ::serde::de::MapAccess::next_value(&mut map)?; + _ => {} + } + } + + Ok(PrivateDnsNameOptions { + enable_resource_name_dns_aaaa_record: enable_resource_name_dns_aaaa_record, + enable_resource_name_dns_a_record: enable_resource_name_dns_a_record, + hostname_type: hostname_type, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::LaunchTemplate.PrivateIpAdd`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-privateipadd.html) property type. + #[derive(Debug, Default)] + pub struct PrivateIpAdd { + /// Property [`Primary`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-privateipadd.html#cfn-ec2-launchtemplate-privateipadd-primary). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub primary: Option<::Value>, + /// Property [`PrivateIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-privateipadd.html#cfn-ec2-launchtemplate-privateipadd-privateipaddress). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub private_ip_address: Option<::Value>, + } + + impl ::codec::SerializeValue for PrivateIpAdd { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref primary) = self.primary { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Primary", primary)?; + } + if let Some(ref private_ip_address) = self.private_ip_address { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateIpAddress", private_ip_address)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for PrivateIpAdd { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = PrivateIpAdd; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type PrivateIpAdd") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut primary: Option<::Value> = None; + let mut private_ip_address: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Primary" => { + primary = ::serde::de::MapAccess::next_value(&mut map)?; } - "UserData" => { - user_data = ::serde::de::MapAccess::next_value(&mut map)?; + "PrivateIpAddress" => { + private_ip_address = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(LaunchTemplateData { - block_device_mappings: block_device_mappings, - capacity_reservation_specification: capacity_reservation_specification, - cpu_options: cpu_options, - credit_specification: credit_specification, - disable_api_termination: disable_api_termination, - ebs_optimized: ebs_optimized, - elastic_gpu_specifications: elastic_gpu_specifications, - elastic_inference_accelerators: elastic_inference_accelerators, - enclave_options: enclave_options, - hibernation_options: hibernation_options, - iam_instance_profile: iam_instance_profile, - image_id: image_id, - instance_initiated_shutdown_behavior: instance_initiated_shutdown_behavior, - instance_market_options: instance_market_options, - instance_type: instance_type, - kernel_id: kernel_id, - key_name: key_name, - license_specifications: license_specifications, - metadata_options: metadata_options, - monitoring: monitoring, - network_interfaces: network_interfaces, - placement: placement, - ram_disk_id: ram_disk_id, - security_group_ids: security_group_ids, - security_groups: security_groups, - tag_specifications: tag_specifications, - user_data: user_data, + Ok(PrivateIpAdd { + primary: primary, + private_ip_address: private_ip_address, }) } } @@ -13175,64 +17844,103 @@ pub mod launch_template { } } - /// The [`AWS::EC2::LaunchTemplate.LaunchTemplateElasticInferenceAccelerator`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplateelasticinferenceaccelerator.html) property type. + /// The [`AWS::EC2::LaunchTemplate.SpotOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions.html) property type. #[derive(Debug, Default)] - pub struct LaunchTemplateElasticInferenceAccelerator { - /// Property [`Count`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplateelasticinferenceaccelerator.html#cfn-ec2-launchtemplate-launchtemplateelasticinferenceaccelerator-count). + pub struct SpotOptions { + /// Property [`BlockDurationMinutes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions-blockdurationminutes). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub count: Option<::Value>, - /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplateelasticinferenceaccelerator.html#cfn-ec2-launchtemplate-launchtemplateelasticinferenceaccelerator-type). + pub block_duration_minutes: Option<::Value>, + /// Property [`InstanceInterruptionBehavior`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions-instanceinterruptionbehavior). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub r#type: Option<::Value>, + pub instance_interruption_behavior: Option<::Value>, + /// Property [`MaxPrice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions-maxprice). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub max_price: Option<::Value>, + /// Property [`SpotInstanceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions-spotinstancetype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub spot_instance_type: Option<::Value>, + /// Property [`ValidUntil`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions-validuntil). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub valid_until: Option<::Value>, } - impl ::codec::SerializeValue for LaunchTemplateElasticInferenceAccelerator { + impl ::codec::SerializeValue for SpotOptions { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref count) = self.count { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Count", count)?; + if let Some(ref block_duration_minutes) = self.block_duration_minutes { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BlockDurationMinutes", block_duration_minutes)?; + } + if let Some(ref instance_interruption_behavior) = self.instance_interruption_behavior { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceInterruptionBehavior", instance_interruption_behavior)?; + } + if let Some(ref max_price) = self.max_price { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxPrice", max_price)?; } - if let Some(ref r#type) = self.r#type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", r#type)?; + if let Some(ref spot_instance_type) = self.spot_instance_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpotInstanceType", spot_instance_type)?; + } + if let Some(ref valid_until) = self.valid_until { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ValidUntil", valid_until)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for LaunchTemplateElasticInferenceAccelerator { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for SpotOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = LaunchTemplateElasticInferenceAccelerator; + type Value = SpotOptions; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type LaunchTemplateElasticInferenceAccelerator") + write!(f, "a struct of type SpotOptions") } fn visit_map>(self, mut map: A) -> Result { - let mut count: Option<::Value> = None; - let mut r#type: Option<::Value> = None; + let mut block_duration_minutes: Option<::Value> = None; + let mut instance_interruption_behavior: Option<::Value> = None; + let mut max_price: Option<::Value> = None; + let mut spot_instance_type: Option<::Value> = None; + let mut valid_until: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Count" => { - count = ::serde::de::MapAccess::next_value(&mut map)?; + "BlockDurationMinutes" => { + block_duration_minutes = ::serde::de::MapAccess::next_value(&mut map)?; } - "Type" => { - r#type = ::serde::de::MapAccess::next_value(&mut map)?; + "InstanceInterruptionBehavior" => { + instance_interruption_behavior = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MaxPrice" => { + max_price = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SpotInstanceType" => { + spot_instance_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ValidUntil" => { + valid_until = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(LaunchTemplateElasticInferenceAccelerator { - count: count, - r#type: r#type, + Ok(SpotOptions { + block_duration_minutes: block_duration_minutes, + instance_interruption_behavior: instance_interruption_behavior, + max_price: max_price, + spot_instance_type: spot_instance_type, + valid_until: valid_until, }) } } @@ -13241,22 +17949,22 @@ pub mod launch_template { } } - /// The [`AWS::EC2::LaunchTemplate.LaunchTemplateTagSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatetagspecification.html) property type. + /// The [`AWS::EC2::LaunchTemplate.TagSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-tagspecification.html) property type. #[derive(Debug, Default)] - pub struct LaunchTemplateTagSpecification { - /// Property [`ResourceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatetagspecification.html#cfn-ec2-launchtemplate-launchtemplatetagspecification-resourcetype). + pub struct TagSpecification { + /// Property [`ResourceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-tagspecification.html#cfn-ec2-launchtemplate-tagspecification-resourcetype). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub resource_type: Option<::Value>, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatetagspecification.html#cfn-ec2-launchtemplate-launchtemplatetagspecification-tags). + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-tagspecification.html#cfn-ec2-launchtemplate-tagspecification-tags). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub tags: Option<::ValueList<::Tag>>, } - impl ::codec::SerializeValue for LaunchTemplateTagSpecification { + impl ::codec::SerializeValue for TagSpecification { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; if let Some(ref resource_type) = self.resource_type { @@ -13269,15 +17977,15 @@ pub mod launch_template { } } - impl ::codec::DeserializeValue for LaunchTemplateTagSpecification { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for TagSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = LaunchTemplateTagSpecification; + type Value = TagSpecification; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type LaunchTemplateTagSpecification") + write!(f, "a struct of type TagSpecification") } fn visit_map>(self, mut map: A) -> Result { @@ -13296,7 +18004,7 @@ pub mod launch_template { } } - Ok(LaunchTemplateTagSpecification { + Ok(TagSpecification { resource_type: resource_type, tags: tags, }) @@ -13307,51 +18015,64 @@ pub mod launch_template { } } - /// The [`AWS::EC2::LaunchTemplate.LicenseSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-licensespecification.html) property type. + /// The [`AWS::EC2::LaunchTemplate.TotalLocalStorageGB`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-totallocalstoragegb.html) property type. #[derive(Debug, Default)] - pub struct LicenseSpecification { - /// Property [`LicenseConfigurationArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-licensespecification.html#cfn-ec2-launchtemplate-licensespecification-licenseconfigurationarn). + pub struct TotalLocalStorageGB { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-totallocalstoragegb.html#cfn-ec2-launchtemplate-totallocalstoragegb-max). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub license_configuration_arn: Option<::Value>, + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-totallocalstoragegb.html#cfn-ec2-launchtemplate-totallocalstoragegb-min). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub min: Option<::Value>, } - impl ::codec::SerializeValue for LicenseSpecification { + impl ::codec::SerializeValue for TotalLocalStorageGB { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref license_configuration_arn) = self.license_configuration_arn { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LicenseConfigurationArn", license_configuration_arn)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for LicenseSpecification { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for TotalLocalStorageGB { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = LicenseSpecification; + type Value = TotalLocalStorageGB; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type LicenseSpecification") + write!(f, "a struct of type TotalLocalStorageGB") } fn visit_map>(self, mut map: A) -> Result { - let mut license_configuration_arn: Option<::Value> = None; + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "LicenseConfigurationArn" => { - license_configuration_arn = ::serde::de::MapAccess::next_value(&mut map)?; + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(LicenseSpecification { - license_configuration_arn: license_configuration_arn, + Ok(TotalLocalStorageGB { + max: max, + min: min, }) } } @@ -13360,77 +18081,64 @@ pub mod launch_template { } } - /// The [`AWS::EC2::LaunchTemplate.MetadataOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-metadataoptions.html) property type. + /// The [`AWS::EC2::LaunchTemplate.VCpuCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-vcpucount.html) property type. #[derive(Debug, Default)] - pub struct MetadataOptions { - /// Property [`HttpEndpoint`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-metadataoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-metadataoptions-httpendpoint). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub http_endpoint: Option<::Value>, - /// Property [`HttpPutResponseHopLimit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-metadataoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-metadataoptions-httpputresponsehoplimit). + pub struct VCpuCount { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-vcpucount.html#cfn-ec2-launchtemplate-vcpucount-max). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub http_put_response_hop_limit: Option<::Value>, - /// Property [`HttpTokens`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-metadataoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-metadataoptions-httptokens). + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-vcpucount.html#cfn-ec2-launchtemplate-vcpucount-min). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub http_tokens: Option<::Value>, + pub min: Option<::Value>, } - impl ::codec::SerializeValue for MetadataOptions { + impl ::codec::SerializeValue for VCpuCount { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref http_endpoint) = self.http_endpoint { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "HttpEndpoint", http_endpoint)?; - } - if let Some(ref http_put_response_hop_limit) = self.http_put_response_hop_limit { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "HttpPutResponseHopLimit", http_put_response_hop_limit)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; } - if let Some(ref http_tokens) = self.http_tokens { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "HttpTokens", http_tokens)?; + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for MetadataOptions { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for VCpuCount { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = MetadataOptions; + type Value = VCpuCount; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type MetadataOptions") + write!(f, "a struct of type VCpuCount") } fn visit_map>(self, mut map: A) -> Result { - let mut http_endpoint: Option<::Value> = None; - let mut http_put_response_hop_limit: Option<::Value> = None; - let mut http_tokens: Option<::Value> = None; + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "HttpEndpoint" => { - http_endpoint = ::serde::de::MapAccess::next_value(&mut map)?; - } - "HttpPutResponseHopLimit" => { - http_put_response_hop_limit = ::serde::de::MapAccess::next_value(&mut map)?; + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; } - "HttpTokens" => { - http_tokens = ::serde::de::MapAccess::next_value(&mut map)?; + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(MetadataOptions { - http_endpoint: http_endpoint, - http_put_response_hop_limit: http_put_response_hop_limit, - http_tokens: http_tokens, + Ok(VCpuCount { + max: max, + min: min, }) } } @@ -13438,287 +18146,69 @@ pub mod launch_template { d.deserialize_map(Visitor) } } +} - /// The [`AWS::EC2::LaunchTemplate.Monitoring`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-monitoring.html) property type. - #[derive(Debug, Default)] - pub struct Monitoring { - /// Property [`Enabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-monitoring.html#cfn-ec2-launchtemplate-launchtemplatedata-monitoring-enabled). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub enabled: Option<::Value>, - } - - impl ::codec::SerializeValue for Monitoring { - fn serialize(&self, s: S) -> Result { - let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref enabled) = self.enabled { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Enabled", enabled)?; - } - ::serde::ser::SerializeMap::end(map) - } - } - - impl ::codec::DeserializeValue for Monitoring { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { - struct Visitor; - - impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = Monitoring; - - fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type Monitoring") - } - - fn visit_map>(self, mut map: A) -> Result { - let mut enabled: Option<::Value> = None; - - while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { - match __cfn_key.as_ref() { - "Enabled" => { - enabled = ::serde::de::MapAccess::next_value(&mut map)?; - } - _ => {} - } - } - - Ok(Monitoring { - enabled: enabled, - }) - } - } - - d.deserialize_map(Visitor) - } - } +pub mod network_acl_entry { + //! Property types for the `NetworkAclEntry` resource. - /// The [`AWS::EC2::LaunchTemplate.NetworkInterface`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html) property type. + /// The [`AWS::EC2::NetworkAclEntry.Icmp`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkaclentry-icmp.html) property type. #[derive(Debug, Default)] - pub struct NetworkInterface { - /// Property [`AssociateCarrierIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-associatecarrieripaddress). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub associate_carrier_ip_address: Option<::Value>, - /// Property [`AssociatePublicIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-associatepublicipaddress). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub associate_public_ip_address: Option<::Value>, - /// Property [`DeleteOnTermination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-deleteontermination). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub delete_on_termination: Option<::Value>, - /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-description). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub description: Option<::Value>, - /// Property [`DeviceIndex`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-deviceindex). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub device_index: Option<::Value>, - /// Property [`Groups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-groups). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub groups: Option<::ValueList>, - /// Property [`InterfaceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-interfacetype). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub interface_type: Option<::Value>, - /// Property [`Ipv6AddressCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-ipv6addresscount). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub ipv6_address_count: Option<::Value>, - /// Property [`Ipv6Addresses`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-ipv6addresses). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub ipv6_addresses: Option<::ValueList>, - /// Property [`NetworkCardIndex`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-networkcardindex). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub network_card_index: Option<::Value>, - /// Property [`NetworkInterfaceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-networkinterfaceid). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub network_interface_id: Option<::Value>, - /// Property [`PrivateIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-privateipaddress). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub private_ip_address: Option<::Value>, - /// Property [`PrivateIpAddresses`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-privateipaddresses). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub private_ip_addresses: Option<::ValueList>, - /// Property [`SecondaryPrivateIpAddressCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-secondaryprivateipaddresscount). + pub struct Icmp { + /// Property [`Code`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkaclentry-icmp.html#cfn-ec2-networkaclentry-icmp-code). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub secondary_private_ip_address_count: Option<::Value>, - /// Property [`SubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-networkinterface.html#cfn-ec2-launchtemplate-networkinterface-subnetid). + pub code: Option<::Value>, + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkaclentry-icmp.html#cfn-ec2-networkaclentry-icmp-type). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub subnet_id: Option<::Value>, + pub r#type: Option<::Value>, } - impl ::codec::SerializeValue for NetworkInterface { + impl ::codec::SerializeValue for Icmp { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref associate_carrier_ip_address) = self.associate_carrier_ip_address { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AssociateCarrierIpAddress", associate_carrier_ip_address)?; - } - if let Some(ref associate_public_ip_address) = self.associate_public_ip_address { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AssociatePublicIpAddress", associate_public_ip_address)?; - } - if let Some(ref delete_on_termination) = self.delete_on_termination { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeleteOnTermination", delete_on_termination)?; - } - if let Some(ref description) = self.description { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; - } - if let Some(ref device_index) = self.device_index { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeviceIndex", device_index)?; - } - if let Some(ref groups) = self.groups { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Groups", groups)?; - } - if let Some(ref interface_type) = self.interface_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "InterfaceType", interface_type)?; - } - if let Some(ref ipv6_address_count) = self.ipv6_address_count { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6AddressCount", ipv6_address_count)?; - } - if let Some(ref ipv6_addresses) = self.ipv6_addresses { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ipv6Addresses", ipv6_addresses)?; - } - if let Some(ref network_card_index) = self.network_card_index { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkCardIndex", network_card_index)?; - } - if let Some(ref network_interface_id) = self.network_interface_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaceId", network_interface_id)?; - } - if let Some(ref private_ip_address) = self.private_ip_address { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateIpAddress", private_ip_address)?; - } - if let Some(ref private_ip_addresses) = self.private_ip_addresses { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateIpAddresses", private_ip_addresses)?; - } - if let Some(ref secondary_private_ip_address_count) = self.secondary_private_ip_address_count { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecondaryPrivateIpAddressCount", secondary_private_ip_address_count)?; + if let Some(ref code) = self.code { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Code", code)?; } - if let Some(ref subnet_id) = self.subnet_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetId", subnet_id)?; + if let Some(ref r#type) = self.r#type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", r#type)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for NetworkInterface { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for Icmp { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = NetworkInterface; + type Value = Icmp; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type NetworkInterface") + write!(f, "a struct of type Icmp") } fn visit_map>(self, mut map: A) -> Result { - let mut associate_carrier_ip_address: Option<::Value> = None; - let mut associate_public_ip_address: Option<::Value> = None; - let mut delete_on_termination: Option<::Value> = None; - let mut description: Option<::Value> = None; - let mut device_index: Option<::Value> = None; - let mut groups: Option<::ValueList> = None; - let mut interface_type: Option<::Value> = None; - let mut ipv6_address_count: Option<::Value> = None; - let mut ipv6_addresses: Option<::ValueList> = None; - let mut network_card_index: Option<::Value> = None; - let mut network_interface_id: Option<::Value> = None; - let mut private_ip_address: Option<::Value> = None; - let mut private_ip_addresses: Option<::ValueList> = None; - let mut secondary_private_ip_address_count: Option<::Value> = None; - let mut subnet_id: Option<::Value> = None; + let mut code: Option<::Value> = None; + let mut r#type: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "AssociateCarrierIpAddress" => { - associate_carrier_ip_address = ::serde::de::MapAccess::next_value(&mut map)?; - } - "AssociatePublicIpAddress" => { - associate_public_ip_address = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DeleteOnTermination" => { - delete_on_termination = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Description" => { - description = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DeviceIndex" => { - device_index = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Groups" => { - groups = ::serde::de::MapAccess::next_value(&mut map)?; - } - "InterfaceType" => { - interface_type = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Ipv6AddressCount" => { - ipv6_address_count = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Ipv6Addresses" => { - ipv6_addresses = ::serde::de::MapAccess::next_value(&mut map)?; - } - "NetworkCardIndex" => { - network_card_index = ::serde::de::MapAccess::next_value(&mut map)?; - } - "NetworkInterfaceId" => { - network_interface_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "PrivateIpAddress" => { - private_ip_address = ::serde::de::MapAccess::next_value(&mut map)?; - } - "PrivateIpAddresses" => { - private_ip_addresses = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SecondaryPrivateIpAddressCount" => { - secondary_private_ip_address_count = ::serde::de::MapAccess::next_value(&mut map)?; + "Code" => { + code = ::serde::de::MapAccess::next_value(&mut map)?; } - "SubnetId" => { - subnet_id = ::serde::de::MapAccess::next_value(&mut map)?; + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(NetworkInterface { - associate_carrier_ip_address: associate_carrier_ip_address, - associate_public_ip_address: associate_public_ip_address, - delete_on_termination: delete_on_termination, - description: description, - device_index: device_index, - groups: groups, - interface_type: interface_type, - ipv6_address_count: ipv6_address_count, - ipv6_addresses: ipv6_addresses, - network_card_index: network_card_index, - network_interface_id: network_interface_id, - private_ip_address: private_ip_address, - private_ip_addresses: private_ip_addresses, - secondary_private_ip_address_count: secondary_private_ip_address_count, - subnet_id: subnet_id, + Ok(Icmp { + code: code, + r#type: r#type, }) } } @@ -13727,142 +18217,64 @@ pub mod launch_template { } } - /// The [`AWS::EC2::LaunchTemplate.Placement`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-placement.html) property type. + /// The [`AWS::EC2::NetworkAclEntry.PortRange`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkaclentry-portrange.html) property type. #[derive(Debug, Default)] - pub struct Placement { - /// Property [`Affinity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-placement.html#cfn-ec2-launchtemplate-launchtemplatedata-placement-affinity). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub affinity: Option<::Value>, - /// Property [`AvailabilityZone`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-placement.html#cfn-ec2-launchtemplate-launchtemplatedata-placement-availabilityzone). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub availability_zone: Option<::Value>, - /// Property [`GroupName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-placement.html#cfn-ec2-launchtemplate-launchtemplatedata-placement-groupname). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub group_name: Option<::Value>, - /// Property [`HostId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-placement.html#cfn-ec2-launchtemplate-launchtemplatedata-placement-hostid). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub host_id: Option<::Value>, - /// Property [`HostResourceGroupArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-placement.html#cfn-ec2-launchtemplate-launchtemplatedata-placement-hostresourcegrouparn). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub host_resource_group_arn: Option<::Value>, - /// Property [`PartitionNumber`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-placement.html#cfn-ec2-launchtemplate-launchtemplatedata-placement-partitionnumber). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub partition_number: Option<::Value>, - /// Property [`SpreadDomain`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-placement.html#cfn-ec2-launchtemplate-launchtemplatedata-placement-spreaddomain). + pub struct PortRange { + /// Property [`From`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkaclentry-portrange.html#cfn-ec2-networkaclentry-portrange-from). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub spread_domain: Option<::Value>, - /// Property [`Tenancy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-placement.html#cfn-ec2-launchtemplate-launchtemplatedata-placement-tenancy). + pub from: Option<::Value>, + /// Property [`To`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkaclentry-portrange.html#cfn-ec2-networkaclentry-portrange-to). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub tenancy: Option<::Value>, + pub to: Option<::Value>, } - impl ::codec::SerializeValue for Placement { + impl ::codec::SerializeValue for PortRange { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref affinity) = self.affinity { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Affinity", affinity)?; - } - if let Some(ref availability_zone) = self.availability_zone { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AvailabilityZone", availability_zone)?; - } - if let Some(ref group_name) = self.group_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupName", group_name)?; - } - if let Some(ref host_id) = self.host_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "HostId", host_id)?; - } - if let Some(ref host_resource_group_arn) = self.host_resource_group_arn { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "HostResourceGroupArn", host_resource_group_arn)?; - } - if let Some(ref partition_number) = self.partition_number { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PartitionNumber", partition_number)?; - } - if let Some(ref spread_domain) = self.spread_domain { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpreadDomain", spread_domain)?; + if let Some(ref from) = self.from { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "From", from)?; } - if let Some(ref tenancy) = self.tenancy { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tenancy", tenancy)?; + if let Some(ref to) = self.to { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "To", to)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for Placement { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for PortRange { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = Placement; + type Value = PortRange; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type Placement") + write!(f, "a struct of type PortRange") } fn visit_map>(self, mut map: A) -> Result { - let mut affinity: Option<::Value> = None; - let mut availability_zone: Option<::Value> = None; - let mut group_name: Option<::Value> = None; - let mut host_id: Option<::Value> = None; - let mut host_resource_group_arn: Option<::Value> = None; - let mut partition_number: Option<::Value> = None; - let mut spread_domain: Option<::Value> = None; - let mut tenancy: Option<::Value> = None; + let mut from: Option<::Value> = None; + let mut to: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Affinity" => { - affinity = ::serde::de::MapAccess::next_value(&mut map)?; - } - "AvailabilityZone" => { - availability_zone = ::serde::de::MapAccess::next_value(&mut map)?; - } - "GroupName" => { - group_name = ::serde::de::MapAccess::next_value(&mut map)?; - } - "HostId" => { - host_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "HostResourceGroupArn" => { - host_resource_group_arn = ::serde::de::MapAccess::next_value(&mut map)?; - } - "PartitionNumber" => { - partition_number = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SpreadDomain" => { - spread_domain = ::serde::de::MapAccess::next_value(&mut map)?; + "From" => { + from = ::serde::de::MapAccess::next_value(&mut map)?; } - "Tenancy" => { - tenancy = ::serde::de::MapAccess::next_value(&mut map)?; + "To" => { + to = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(Placement { - affinity: affinity, - availability_zone: availability_zone, - group_name: group_name, - host_id: host_id, - host_resource_group_arn: host_resource_group_arn, - partition_number: partition_number, - spread_domain: spread_domain, - tenancy: tenancy, + Ok(PortRange { + from: from, + to: to, }) } } @@ -13870,65 +18282,82 @@ pub mod launch_template { d.deserialize_map(Visitor) } } +} - /// The [`AWS::EC2::LaunchTemplate.PrivateIpAdd`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-privateipadd.html) property type. +pub mod network_insights_access_scope { + //! Property types for the `NetworkInsightsAccessScope` resource. + + /// The [`AWS::EC2::NetworkInsightsAccessScope.AccessScopePathRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-accessscopepathrequest.html) property type. #[derive(Debug, Default)] - pub struct PrivateIpAdd { - /// Property [`Primary`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-privateipadd.html#cfn-ec2-launchtemplate-privateipadd-primary). + pub struct AccessScopePathRequest { + /// Property [`Destination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-accessscopepathrequest.html#cfn-ec2-networkinsightsaccessscope-accessscopepathrequest-destination). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub primary: Option<::Value>, - /// Property [`PrivateIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-privateipadd.html#cfn-ec2-launchtemplate-privateipadd-privateipaddress). + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub destination: Option<::Value>, + /// Property [`Source`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-accessscopepathrequest.html#cfn-ec2-networkinsightsaccessscope-accessscopepathrequest-source). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub private_ip_address: Option<::Value>, + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub source: Option<::Value>, + /// Property [`ThroughResources`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-accessscopepathrequest.html#cfn-ec2-networkinsightsaccessscope-accessscopepathrequest-throughresources). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub through_resources: Option<::ValueList>, } - impl ::codec::SerializeValue for PrivateIpAdd { + impl ::codec::SerializeValue for AccessScopePathRequest { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref primary) = self.primary { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Primary", primary)?; + if let Some(ref destination) = self.destination { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Destination", destination)?; } - if let Some(ref private_ip_address) = self.private_ip_address { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrivateIpAddress", private_ip_address)?; + if let Some(ref source) = self.source { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Source", source)?; + } + if let Some(ref through_resources) = self.through_resources { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ThroughResources", through_resources)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for PrivateIpAdd { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for AccessScopePathRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = PrivateIpAdd; + type Value = AccessScopePathRequest; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type PrivateIpAdd") + write!(f, "a struct of type AccessScopePathRequest") } fn visit_map>(self, mut map: A) -> Result { - let mut primary: Option<::Value> = None; - let mut private_ip_address: Option<::Value> = None; + let mut destination: Option<::Value> = None; + let mut source: Option<::Value> = None; + let mut through_resources: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Primary" => { - primary = ::serde::de::MapAccess::next_value(&mut map)?; + "Destination" => { + destination = ::serde::de::MapAccess::next_value(&mut map)?; } - "PrivateIpAddress" => { - private_ip_address = ::serde::de::MapAccess::next_value(&mut map)?; + "Source" => { + source = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ThroughResources" => { + through_resources = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(PrivateIpAdd { - primary: primary, - private_ip_address: private_ip_address, + Ok(AccessScopePathRequest { + destination: destination, + source: source, + through_resources: through_resources, }) } } @@ -13937,103 +18366,129 @@ pub mod launch_template { } } - /// The [`AWS::EC2::LaunchTemplate.SpotOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions.html) property type. + /// The [`AWS::EC2::NetworkInsightsAccessScope.PacketHeaderStatementRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-packetheaderstatementrequest.html) property type. #[derive(Debug, Default)] - pub struct SpotOptions { - /// Property [`BlockDurationMinutes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions-blockdurationminutes). + pub struct PacketHeaderStatementRequest { + /// Property [`DestinationAddresses`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-packetheaderstatementrequest.html#cfn-ec2-networkinsightsaccessscope-packetheaderstatementrequest-destinationaddresses). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub block_duration_minutes: Option<::Value>, - /// Property [`InstanceInterruptionBehavior`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions-instanceinterruptionbehavior). + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub destination_addresses: Option<::ValueList>, + /// Property [`DestinationPorts`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-packetheaderstatementrequest.html#cfn-ec2-networkinsightsaccessscope-packetheaderstatementrequest-destinationports). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub instance_interruption_behavior: Option<::Value>, - /// Property [`MaxPrice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions-maxprice). + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub destination_ports: Option<::ValueList>, + /// Property [`DestinationPrefixLists`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-packetheaderstatementrequest.html#cfn-ec2-networkinsightsaccessscope-packetheaderstatementrequest-destinationprefixlists). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub max_price: Option<::Value>, - /// Property [`SpotInstanceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions-spotinstancetype). + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub destination_prefix_lists: Option<::ValueList>, + /// Property [`Protocols`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-packetheaderstatementrequest.html#cfn-ec2-networkinsightsaccessscope-packetheaderstatementrequest-protocols). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub spot_instance_type: Option<::Value>, - /// Property [`ValidUntil`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions.html#cfn-ec2-launchtemplate-launchtemplatedata-instancemarketoptions-spotoptions-validuntil). + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub protocols: Option<::ValueList>, + /// Property [`SourceAddresses`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-packetheaderstatementrequest.html#cfn-ec2-networkinsightsaccessscope-packetheaderstatementrequest-sourceaddresses). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub valid_until: Option<::Value>, + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub source_addresses: Option<::ValueList>, + /// Property [`SourcePorts`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-packetheaderstatementrequest.html#cfn-ec2-networkinsightsaccessscope-packetheaderstatementrequest-sourceports). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub source_ports: Option<::ValueList>, + /// Property [`SourcePrefixLists`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-packetheaderstatementrequest.html#cfn-ec2-networkinsightsaccessscope-packetheaderstatementrequest-sourceprefixlists). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub source_prefix_lists: Option<::ValueList>, } - impl ::codec::SerializeValue for SpotOptions { + impl ::codec::SerializeValue for PacketHeaderStatementRequest { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref block_duration_minutes) = self.block_duration_minutes { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "BlockDurationMinutes", block_duration_minutes)?; + if let Some(ref destination_addresses) = self.destination_addresses { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationAddresses", destination_addresses)?; } - if let Some(ref instance_interruption_behavior) = self.instance_interruption_behavior { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceInterruptionBehavior", instance_interruption_behavior)?; + if let Some(ref destination_ports) = self.destination_ports { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationPorts", destination_ports)?; } - if let Some(ref max_price) = self.max_price { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxPrice", max_price)?; + if let Some(ref destination_prefix_lists) = self.destination_prefix_lists { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationPrefixLists", destination_prefix_lists)?; } - if let Some(ref spot_instance_type) = self.spot_instance_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpotInstanceType", spot_instance_type)?; + if let Some(ref protocols) = self.protocols { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Protocols", protocols)?; } - if let Some(ref valid_until) = self.valid_until { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ValidUntil", valid_until)?; + if let Some(ref source_addresses) = self.source_addresses { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourceAddresses", source_addresses)?; + } + if let Some(ref source_ports) = self.source_ports { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourcePorts", source_ports)?; + } + if let Some(ref source_prefix_lists) = self.source_prefix_lists { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourcePrefixLists", source_prefix_lists)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for SpotOptions { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for PacketHeaderStatementRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = SpotOptions; + type Value = PacketHeaderStatementRequest; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type SpotOptions") + write!(f, "a struct of type PacketHeaderStatementRequest") } fn visit_map>(self, mut map: A) -> Result { - let mut block_duration_minutes: Option<::Value> = None; - let mut instance_interruption_behavior: Option<::Value> = None; - let mut max_price: Option<::Value> = None; - let mut spot_instance_type: Option<::Value> = None; - let mut valid_until: Option<::Value> = None; + let mut destination_addresses: Option<::ValueList> = None; + let mut destination_ports: Option<::ValueList> = None; + let mut destination_prefix_lists: Option<::ValueList> = None; + let mut protocols: Option<::ValueList> = None; + let mut source_addresses: Option<::ValueList> = None; + let mut source_ports: Option<::ValueList> = None; + let mut source_prefix_lists: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "BlockDurationMinutes" => { - block_duration_minutes = ::serde::de::MapAccess::next_value(&mut map)?; + "DestinationAddresses" => { + destination_addresses = ::serde::de::MapAccess::next_value(&mut map)?; } - "InstanceInterruptionBehavior" => { - instance_interruption_behavior = ::serde::de::MapAccess::next_value(&mut map)?; + "DestinationPorts" => { + destination_ports = ::serde::de::MapAccess::next_value(&mut map)?; } - "MaxPrice" => { - max_price = ::serde::de::MapAccess::next_value(&mut map)?; + "DestinationPrefixLists" => { + destination_prefix_lists = ::serde::de::MapAccess::next_value(&mut map)?; } - "SpotInstanceType" => { - spot_instance_type = ::serde::de::MapAccess::next_value(&mut map)?; + "Protocols" => { + protocols = ::serde::de::MapAccess::next_value(&mut map)?; } - "ValidUntil" => { - valid_until = ::serde::de::MapAccess::next_value(&mut map)?; + "SourceAddresses" => { + source_addresses = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SourcePorts" => { + source_ports = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SourcePrefixLists" => { + source_prefix_lists = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(SpotOptions { - block_duration_minutes: block_duration_minutes, - instance_interruption_behavior: instance_interruption_behavior, - max_price: max_price, - spot_instance_type: spot_instance_type, - valid_until: valid_until, + Ok(PacketHeaderStatementRequest { + destination_addresses: destination_addresses, + destination_ports: destination_ports, + destination_prefix_lists: destination_prefix_lists, + protocols: protocols, + source_addresses: source_addresses, + source_ports: source_ports, + source_prefix_lists: source_prefix_lists, }) } } @@ -14042,64 +18497,64 @@ pub mod launch_template { } } - /// The [`AWS::EC2::LaunchTemplate.TagSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-tagspecification.html) property type. + /// The [`AWS::EC2::NetworkInsightsAccessScope.PathStatementRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-pathstatementrequest.html) property type. #[derive(Debug, Default)] - pub struct TagSpecification { - /// Property [`ResourceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-tagspecification.html#cfn-ec2-launchtemplate-tagspecification-resourcetype). + pub struct PathStatementRequest { + /// Property [`PacketHeaderStatement`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-pathstatementrequest.html#cfn-ec2-networkinsightsaccessscope-pathstatementrequest-packetheaderstatement). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub resource_type: Option<::Value>, - /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-tagspecification.html#cfn-ec2-launchtemplate-tagspecification-tags). + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub packet_header_statement: Option<::Value>, + /// Property [`ResourceStatement`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-pathstatementrequest.html#cfn-ec2-networkinsightsaccessscope-pathstatementrequest-resourcestatement). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub tags: Option<::ValueList<::Tag>>, + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub resource_statement: Option<::Value>, } - impl ::codec::SerializeValue for TagSpecification { + impl ::codec::SerializeValue for PathStatementRequest { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref resource_type) = self.resource_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceType", resource_type)?; + if let Some(ref packet_header_statement) = self.packet_header_statement { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PacketHeaderStatement", packet_header_statement)?; } - if let Some(ref tags) = self.tags { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + if let Some(ref resource_statement) = self.resource_statement { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceStatement", resource_statement)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for TagSpecification { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for PathStatementRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = TagSpecification; + type Value = PathStatementRequest; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type TagSpecification") + write!(f, "a struct of type PathStatementRequest") } fn visit_map>(self, mut map: A) -> Result { - let mut resource_type: Option<::Value> = None; - let mut tags: Option<::ValueList<::Tag>> = None; + let mut packet_header_statement: Option<::Value> = None; + let mut resource_statement: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "ResourceType" => { - resource_type = ::serde::de::MapAccess::next_value(&mut map)?; + "PacketHeaderStatement" => { + packet_header_statement = ::serde::de::MapAccess::next_value(&mut map)?; } - "Tags" => { - tags = ::serde::de::MapAccess::next_value(&mut map)?; + "ResourceStatement" => { + resource_statement = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(TagSpecification { - resource_type: resource_type, - tags: tags, + Ok(PathStatementRequest { + packet_header_statement: packet_header_statement, + resource_statement: resource_statement, }) } } @@ -14107,69 +18562,65 @@ pub mod launch_template { d.deserialize_map(Visitor) } } -} -pub mod network_acl_entry { - //! Property types for the `NetworkAclEntry` resource. - - /// The [`AWS::EC2::NetworkAclEntry.Icmp`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkaclentry-icmp.html) property type. + /// The [`AWS::EC2::NetworkInsightsAccessScope.ResourceStatementRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-resourcestatementrequest.html) property type. #[derive(Debug, Default)] - pub struct Icmp { - /// Property [`Code`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkaclentry-icmp.html#cfn-ec2-networkaclentry-icmp-code). + pub struct ResourceStatementRequest { + /// Property [`ResourceTypes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-resourcestatementrequest.html#cfn-ec2-networkinsightsaccessscope-resourcestatementrequest-resourcetypes). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub code: Option<::Value>, - /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkaclentry-icmp.html#cfn-ec2-networkaclentry-icmp-type). + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub resource_types: Option<::ValueList>, + /// Property [`Resources`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-resourcestatementrequest.html#cfn-ec2-networkinsightsaccessscope-resourcestatementrequest-resources). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub r#type: Option<::Value>, + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub resources: Option<::ValueList>, } - impl ::codec::SerializeValue for Icmp { + impl ::codec::SerializeValue for ResourceStatementRequest { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref code) = self.code { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Code", code)?; + if let Some(ref resource_types) = self.resource_types { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceTypes", resource_types)?; } - if let Some(ref r#type) = self.r#type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", r#type)?; + if let Some(ref resources) = self.resources { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Resources", resources)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for Icmp { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for ResourceStatementRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = Icmp; + type Value = ResourceStatementRequest; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type Icmp") + write!(f, "a struct of type ResourceStatementRequest") } fn visit_map>(self, mut map: A) -> Result { - let mut code: Option<::Value> = None; - let mut r#type: Option<::Value> = None; + let mut resource_types: Option<::ValueList> = None; + let mut resources: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Code" => { - code = ::serde::de::MapAccess::next_value(&mut map)?; + "ResourceTypes" => { + resource_types = ::serde::de::MapAccess::next_value(&mut map)?; } - "Type" => { - r#type = ::serde::de::MapAccess::next_value(&mut map)?; + "Resources" => { + resources = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(Icmp { - code: code, - r#type: r#type, + Ok(ResourceStatementRequest { + resource_types: resource_types, + resources: resources, }) } } @@ -14178,64 +18629,51 @@ pub mod network_acl_entry { } } - /// The [`AWS::EC2::NetworkAclEntry.PortRange`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkaclentry-portrange.html) property type. + /// The [`AWS::EC2::NetworkInsightsAccessScope.ThroughResourcesStatementRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-throughresourcesstatementrequest.html) property type. #[derive(Debug, Default)] - pub struct PortRange { - /// Property [`From`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkaclentry-portrange.html#cfn-ec2-networkaclentry-portrange-from). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub from: Option<::Value>, - /// Property [`To`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkaclentry-portrange.html#cfn-ec2-networkaclentry-portrange-to). + pub struct ThroughResourcesStatementRequest { + /// Property [`ResourceStatement`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinsightsaccessscope-throughresourcesstatementrequest.html#cfn-ec2-networkinsightsaccessscope-throughresourcesstatementrequest-resourcestatement). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub to: Option<::Value>, + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub resource_statement: Option<::Value>, } - impl ::codec::SerializeValue for PortRange { + impl ::codec::SerializeValue for ThroughResourcesStatementRequest { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref from) = self.from { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "From", from)?; - } - if let Some(ref to) = self.to { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "To", to)?; + if let Some(ref resource_statement) = self.resource_statement { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceStatement", resource_statement)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for PortRange { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for ThroughResourcesStatementRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = PortRange; + type Value = ThroughResourcesStatementRequest; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type PortRange") + write!(f, "a struct of type ThroughResourcesStatementRequest") } fn visit_map>(self, mut map: A) -> Result { - let mut from: Option<::Value> = None; - let mut to: Option<::Value> = None; + let mut resource_statement: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "From" => { - from = ::serde::de::MapAccess::next_value(&mut map)?; - } - "To" => { - to = ::serde::de::MapAccess::next_value(&mut map)?; + "ResourceStatement" => { + resource_statement = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(PortRange { - from: from, - to: to, + Ok(ThroughResourcesStatementRequest { + resource_statement: resource_statement, }) } } @@ -15978,15 +20416,15 @@ pub mod network_interface { } } - /// The [`AWS::EC2::NetworkInterface.PrivateIpAddressSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-interface-privateipspec.html) property type. + /// The [`AWS::EC2::NetworkInterface.PrivateIpAddressSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinterface-privateipaddressspecification.html) property type. #[derive(Debug, Default)] pub struct PrivateIpAddressSpecification { - /// Property [`Primary`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-interface-privateipspec.html#cfn-ec2-networkinterface-privateipspecification-primary). + /// Property [`Primary`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinterface-privateipaddressspecification.html#cfn-ec2-networkinterface-privateipaddressspecification-primary). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub primary: ::Value, - /// Property [`PrivateIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-network-interface-privateipspec.html#cfn-ec2-networkinterface-privateipspecification-privateipaddress). + /// Property [`PrivateIpAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-networkinterface-privateipaddressspecification.html#cfn-ec2-networkinterface-privateipaddressspecification-privateipaddress). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. @@ -16426,6 +20864,204 @@ pub mod security_group { pub mod spot_fleet { //! Property types for the `SpotFleet` resource. + /// The [`AWS::EC2::SpotFleet.AcceleratorCountRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-acceleratorcountrequest.html) property type. + #[derive(Debug, Default)] + pub struct AcceleratorCountRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-acceleratorcountrequest.html#cfn-ec2-spotfleet-acceleratorcountrequest-max). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-acceleratorcountrequest.html#cfn-ec2-spotfleet-acceleratorcountrequest-min). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub min: Option<::Value>, + } + + impl ::codec::SerializeValue for AcceleratorCountRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AcceleratorCountRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AcceleratorCountRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AcceleratorCountRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AcceleratorCountRequest { + max: max, + min: min, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::SpotFleet.AcceleratorTotalMemoryMiBRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-acceleratortotalmemorymibrequest.html) property type. + #[derive(Debug, Default)] + pub struct AcceleratorTotalMemoryMiBRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-acceleratortotalmemorymibrequest.html#cfn-ec2-spotfleet-acceleratortotalmemorymibrequest-max). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-acceleratortotalmemorymibrequest.html#cfn-ec2-spotfleet-acceleratortotalmemorymibrequest-min). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub min: Option<::Value>, + } + + impl ::codec::SerializeValue for AcceleratorTotalMemoryMiBRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AcceleratorTotalMemoryMiBRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AcceleratorTotalMemoryMiBRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AcceleratorTotalMemoryMiBRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AcceleratorTotalMemoryMiBRequest { + max: max, + min: min, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::SpotFleet.BaselineEbsBandwidthMbpsRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-baselineebsbandwidthmbpsrequest.html) property type. + #[derive(Debug, Default)] + pub struct BaselineEbsBandwidthMbpsRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-baselineebsbandwidthmbpsrequest.html#cfn-ec2-spotfleet-baselineebsbandwidthmbpsrequest-max). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-baselineebsbandwidthmbpsrequest.html#cfn-ec2-spotfleet-baselineebsbandwidthmbpsrequest-min). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub min: Option<::Value>, + } + + impl ::codec::SerializeValue for BaselineEbsBandwidthMbpsRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for BaselineEbsBandwidthMbpsRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = BaselineEbsBandwidthMbpsRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type BaselineEbsBandwidthMbpsRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(BaselineEbsBandwidthMbpsRequest { + max: max, + min: min, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::EC2::SpotFleet.BlockDeviceMapping`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-blockdevicemapping.html) property type. #[derive(Debug, Default)] pub struct BlockDeviceMapping { @@ -17151,6 +21787,319 @@ pub mod spot_fleet { } } + /// The [`AWS::EC2::SpotFleet.InstanceRequirementsRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html) property type. + #[derive(Debug, Default)] + pub struct InstanceRequirementsRequest { + /// Property [`AcceleratorCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-acceleratorcount). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub accelerator_count: Option<::Value>, + /// Property [`AcceleratorManufacturers`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-acceleratormanufacturers). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub accelerator_manufacturers: Option<::ValueList>, + /// Property [`AcceleratorNames`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-acceleratornames). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub accelerator_names: Option<::ValueList>, + /// Property [`AcceleratorTotalMemoryMiB`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-acceleratortotalmemorymib). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub accelerator_total_memory_mi_b: Option<::Value>, + /// Property [`AcceleratorTypes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-acceleratortypes). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub accelerator_types: Option<::ValueList>, + /// Property [`BareMetal`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-baremetal). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub bare_metal: Option<::Value>, + /// Property [`BaselineEbsBandwidthMbps`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-baselineebsbandwidthmbps). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub baseline_ebs_bandwidth_mbps: Option<::Value>, + /// Property [`BurstablePerformance`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-burstableperformance). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub burstable_performance: Option<::Value>, + /// Property [`CpuManufacturers`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-cpumanufacturers). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub cpu_manufacturers: Option<::ValueList>, + /// Property [`ExcludedInstanceTypes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-excludedinstancetypes). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub excluded_instance_types: Option<::ValueList>, + /// Property [`InstanceGenerations`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-instancegenerations). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub instance_generations: Option<::ValueList>, + /// Property [`LocalStorage`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-localstorage). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub local_storage: Option<::Value>, + /// Property [`LocalStorageTypes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-localstoragetypes). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub local_storage_types: Option<::ValueList>, + /// Property [`MemoryGiBPerVCpu`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-memorygibpervcpu). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub memory_gi_b_per_v_cpu: Option<::Value>, + /// Property [`MemoryMiB`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-memorymib). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub memory_mi_b: Option<::Value>, + /// Property [`NetworkInterfaceCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-networkinterfacecount). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub network_interface_count: Option<::Value>, + /// Property [`OnDemandMaxPricePercentageOverLowestPrice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-ondemandmaxpricepercentageoverlowestprice). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub on_demand_max_price_percentage_over_lowest_price: Option<::Value>, + /// Property [`RequireHibernateSupport`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-requirehibernatesupport). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub require_hibernate_support: Option<::Value>, + /// Property [`SpotMaxPricePercentageOverLowestPrice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-spotmaxpricepercentageoverlowestprice). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub spot_max_price_percentage_over_lowest_price: Option<::Value>, + /// Property [`TotalLocalStorageGB`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-totallocalstoragegb). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub total_local_storage_gb: Option<::Value>, + /// Property [`VCpuCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-instancerequirementsrequest.html#cfn-ec2-spotfleet-instancerequirementsrequest-vcpucount). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub v_cpu_count: Option<::Value>, + } + + impl ::codec::SerializeValue for InstanceRequirementsRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref accelerator_count) = self.accelerator_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcceleratorCount", accelerator_count)?; + } + if let Some(ref accelerator_manufacturers) = self.accelerator_manufacturers { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcceleratorManufacturers", accelerator_manufacturers)?; + } + if let Some(ref accelerator_names) = self.accelerator_names { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcceleratorNames", accelerator_names)?; + } + if let Some(ref accelerator_total_memory_mi_b) = self.accelerator_total_memory_mi_b { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcceleratorTotalMemoryMiB", accelerator_total_memory_mi_b)?; + } + if let Some(ref accelerator_types) = self.accelerator_types { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcceleratorTypes", accelerator_types)?; + } + if let Some(ref bare_metal) = self.bare_metal { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BareMetal", bare_metal)?; + } + if let Some(ref baseline_ebs_bandwidth_mbps) = self.baseline_ebs_bandwidth_mbps { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BaselineEbsBandwidthMbps", baseline_ebs_bandwidth_mbps)?; + } + if let Some(ref burstable_performance) = self.burstable_performance { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BurstablePerformance", burstable_performance)?; + } + if let Some(ref cpu_manufacturers) = self.cpu_manufacturers { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CpuManufacturers", cpu_manufacturers)?; + } + if let Some(ref excluded_instance_types) = self.excluded_instance_types { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExcludedInstanceTypes", excluded_instance_types)?; + } + if let Some(ref instance_generations) = self.instance_generations { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceGenerations", instance_generations)?; + } + if let Some(ref local_storage) = self.local_storage { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LocalStorage", local_storage)?; + } + if let Some(ref local_storage_types) = self.local_storage_types { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LocalStorageTypes", local_storage_types)?; + } + if let Some(ref memory_gi_b_per_v_cpu) = self.memory_gi_b_per_v_cpu { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MemoryGiBPerVCpu", memory_gi_b_per_v_cpu)?; + } + if let Some(ref memory_mi_b) = self.memory_mi_b { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MemoryMiB", memory_mi_b)?; + } + if let Some(ref network_interface_count) = self.network_interface_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkInterfaceCount", network_interface_count)?; + } + if let Some(ref on_demand_max_price_percentage_over_lowest_price) = self.on_demand_max_price_percentage_over_lowest_price { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OnDemandMaxPricePercentageOverLowestPrice", on_demand_max_price_percentage_over_lowest_price)?; + } + if let Some(ref require_hibernate_support) = self.require_hibernate_support { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RequireHibernateSupport", require_hibernate_support)?; + } + if let Some(ref spot_max_price_percentage_over_lowest_price) = self.spot_max_price_percentage_over_lowest_price { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpotMaxPricePercentageOverLowestPrice", spot_max_price_percentage_over_lowest_price)?; + } + if let Some(ref total_local_storage_gb) = self.total_local_storage_gb { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TotalLocalStorageGB", total_local_storage_gb)?; + } + if let Some(ref v_cpu_count) = self.v_cpu_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VCpuCount", v_cpu_count)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for InstanceRequirementsRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = InstanceRequirementsRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type InstanceRequirementsRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut accelerator_count: Option<::Value> = None; + let mut accelerator_manufacturers: Option<::ValueList> = None; + let mut accelerator_names: Option<::ValueList> = None; + let mut accelerator_total_memory_mi_b: Option<::Value> = None; + let mut accelerator_types: Option<::ValueList> = None; + let mut bare_metal: Option<::Value> = None; + let mut baseline_ebs_bandwidth_mbps: Option<::Value> = None; + let mut burstable_performance: Option<::Value> = None; + let mut cpu_manufacturers: Option<::ValueList> = None; + let mut excluded_instance_types: Option<::ValueList> = None; + let mut instance_generations: Option<::ValueList> = None; + let mut local_storage: Option<::Value> = None; + let mut local_storage_types: Option<::ValueList> = None; + let mut memory_gi_b_per_v_cpu: Option<::Value> = None; + let mut memory_mi_b: Option<::Value> = None; + let mut network_interface_count: Option<::Value> = None; + let mut on_demand_max_price_percentage_over_lowest_price: Option<::Value> = None; + let mut require_hibernate_support: Option<::Value> = None; + let mut spot_max_price_percentage_over_lowest_price: Option<::Value> = None; + let mut total_local_storage_gb: Option<::Value> = None; + let mut v_cpu_count: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AcceleratorCount" => { + accelerator_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AcceleratorManufacturers" => { + accelerator_manufacturers = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AcceleratorNames" => { + accelerator_names = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AcceleratorTotalMemoryMiB" => { + accelerator_total_memory_mi_b = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AcceleratorTypes" => { + accelerator_types = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BareMetal" => { + bare_metal = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BaselineEbsBandwidthMbps" => { + baseline_ebs_bandwidth_mbps = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BurstablePerformance" => { + burstable_performance = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CpuManufacturers" => { + cpu_manufacturers = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ExcludedInstanceTypes" => { + excluded_instance_types = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InstanceGenerations" => { + instance_generations = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LocalStorage" => { + local_storage = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LocalStorageTypes" => { + local_storage_types = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MemoryGiBPerVCpu" => { + memory_gi_b_per_v_cpu = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MemoryMiB" => { + memory_mi_b = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NetworkInterfaceCount" => { + network_interface_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OnDemandMaxPricePercentageOverLowestPrice" => { + on_demand_max_price_percentage_over_lowest_price = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RequireHibernateSupport" => { + require_hibernate_support = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SpotMaxPricePercentageOverLowestPrice" => { + spot_max_price_percentage_over_lowest_price = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TotalLocalStorageGB" => { + total_local_storage_gb = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VCpuCount" => { + v_cpu_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(InstanceRequirementsRequest { + accelerator_count: accelerator_count, + accelerator_manufacturers: accelerator_manufacturers, + accelerator_names: accelerator_names, + accelerator_total_memory_mi_b: accelerator_total_memory_mi_b, + accelerator_types: accelerator_types, + bare_metal: bare_metal, + baseline_ebs_bandwidth_mbps: baseline_ebs_bandwidth_mbps, + burstable_performance: burstable_performance, + cpu_manufacturers: cpu_manufacturers, + excluded_instance_types: excluded_instance_types, + instance_generations: instance_generations, + local_storage: local_storage, + local_storage_types: local_storage_types, + memory_gi_b_per_v_cpu: memory_gi_b_per_v_cpu, + memory_mi_b: memory_mi_b, + network_interface_count: network_interface_count, + on_demand_max_price_percentage_over_lowest_price: on_demand_max_price_percentage_over_lowest_price, + require_hibernate_support: require_hibernate_support, + spot_max_price_percentage_over_lowest_price: spot_max_price_percentage_over_lowest_price, + total_local_storage_gb: total_local_storage_gb, + v_cpu_count: v_cpu_count, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::EC2::SpotFleet.LaunchTemplateConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-launchtemplateconfig.html) property type. #[derive(Debug, Default)] pub struct LaunchTemplateConfig { @@ -17225,11 +22174,21 @@ pub mod spot_fleet { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub availability_zone: Option<::Value>, + /// Property [`InstanceRequirements`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-launchtemplateoverrides.html#cfn-ec2-spotfleet-launchtemplateoverrides-instancerequirements). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub instance_requirements: Option<::Value>, /// Property [`InstanceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-launchtemplateoverrides.html#cfn-ec2-spotfleet-launchtemplateoverrides-instancetype). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub instance_type: Option<::Value>, + /// Property [`Priority`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-launchtemplateoverrides.html#cfn-ec2-spotfleet-launchtemplateoverrides-priority). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub priority: Option<::Value>, /// Property [`SpotPrice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-launchtemplateoverrides.html#cfn-ec2-spotfleet-launchtemplateoverrides-spotprice). /// /// Update type: _Immutable_. @@ -17253,9 +22212,15 @@ pub mod spot_fleet { if let Some(ref availability_zone) = self.availability_zone { ::serde::ser::SerializeMap::serialize_entry(&mut map, "AvailabilityZone", availability_zone)?; } + if let Some(ref instance_requirements) = self.instance_requirements { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceRequirements", instance_requirements)?; + } if let Some(ref instance_type) = self.instance_type { ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceType", instance_type)?; } + if let Some(ref priority) = self.priority { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Priority", priority)?; + } if let Some(ref spot_price) = self.spot_price { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpotPrice", spot_price)?; } @@ -17282,7 +22247,9 @@ pub mod spot_fleet { fn visit_map>(self, mut map: A) -> Result { let mut availability_zone: Option<::Value> = None; + let mut instance_requirements: Option<::Value> = None; let mut instance_type: Option<::Value> = None; + let mut priority: Option<::Value> = None; let mut spot_price: Option<::Value> = None; let mut subnet_id: Option<::Value> = None; let mut weighted_capacity: Option<::Value> = None; @@ -17292,9 +22259,15 @@ pub mod spot_fleet { "AvailabilityZone" => { availability_zone = ::serde::de::MapAccess::next_value(&mut map)?; } + "InstanceRequirements" => { + instance_requirements = ::serde::de::MapAccess::next_value(&mut map)?; + } "InstanceType" => { instance_type = ::serde::de::MapAccess::next_value(&mut map)?; } + "Priority" => { + priority = ::serde::de::MapAccess::next_value(&mut map)?; + } "SpotPrice" => { spot_price = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -17310,7 +22283,9 @@ pub mod spot_fleet { Ok(LaunchTemplateOverrides { availability_zone: availability_zone, + instance_requirements: instance_requirements, instance_type: instance_type, + priority: priority, spot_price: spot_price, subnet_id: subnet_id, weighted_capacity: weighted_capacity, @@ -17388,6 +22363,204 @@ pub mod spot_fleet { } } + /// The [`AWS::EC2::SpotFleet.MemoryGiBPerVCpuRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-memorygibpervcpurequest.html) property type. + #[derive(Debug, Default)] + pub struct MemoryGiBPerVCpuRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-memorygibpervcpurequest.html#cfn-ec2-spotfleet-memorygibpervcpurequest-max). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-memorygibpervcpurequest.html#cfn-ec2-spotfleet-memorygibpervcpurequest-min). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub min: Option<::Value>, + } + + impl ::codec::SerializeValue for MemoryGiBPerVCpuRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for MemoryGiBPerVCpuRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MemoryGiBPerVCpuRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MemoryGiBPerVCpuRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(MemoryGiBPerVCpuRequest { + max: max, + min: min, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::SpotFleet.MemoryMiBRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-memorymibrequest.html) property type. + #[derive(Debug, Default)] + pub struct MemoryMiBRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-memorymibrequest.html#cfn-ec2-spotfleet-memorymibrequest-max). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-memorymibrequest.html#cfn-ec2-spotfleet-memorymibrequest-min). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub min: Option<::Value>, + } + + impl ::codec::SerializeValue for MemoryMiBRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for MemoryMiBRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MemoryMiBRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MemoryMiBRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(MemoryMiBRequest { + max: max, + min: min, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::SpotFleet.NetworkInterfaceCountRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-networkinterfacecountrequest.html) property type. + #[derive(Debug, Default)] + pub struct NetworkInterfaceCountRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-networkinterfacecountrequest.html#cfn-ec2-spotfleet-networkinterfacecountrequest-max). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-networkinterfacecountrequest.html#cfn-ec2-spotfleet-networkinterfacecountrequest-min). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub min: Option<::Value>, + } + + impl ::codec::SerializeValue for NetworkInterfaceCountRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for NetworkInterfaceCountRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = NetworkInterfaceCountRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type NetworkInterfaceCountRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(NetworkInterfaceCountRequest { + max: max, + min: min, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::EC2::SpotFleet.PrivateIpAddressSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-privateipaddressspecification.html) property type. #[derive(Debug, Default)] pub struct PrivateIpAddressSpecification { @@ -17460,6 +22633,11 @@ pub mod spot_fleet { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub replacement_strategy: Option<::Value>, + /// Property [`TerminationDelay`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotcapacityrebalance.html#cfn-ec2-spotfleet-spotcapacityrebalance-terminationdelay). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub termination_delay: Option<::Value>, } impl ::codec::SerializeValue for SpotCapacityRebalance { @@ -17468,6 +22646,9 @@ pub mod spot_fleet { if let Some(ref replacement_strategy) = self.replacement_strategy { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReplacementStrategy", replacement_strategy)?; } + if let Some(ref termination_delay) = self.termination_delay { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TerminationDelay", termination_delay)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -17485,18 +22666,23 @@ pub mod spot_fleet { fn visit_map>(self, mut map: A) -> Result { let mut replacement_strategy: Option<::Value> = None; + let mut termination_delay: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { "ReplacementStrategy" => { replacement_strategy = ::serde::de::MapAccess::next_value(&mut map)?; } + "TerminationDelay" => { + termination_delay = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } Ok(SpotCapacityRebalance { replacement_strategy: replacement_strategy, + termination_delay: termination_delay, }) } } @@ -17528,11 +22714,16 @@ pub mod spot_fleet { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub image_id: ::Value, + /// Property [`InstanceRequirements`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetlaunchspecification.html#cfn-ec2-spotfleet-spotfleetlaunchspecification-instancerequirements). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub instance_requirements: Option<::Value>, /// Property [`InstanceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetlaunchspecification.html#cfn-ec2-spotfleet-spotfleetlaunchspecification-instancetype). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub instance_type: ::Value, + pub instance_type: Option<::Value>, /// Property [`KernelId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetlaunchspecification.html#cfn-ec2-spotfleet-spotfleetlaunchspecification-kernelid). /// /// Update type: _Immutable_. @@ -17608,7 +22799,12 @@ pub mod spot_fleet { ::serde::ser::SerializeMap::serialize_entry(&mut map, "IamInstanceProfile", iam_instance_profile)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "ImageId", &self.image_id)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceType", &self.instance_type)?; + if let Some(ref instance_requirements) = self.instance_requirements { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceRequirements", instance_requirements)?; + } + if let Some(ref instance_type) = self.instance_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceType", instance_type)?; + } if let Some(ref kernel_id) = self.kernel_id { ::serde::ser::SerializeMap::serialize_entry(&mut map, "KernelId", kernel_id)?; } @@ -17665,6 +22861,7 @@ pub mod spot_fleet { let mut ebs_optimized: Option<::Value> = None; let mut iam_instance_profile: Option<::Value> = None; let mut image_id: Option<::Value> = None; + let mut instance_requirements: Option<::Value> = None; let mut instance_type: Option<::Value> = None; let mut kernel_id: Option<::Value> = None; let mut key_name: Option<::Value> = None; @@ -17693,6 +22890,9 @@ pub mod spot_fleet { "ImageId" => { image_id = ::serde::de::MapAccess::next_value(&mut map)?; } + "InstanceRequirements" => { + instance_requirements = ::serde::de::MapAccess::next_value(&mut map)?; + } "InstanceType" => { instance_type = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -17741,7 +22941,8 @@ pub mod spot_fleet { ebs_optimized: ebs_optimized, iam_instance_profile: iam_instance_profile, image_id: image_id.ok_or(::serde::de::Error::missing_field("ImageId"))?, - instance_type: instance_type.ok_or(::serde::de::Error::missing_field("InstanceType"))?, + instance_requirements: instance_requirements, + instance_type: instance_type, kernel_id: kernel_id, key_name: key_name, monitoring: monitoring, @@ -17903,6 +23104,11 @@ pub mod spot_fleet { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub target_capacity: ::Value, + /// Property [`TargetCapacityUnitType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-targetcapacityunittype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub target_capacity_unit_type: Option<::Value>, /// Property [`TerminateInstancesWithExpiration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-spotfleetrequestconfigdata.html#cfn-ec2-spotfleet-spotfleetrequestconfigdata-terminateinstanceswithexpiration). /// /// Update type: _Immutable_. @@ -17975,6 +23181,9 @@ pub mod spot_fleet { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpotPrice", spot_price)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetCapacity", &self.target_capacity)?; + if let Some(ref target_capacity_unit_type) = self.target_capacity_unit_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetCapacityUnitType", target_capacity_unit_type)?; + } if let Some(ref terminate_instances_with_expiration) = self.terminate_instances_with_expiration { ::serde::ser::SerializeMap::serialize_entry(&mut map, "TerminateInstancesWithExpiration", terminate_instances_with_expiration)?; } @@ -18020,6 +23229,7 @@ pub mod spot_fleet { let mut spot_max_total_price: Option<::Value> = None; let mut spot_price: Option<::Value> = None; let mut target_capacity: Option<::Value> = None; + let mut target_capacity_unit_type: Option<::Value> = None; let mut terminate_instances_with_expiration: Option<::Value> = None; let mut r#type: Option<::Value> = None; let mut valid_from: Option<::Value> = None; @@ -18078,6 +23288,9 @@ pub mod spot_fleet { "TargetCapacity" => { target_capacity = ::serde::de::MapAccess::next_value(&mut map)?; } + "TargetCapacityUnitType" => { + target_capacity_unit_type = ::serde::de::MapAccess::next_value(&mut map)?; + } "TerminateInstancesWithExpiration" => { terminate_instances_with_expiration = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -18112,6 +23325,7 @@ pub mod spot_fleet { spot_max_total_price: spot_max_total_price, spot_price: spot_price, target_capacity: target_capacity.ok_or(::serde::de::Error::missing_field("TargetCapacity"))?, + target_capacity_unit_type: target_capacity_unit_type, terminate_instances_with_expiration: terminate_instances_with_expiration, r#type: r#type, valid_from: valid_from, @@ -18423,6 +23637,138 @@ pub mod spot_fleet { d.deserialize_map(Visitor) } } + + /// The [`AWS::EC2::SpotFleet.TotalLocalStorageGBRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-totallocalstoragegbrequest.html) property type. + #[derive(Debug, Default)] + pub struct TotalLocalStorageGBRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-totallocalstoragegbrequest.html#cfn-ec2-spotfleet-totallocalstoragegbrequest-max). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-totallocalstoragegbrequest.html#cfn-ec2-spotfleet-totallocalstoragegbrequest-min). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub min: Option<::Value>, + } + + impl ::codec::SerializeValue for TotalLocalStorageGBRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for TotalLocalStorageGBRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = TotalLocalStorageGBRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type TotalLocalStorageGBRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(TotalLocalStorageGBRequest { + max: max, + min: min, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EC2::SpotFleet.VCpuCountRangeRequest`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-vcpucountrangerequest.html) property type. + #[derive(Debug, Default)] + pub struct VCpuCountRangeRequest { + /// Property [`Max`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-vcpucountrangerequest.html#cfn-ec2-spotfleet-vcpucountrangerequest-max). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub max: Option<::Value>, + /// Property [`Min`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-spotfleet-vcpucountrangerequest.html#cfn-ec2-spotfleet-vcpucountrangerequest-min). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub min: Option<::Value>, + } + + impl ::codec::SerializeValue for VCpuCountRangeRequest { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref max) = self.max { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Max", max)?; + } + if let Some(ref min) = self.min { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Min", min)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for VCpuCountRangeRequest { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = VCpuCountRangeRequest; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type VCpuCountRangeRequest") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut max: Option<::Value> = None; + let mut min: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Max" => { + max = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Min" => { + min = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(VCpuCountRangeRequest { + max: max, + min: min, + }) + } + } + + d.deserialize_map(Visitor) + } + } } pub mod traffic_mirror_filter_rule { diff --git a/src/aws/ecr.rs b/src/aws/ecr.rs index e95541f..ee147bd 100644 --- a/src/aws/ecr.rs +++ b/src/aws/ecr.rs @@ -117,6 +117,97 @@ impl From for PublicRepository { } } +/// The [`AWS::ECR::PullThroughCacheRule`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-pullthroughcacherule.html) resource type. +#[derive(Debug, Default)] +pub struct PullThroughCacheRule { + properties: PullThroughCacheRuleProperties +} + +/// Properties for the `PullThroughCacheRule` resource. +#[derive(Debug, Default)] +pub struct PullThroughCacheRuleProperties { + /// Property [`EcrRepositoryPrefix`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-pullthroughcacherule.html#cfn-ecr-pullthroughcacherule-ecrrepositoryprefix). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub ecr_repository_prefix: Option<::Value>, + /// Property [`UpstreamRegistryUrl`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-pullthroughcacherule.html#cfn-ecr-pullthroughcacherule-upstreamregistryurl). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub upstream_registry_url: Option<::Value>, +} + +impl ::serde::Serialize for PullThroughCacheRuleProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref ecr_repository_prefix) = self.ecr_repository_prefix { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EcrRepositoryPrefix", ecr_repository_prefix)?; + } + if let Some(ref upstream_registry_url) = self.upstream_registry_url { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UpstreamRegistryUrl", upstream_registry_url)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for PullThroughCacheRuleProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = PullThroughCacheRuleProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type PullThroughCacheRuleProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut ecr_repository_prefix: Option<::Value> = None; + let mut upstream_registry_url: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "EcrRepositoryPrefix" => { + ecr_repository_prefix = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UpstreamRegistryUrl" => { + upstream_registry_url = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(PullThroughCacheRuleProperties { + ecr_repository_prefix: ecr_repository_prefix, + upstream_registry_url: upstream_registry_url, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for PullThroughCacheRule { + type Properties = PullThroughCacheRuleProperties; + const TYPE: &'static str = "AWS::ECR::PullThroughCacheRule"; + fn properties(&self) -> &PullThroughCacheRuleProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut PullThroughCacheRuleProperties { + &mut self.properties + } +} + +impl ::private::Sealed for PullThroughCacheRule {} + +impl From for PullThroughCacheRule { + fn from(properties: PullThroughCacheRuleProperties) -> PullThroughCacheRule { + PullThroughCacheRule { properties } + } +} + /// The [`AWS::ECR::RegistryPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-registrypolicy.html) resource type. #[derive(Debug, Default)] pub struct RegistryPolicy { @@ -549,12 +640,20 @@ pub mod replication_configuration { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub destinations: ::ValueList, + /// Property [`RepositoryFilters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-replicationconfiguration-replicationrule.html#cfn-ecr-replicationconfiguration-replicationrule-repositoryfilters). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub repository_filters: Option<::ValueList>, } impl ::codec::SerializeValue for ReplicationRule { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "Destinations", &self.destinations)?; + if let Some(ref repository_filters) = self.repository_filters { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RepositoryFilters", repository_filters)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -572,18 +671,85 @@ pub mod replication_configuration { fn visit_map>(self, mut map: A) -> Result { let mut destinations: Option<::ValueList> = None; + let mut repository_filters: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { "Destinations" => { destinations = ::serde::de::MapAccess::next_value(&mut map)?; } + "RepositoryFilters" => { + repository_filters = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } Ok(ReplicationRule { destinations: destinations.ok_or(::serde::de::Error::missing_field("Destinations"))?, + repository_filters: repository_filters, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::ECR::ReplicationConfiguration.RepositoryFilter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-replicationconfiguration-repositoryfilter.html) property type. + #[derive(Debug, Default)] + pub struct RepositoryFilter { + /// Property [`Filter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-replicationconfiguration-repositoryfilter.html#cfn-ecr-replicationconfiguration-repositoryfilter-filter). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub filter: ::Value, + /// Property [`FilterType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecr-replicationconfiguration-repositoryfilter.html#cfn-ecr-replicationconfiguration-repositoryfilter-filtertype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub filter_type: ::Value, + } + + impl ::codec::SerializeValue for RepositoryFilter { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Filter", &self.filter)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FilterType", &self.filter_type)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for RepositoryFilter { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = RepositoryFilter; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type RepositoryFilter") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut filter: Option<::Value> = None; + let mut filter_type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Filter" => { + filter = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FilterType" => { + filter_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(RepositoryFilter { + filter: filter.ok_or(::serde::de::Error::missing_field("Filter"))?, + filter_type: filter_type.ok_or(::serde::de::Error::missing_field("FilterType"))?, }) } } diff --git a/src/aws/ecs.rs b/src/aws/ecs.rs index e012b8a..87e9e44 100644 --- a/src/aws/ecs.rs +++ b/src/aws/ecs.rs @@ -477,8 +477,8 @@ pub struct ServiceProperties { pub desired_count: Option<::Value>, /// Property [`EnableECSManagedTags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-enableecsmanagedtags). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub enable_ecs_managed_tags: Option<::Value>, /// Property [`EnableExecuteCommand`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-enableexecutecommand). /// @@ -497,8 +497,8 @@ pub struct ServiceProperties { pub launch_type: Option<::Value>, /// Property [`LoadBalancers`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-loadbalancers). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub load_balancers: Option<::ValueList>, /// Property [`NetworkConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-networkconfiguration). /// @@ -507,13 +507,13 @@ pub struct ServiceProperties { pub network_configuration: Option<::Value>, /// Property [`PlacementConstraints`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-placementconstraints). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub placement_constraints: Option<::ValueList>, /// Property [`PlacementStrategies`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-placementstrategies). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub placement_strategies: Option<::ValueList>, /// Property [`PlatformVersion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-platformversion). /// @@ -522,8 +522,8 @@ pub struct ServiceProperties { pub platform_version: Option<::Value>, /// Property [`PropagateTags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-propagatetags). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub propagate_tags: Option<::Value>, /// Property [`Role`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-role). /// @@ -542,8 +542,8 @@ pub struct ServiceProperties { pub service_name: Option<::Value>, /// Property [`ServiceRegistries`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-serviceregistries). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub service_registries: Option<::ValueList>, /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html#cfn-ecs-service-tags). /// @@ -853,6 +853,11 @@ pub struct TaskDefinitionProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub requires_compatibilities: Option<::ValueList>, + /// Property [`RuntimePlatform`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html#cfn-ecs-taskdefinition-runtimeplatform). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub runtime_platform: Option<::Value>, /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html#cfn-ecs-taskdefinition-tags). /// /// Update type: _Mutable_. @@ -912,6 +917,9 @@ impl ::serde::Serialize for TaskDefinitionProperties { if let Some(ref requires_compatibilities) = self.requires_compatibilities { ::serde::ser::SerializeMap::serialize_entry(&mut map, "RequiresCompatibilities", requires_compatibilities)?; } + if let Some(ref runtime_platform) = self.runtime_platform { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RuntimePlatform", runtime_platform)?; + } if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } @@ -950,6 +958,7 @@ impl<'de> ::serde::Deserialize<'de> for TaskDefinitionProperties { let mut placement_constraints: Option<::ValueList> = None; let mut proxy_configuration: Option<::Value> = None; let mut requires_compatibilities: Option<::ValueList> = None; + let mut runtime_platform: Option<::Value> = None; let mut tags: Option<::ValueList<::Tag>> = None; let mut task_role_arn: Option<::Value> = None; let mut volumes: Option<::ValueList> = None; @@ -995,6 +1004,9 @@ impl<'de> ::serde::Deserialize<'de> for TaskDefinitionProperties { "RequiresCompatibilities" => { requires_compatibilities = ::serde::de::MapAccess::next_value(&mut map)?; } + "RuntimePlatform" => { + runtime_platform = ::serde::de::MapAccess::next_value(&mut map)?; + } "Tags" => { tags = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1022,6 +1034,7 @@ impl<'de> ::serde::Deserialize<'de> for TaskDefinitionProperties { placement_constraints: placement_constraints, proxy_configuration: proxy_configuration, requires_compatibilities: requires_compatibilities, + runtime_platform: runtime_platform, tags: tags, task_role_arn: task_role_arn, volumes: volumes, @@ -2254,23 +2267,23 @@ pub mod service { pub struct LoadBalancer { /// Property [`ContainerName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-loadbalancer.html#cfn-ecs-service-loadbalancer-containername). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub container_name: Option<::Value>, /// Property [`ContainerPort`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-loadbalancer.html#cfn-ecs-service-loadbalancer-containerport). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub container_port: Option<::Value>, /// Property [`LoadBalancerName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-loadbalancer.html#cfn-ecs-service-loadbalancer-loadbalancername). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub load_balancer_name: Option<::Value>, /// Property [`TargetGroupArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-loadbalancer.html#cfn-ecs-service-loadbalancer-targetgrouparn). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub target_group_arn: Option<::Value>, } @@ -2399,13 +2412,13 @@ pub mod service { pub struct PlacementConstraint { /// Property [`Expression`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-placementconstraint.html#cfn-ecs-service-placementconstraint-expression). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub expression: Option<::Value>, /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-placementconstraint.html#cfn-ecs-service-placementconstraint-type). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub r#type: ::Value, } @@ -2463,13 +2476,13 @@ pub mod service { pub struct PlacementStrategy { /// Property [`Field`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-placementstrategy.html#cfn-ecs-service-placementstrategy-field). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub field: Option<::Value>, /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-placementstrategy.html#cfn-ecs-service-placementstrategy-type). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub r#type: ::Value, } @@ -2527,23 +2540,23 @@ pub mod service { pub struct ServiceRegistry { /// Property [`ContainerName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-serviceregistry.html#cfn-ecs-service-serviceregistry-containername). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub container_name: Option<::Value>, /// Property [`ContainerPort`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-serviceregistry.html#cfn-ecs-service-serviceregistry-containerport). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub container_port: Option<::Value>, /// Property [`Port`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-serviceregistry.html#cfn-ecs-service-serviceregistry-port). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub port: Option<::Value>, /// Property [`RegistryArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-service-serviceregistry.html#cfn-ecs-service-serviceregistry-registryarn). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub registry_arn: Option<::Value>, } @@ -4749,6 +4762,72 @@ pub mod task_definition { } } + /// The [`AWS::ECS::TaskDefinition.RuntimePlatform`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-runtimeplatform.html) property type. + #[derive(Debug, Default)] + pub struct RuntimePlatform { + /// Property [`CpuArchitecture`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-runtimeplatform.html#cfn-ecs-taskdefinition-runtimeplatform-cpuarchitecture). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub cpu_architecture: Option<::Value>, + /// Property [`OperatingSystemFamily`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-runtimeplatform.html#cfn-ecs-taskdefinition-runtimeplatform-operatingsystemfamily). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub operating_system_family: Option<::Value>, + } + + impl ::codec::SerializeValue for RuntimePlatform { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref cpu_architecture) = self.cpu_architecture { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CpuArchitecture", cpu_architecture)?; + } + if let Some(ref operating_system_family) = self.operating_system_family { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OperatingSystemFamily", operating_system_family)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for RuntimePlatform { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = RuntimePlatform; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type RuntimePlatform") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut cpu_architecture: Option<::Value> = None; + let mut operating_system_family: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CpuArchitecture" => { + cpu_architecture = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OperatingSystemFamily" => { + operating_system_family = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(RuntimePlatform { + cpu_architecture: cpu_architecture, + operating_system_family: operating_system_family, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::ECS::TaskDefinition.Secret`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ecs-taskdefinition-secret.html) property type. #[derive(Debug, Default)] pub struct Secret { diff --git a/src/aws/efs.rs b/src/aws/efs.rs index b0b65d3..75cf44d 100644 --- a/src/aws/efs.rs +++ b/src/aws/efs.rs @@ -854,13 +854,23 @@ pub mod file_system { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub transition_to_ia: ::Value, + pub transition_to_ia: Option<::Value>, + /// Property [`TransitionToPrimaryStorageClass`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-efs-filesystem-lifecyclepolicy.html#cfn-efs-filesystem-lifecyclepolicy-transitiontoprimarystorageclass). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub transition_to_primary_storage_class: Option<::Value>, } impl ::codec::SerializeValue for LifecyclePolicy { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitionToIA", &self.transition_to_ia)?; + if let Some(ref transition_to_ia) = self.transition_to_ia { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitionToIA", transition_to_ia)?; + } + if let Some(ref transition_to_primary_storage_class) = self.transition_to_primary_storage_class { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TransitionToPrimaryStorageClass", transition_to_primary_storage_class)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -878,18 +888,23 @@ pub mod file_system { fn visit_map>(self, mut map: A) -> Result { let mut transition_to_ia: Option<::Value> = None; + let mut transition_to_primary_storage_class: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { "TransitionToIA" => { transition_to_ia = ::serde::de::MapAccess::next_value(&mut map)?; } + "TransitionToPrimaryStorageClass" => { + transition_to_primary_storage_class = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } Ok(LifecyclePolicy { - transition_to_ia: transition_to_ia.ok_or(::serde::de::Error::missing_field("TransitionToIA"))?, + transition_to_ia: transition_to_ia, + transition_to_primary_storage_class: transition_to_primary_storage_class, }) } } diff --git a/src/aws/eks.rs b/src/aws/eks.rs index f30f58e..8ef59b0 100644 --- a/src/aws/eks.rs +++ b/src/aws/eks.rs @@ -158,6 +158,11 @@ pub struct ClusterProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub kubernetes_network_config: Option<::Value>, + /// Property [`Logging`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-cluster.html#cfn-eks-cluster-logging). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub logging: Option<::Value>, /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-cluster.html#cfn-eks-cluster-name). /// /// Update type: _Immutable_. @@ -165,14 +170,19 @@ pub struct ClusterProperties { pub name: Option<::Value>, /// Property [`ResourcesVpcConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-cluster.html#cfn-eks-cluster-resourcesvpcconfig). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub resources_vpc_config: ::Value, /// Property [`RoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-cluster.html#cfn-eks-cluster-rolearn). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub role_arn: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-cluster.html#cfn-eks-cluster-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, /// Property [`Version`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-cluster.html#cfn-eks-cluster-version). /// /// Update type: _Mutable_. @@ -189,11 +199,17 @@ impl ::serde::Serialize for ClusterProperties { if let Some(ref kubernetes_network_config) = self.kubernetes_network_config { ::serde::ser::SerializeMap::serialize_entry(&mut map, "KubernetesNetworkConfig", kubernetes_network_config)?; } + if let Some(ref logging) = self.logging { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Logging", logging)?; + } if let Some(ref name) = self.name { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourcesVpcConfig", &self.resources_vpc_config)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "RoleArn", &self.role_arn)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } if let Some(ref version) = self.version { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Version", version)?; } @@ -215,9 +231,11 @@ impl<'de> ::serde::Deserialize<'de> for ClusterProperties { fn visit_map>(self, mut map: A) -> Result { let mut encryption_config: Option<::ValueList> = None; let mut kubernetes_network_config: Option<::Value> = None; + let mut logging: Option<::Value> = None; let mut name: Option<::Value> = None; let mut resources_vpc_config: Option<::Value> = None; let mut role_arn: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; let mut version: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { @@ -228,6 +246,9 @@ impl<'de> ::serde::Deserialize<'de> for ClusterProperties { "KubernetesNetworkConfig" => { kubernetes_network_config = ::serde::de::MapAccess::next_value(&mut map)?; } + "Logging" => { + logging = ::serde::de::MapAccess::next_value(&mut map)?; + } "Name" => { name = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -237,6 +258,9 @@ impl<'de> ::serde::Deserialize<'de> for ClusterProperties { "RoleArn" => { role_arn = ::serde::de::MapAccess::next_value(&mut map)?; } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } "Version" => { version = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -247,9 +271,11 @@ impl<'de> ::serde::Deserialize<'de> for ClusterProperties { Ok(ClusterProperties { encryption_config: encryption_config, kubernetes_network_config: kubernetes_network_config, + logging: logging, name: name, resources_vpc_config: resources_vpc_config.ok_or(::serde::de::Error::missing_field("ResourcesVpcConfig"))?, role_arn: role_arn.ok_or(::serde::de::Error::missing_field("RoleArn"))?, + tags: tags, version: version, }) } @@ -415,6 +441,132 @@ impl From for FargateProfile { } } +/// The [`AWS::EKS::IdentityProviderConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-identityproviderconfig.html) resource type. +#[derive(Debug, Default)] +pub struct IdentityProviderConfig { + properties: IdentityProviderConfigProperties +} + +/// Properties for the `IdentityProviderConfig` resource. +#[derive(Debug, Default)] +pub struct IdentityProviderConfigProperties { + /// Property [`ClusterName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-identityproviderconfig.html#cfn-eks-identityproviderconfig-clustername). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub cluster_name: ::Value, + /// Property [`IdentityProviderConfigName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-identityproviderconfig.html#cfn-eks-identityproviderconfig-identityproviderconfigname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub identity_provider_config_name: Option<::Value>, + /// Property [`Oidc`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-identityproviderconfig.html#cfn-eks-identityproviderconfig-oidc). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub oidc: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-identityproviderconfig.html#cfn-eks-identityproviderconfig-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-identityproviderconfig.html#cfn-eks-identityproviderconfig-type). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub r#type: ::Value, +} + +impl ::serde::Serialize for IdentityProviderConfigProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ClusterName", &self.cluster_name)?; + if let Some(ref identity_provider_config_name) = self.identity_provider_config_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IdentityProviderConfigName", identity_provider_config_name)?; + } + if let Some(ref oidc) = self.oidc { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Oidc", oidc)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for IdentityProviderConfigProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = IdentityProviderConfigProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type IdentityProviderConfigProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut cluster_name: Option<::Value> = None; + let mut identity_provider_config_name: Option<::Value> = None; + let mut oidc: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut r#type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ClusterName" => { + cluster_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IdentityProviderConfigName" => { + identity_provider_config_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Oidc" => { + oidc = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(IdentityProviderConfigProperties { + cluster_name: cluster_name.ok_or(::serde::de::Error::missing_field("ClusterName"))?, + identity_provider_config_name: identity_provider_config_name, + oidc: oidc, + tags: tags, + r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for IdentityProviderConfig { + type Properties = IdentityProviderConfigProperties; + const TYPE: &'static str = "AWS::EKS::IdentityProviderConfig"; + fn properties(&self) -> &IdentityProviderConfigProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut IdentityProviderConfigProperties { + &mut self.properties + } +} + +impl ::private::Sealed for IdentityProviderConfig {} + +impl From for IdentityProviderConfig { + fn from(properties: IdentityProviderConfigProperties) -> IdentityProviderConfig { + IdentityProviderConfig { properties } + } +} + /// The [`AWS::EKS::Nodegroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-nodegroup.html) resource type. #[derive(Debug, Default)] pub struct Nodegroup { @@ -443,7 +595,7 @@ pub struct NodegroupProperties { /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub disk_size: Option<::Value>, + pub disk_size: Option<::Value>, /// Property [`ForceUpdateEnabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-nodegroup.html#cfn-eks-nodegroup-forceupdateenabled). /// /// Update type: _Mutable_. @@ -586,7 +738,7 @@ impl<'de> ::serde::Deserialize<'de> for NodegroupProperties { let mut ami_type: Option<::Value> = None; let mut capacity_type: Option<::Value> = None; let mut cluster_name: Option<::Value> = None; - let mut disk_size: Option<::Value> = None; + let mut disk_size: Option<::Value> = None; let mut force_update_enabled: Option<::Value> = None; let mut instance_types: Option<::ValueList> = None; let mut labels: Option<::Value<::json::Value>> = None; @@ -711,18 +863,71 @@ impl From for Nodegroup { pub mod cluster { //! Property types for the `Cluster` resource. + /// The [`AWS::EKS::Cluster.ClusterLogging`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-clusterlogging.html) property type. + #[derive(Debug, Default)] + pub struct ClusterLogging { + /// Property [`EnabledTypes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-clusterlogging.html#cfn-eks-cluster-clusterlogging-enabledtypes). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enabled_types: Option<::ValueList>, + } + + impl ::codec::SerializeValue for ClusterLogging { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref enabled_types) = self.enabled_types { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EnabledTypes", enabled_types)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ClusterLogging { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ClusterLogging; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ClusterLogging") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut enabled_types: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "EnabledTypes" => { + enabled_types = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ClusterLogging { + enabled_types: enabled_types, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::EKS::Cluster.EncryptionConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-encryptionconfig.html) property type. #[derive(Debug, Default)] pub struct EncryptionConfig { /// Property [`Provider`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-encryptionconfig.html#cfn-eks-cluster-encryptionconfig-provider). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. pub provider: Option<::Value>, /// Property [`Resources`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-encryptionconfig.html#cfn-eks-cluster-encryptionconfig-resources). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. pub resources: Option<::ValueList>, } @@ -780,19 +985,35 @@ pub mod cluster { /// The [`AWS::EKS::Cluster.KubernetesNetworkConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-kubernetesnetworkconfig.html) property type. #[derive(Debug, Default)] pub struct KubernetesNetworkConfig { + /// Property [`IpFamily`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-kubernetesnetworkconfig.html#cfn-eks-cluster-kubernetesnetworkconfig-ipfamily). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub ip_family: Option<::Value>, /// Property [`ServiceIpv4Cidr`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-kubernetesnetworkconfig.html#cfn-eks-cluster-kubernetesnetworkconfig-serviceipv4cidr). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. pub service_ipv4_cidr: Option<::Value>, + /// Property [`ServiceIpv6Cidr`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-kubernetesnetworkconfig.html#cfn-eks-cluster-kubernetesnetworkconfig-serviceipv6cidr). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub service_ipv6_cidr: Option<::Value>, } impl ::codec::SerializeValue for KubernetesNetworkConfig { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref ip_family) = self.ip_family { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IpFamily", ip_family)?; + } if let Some(ref service_ipv4_cidr) = self.service_ipv4_cidr { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServiceIpv4Cidr", service_ipv4_cidr)?; } + if let Some(ref service_ipv6_cidr) = self.service_ipv6_cidr { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServiceIpv6Cidr", service_ipv6_cidr)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -809,19 +1030,135 @@ pub mod cluster { } fn visit_map>(self, mut map: A) -> Result { + let mut ip_family: Option<::Value> = None; let mut service_ipv4_cidr: Option<::Value> = None; + let mut service_ipv6_cidr: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "IpFamily" => { + ip_family = ::serde::de::MapAccess::next_value(&mut map)?; + } "ServiceIpv4Cidr" => { service_ipv4_cidr = ::serde::de::MapAccess::next_value(&mut map)?; } + "ServiceIpv6Cidr" => { + service_ipv6_cidr = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } Ok(KubernetesNetworkConfig { + ip_family: ip_family, service_ipv4_cidr: service_ipv4_cidr, + service_ipv6_cidr: service_ipv6_cidr, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EKS::Cluster.Logging`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-logging.html) property type. + #[derive(Debug, Default)] + pub struct Logging { + /// Property [`ClusterLogging`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-logging.html#cfn-eks-cluster-logging-clusterlogging). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub cluster_logging: Option<::Value>, + } + + impl ::codec::SerializeValue for Logging { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref cluster_logging) = self.cluster_logging { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ClusterLogging", cluster_logging)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Logging { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Logging; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Logging") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut cluster_logging: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ClusterLogging" => { + cluster_logging = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Logging { + cluster_logging: cluster_logging, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EKS::Cluster.LoggingTypeConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-loggingtypeconfig.html) property type. + #[derive(Debug, Default)] + pub struct LoggingTypeConfig { + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-loggingtypeconfig.html#cfn-eks-cluster-loggingtypeconfig-type). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#type: Option<::Value>, + } + + impl ::codec::SerializeValue for LoggingTypeConfig { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref r#type) = self.r#type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", r#type)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for LoggingTypeConfig { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = LoggingTypeConfig; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type LoggingTypeConfig") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut r#type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(LoggingTypeConfig { + r#type: r#type, }) } } @@ -835,8 +1172,8 @@ pub mod cluster { pub struct Provider { /// Property [`KeyArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-provider.html#cfn-eks-cluster-provider-keyarn). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. pub key_arn: Option<::Value>, } @@ -886,21 +1223,45 @@ pub mod cluster { /// The [`AWS::EKS::Cluster.ResourcesVpcConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-resourcesvpcconfig.html) property type. #[derive(Debug, Default)] pub struct ResourcesVpcConfig { - /// Property [`SecurityGroupIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-resourcesvpcconfig.html#cfn-eks-cluster-resourcesvpcconfig-securitygroupids). + /// Property [`EndpointPrivateAccess`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-resourcesvpcconfig.html#cfn-eks-cluster-resourcesvpcconfig-endpointprivateaccess). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub security_group_ids: Option<::ValueList>, - /// Property [`SubnetIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-resourcesvpcconfig.html#cfn-eks-cluster-resourcesvpcconfig-subnetids). + pub endpoint_private_access: Option<::Value>, + /// Property [`EndpointPublicAccess`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-resourcesvpcconfig.html#cfn-eks-cluster-resourcesvpcconfig-endpointpublicaccess). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub endpoint_public_access: Option<::Value>, + /// Property [`PublicAccessCidrs`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-resourcesvpcconfig.html#cfn-eks-cluster-resourcesvpcconfig-publicaccesscidrs). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. + pub public_access_cidrs: Option<::ValueList>, + /// Property [`SecurityGroupIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-resourcesvpcconfig.html#cfn-eks-cluster-resourcesvpcconfig-securitygroupids). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub security_group_ids: Option<::ValueList>, + /// Property [`SubnetIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-resourcesvpcconfig.html#cfn-eks-cluster-resourcesvpcconfig-subnetids). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. pub subnet_ids: ::ValueList, } impl ::codec::SerializeValue for ResourcesVpcConfig { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref endpoint_private_access) = self.endpoint_private_access { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EndpointPrivateAccess", endpoint_private_access)?; + } + if let Some(ref endpoint_public_access) = self.endpoint_public_access { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EndpointPublicAccess", endpoint_public_access)?; + } + if let Some(ref public_access_cidrs) = self.public_access_cidrs { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PublicAccessCidrs", public_access_cidrs)?; + } if let Some(ref security_group_ids) = self.security_group_ids { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityGroupIds", security_group_ids)?; } @@ -921,11 +1282,23 @@ pub mod cluster { } fn visit_map>(self, mut map: A) -> Result { + let mut endpoint_private_access: Option<::Value> = None; + let mut endpoint_public_access: Option<::Value> = None; + let mut public_access_cidrs: Option<::ValueList> = None; let mut security_group_ids: Option<::ValueList> = None; let mut subnet_ids: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "EndpointPrivateAccess" => { + endpoint_private_access = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EndpointPublicAccess" => { + endpoint_public_access = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PublicAccessCidrs" => { + public_access_cidrs = ::serde::de::MapAccess::next_value(&mut map)?; + } "SecurityGroupIds" => { security_group_ids = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -937,6 +1310,9 @@ pub mod cluster { } Ok(ResourcesVpcConfig { + endpoint_private_access: endpoint_private_access, + endpoint_public_access: endpoint_public_access, + public_access_cidrs: public_access_cidrs, security_group_ids: security_group_ids, subnet_ids: subnet_ids.ok_or(::serde::de::Error::missing_field("SubnetIds"))?, }) @@ -1078,6 +1454,199 @@ pub mod fargate_profile { } } +pub mod identity_provider_config { + //! Property types for the `IdentityProviderConfig` resource. + + /// The [`AWS::EKS::IdentityProviderConfig.OidcIdentityProviderConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-identityproviderconfig-oidcidentityproviderconfig.html) property type. + #[derive(Debug, Default)] + pub struct OidcIdentityProviderConfig { + /// Property [`ClientId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-identityproviderconfig-oidcidentityproviderconfig.html#cfn-eks-identityproviderconfig-oidcidentityproviderconfig-clientid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub client_id: ::Value, + /// Property [`GroupsClaim`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-identityproviderconfig-oidcidentityproviderconfig.html#cfn-eks-identityproviderconfig-oidcidentityproviderconfig-groupsclaim). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub groups_claim: Option<::Value>, + /// Property [`GroupsPrefix`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-identityproviderconfig-oidcidentityproviderconfig.html#cfn-eks-identityproviderconfig-oidcidentityproviderconfig-groupsprefix). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub groups_prefix: Option<::Value>, + /// Property [`IssuerUrl`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-identityproviderconfig-oidcidentityproviderconfig.html#cfn-eks-identityproviderconfig-oidcidentityproviderconfig-issuerurl). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub issuer_url: ::Value, + /// Property [`RequiredClaims`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-identityproviderconfig-oidcidentityproviderconfig.html#cfn-eks-identityproviderconfig-oidcidentityproviderconfig-requiredclaims). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub required_claims: Option<::ValueList>, + /// Property [`UsernameClaim`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-identityproviderconfig-oidcidentityproviderconfig.html#cfn-eks-identityproviderconfig-oidcidentityproviderconfig-usernameclaim). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub username_claim: Option<::Value>, + /// Property [`UsernamePrefix`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-identityproviderconfig-oidcidentityproviderconfig.html#cfn-eks-identityproviderconfig-oidcidentityproviderconfig-usernameprefix). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub username_prefix: Option<::Value>, + } + + impl ::codec::SerializeValue for OidcIdentityProviderConfig { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ClientId", &self.client_id)?; + if let Some(ref groups_claim) = self.groups_claim { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupsClaim", groups_claim)?; + } + if let Some(ref groups_prefix) = self.groups_prefix { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupsPrefix", groups_prefix)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IssuerUrl", &self.issuer_url)?; + if let Some(ref required_claims) = self.required_claims { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RequiredClaims", required_claims)?; + } + if let Some(ref username_claim) = self.username_claim { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UsernameClaim", username_claim)?; + } + if let Some(ref username_prefix) = self.username_prefix { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UsernamePrefix", username_prefix)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for OidcIdentityProviderConfig { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = OidcIdentityProviderConfig; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type OidcIdentityProviderConfig") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut client_id: Option<::Value> = None; + let mut groups_claim: Option<::Value> = None; + let mut groups_prefix: Option<::Value> = None; + let mut issuer_url: Option<::Value> = None; + let mut required_claims: Option<::ValueList> = None; + let mut username_claim: Option<::Value> = None; + let mut username_prefix: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ClientId" => { + client_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "GroupsClaim" => { + groups_claim = ::serde::de::MapAccess::next_value(&mut map)?; + } + "GroupsPrefix" => { + groups_prefix = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IssuerUrl" => { + issuer_url = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RequiredClaims" => { + required_claims = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UsernameClaim" => { + username_claim = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UsernamePrefix" => { + username_prefix = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(OidcIdentityProviderConfig { + client_id: client_id.ok_or(::serde::de::Error::missing_field("ClientId"))?, + groups_claim: groups_claim, + groups_prefix: groups_prefix, + issuer_url: issuer_url.ok_or(::serde::de::Error::missing_field("IssuerUrl"))?, + required_claims: required_claims, + username_claim: username_claim, + username_prefix: username_prefix, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::EKS::IdentityProviderConfig.RequiredClaim`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-identityproviderconfig-requiredclaim.html) property type. + #[derive(Debug, Default)] + pub struct RequiredClaim { + /// Property [`Key`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-identityproviderconfig-requiredclaim.html#cfn-eks-identityproviderconfig-requiredclaim-key). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub key: ::Value, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-identityproviderconfig-requiredclaim.html#cfn-eks-identityproviderconfig-requiredclaim-value). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub value: ::Value, + } + + impl ::codec::SerializeValue for RequiredClaim { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Key", &self.key)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", &self.value)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for RequiredClaim { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = RequiredClaim; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type RequiredClaim") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut key: Option<::Value> = None; + let mut value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Key" => { + key = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(RequiredClaim { + key: key.ok_or(::serde::de::Error::missing_field("Key"))?, + value: value.ok_or(::serde::de::Error::missing_field("Value"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + pub mod nodegroup { //! Property types for the `Nodegroup` resource. @@ -1231,17 +1800,17 @@ pub mod nodegroup { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub desired_size: Option<::Value>, + pub desired_size: Option<::Value>, /// Property [`MaxSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-nodegroup-scalingconfig.html#cfn-eks-nodegroup-scalingconfig-maxsize). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub max_size: Option<::Value>, + pub max_size: Option<::Value>, /// Property [`MinSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-nodegroup-scalingconfig.html#cfn-eks-nodegroup-scalingconfig-minsize). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub min_size: Option<::Value>, + pub min_size: Option<::Value>, } impl ::codec::SerializeValue for ScalingConfig { @@ -1272,9 +1841,9 @@ pub mod nodegroup { } fn visit_map>(self, mut map: A) -> Result { - let mut desired_size: Option<::Value> = None; - let mut max_size: Option<::Value> = None; - let mut min_size: Option<::Value> = None; + let mut desired_size: Option<::Value> = None; + let mut max_size: Option<::Value> = None; + let mut min_size: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { diff --git a/src/aws/elasticache.rs b/src/aws/elasticache.rs index 0ded256..abea37d 100644 --- a/src/aws/elasticache.rs +++ b/src/aws/elasticache.rs @@ -692,6 +692,11 @@ pub struct ReplicationGroupProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub cache_subnet_group_name: Option<::Value>, + /// Property [`DataTieringEnabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-datatieringenabled). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub data_tiering_enabled: Option<::Value>, /// Property [`Engine`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticache-replicationgroup.html#cfn-elasticache-replicationgroup-engine). /// /// Update type: _Immutable_. @@ -853,6 +858,9 @@ impl ::serde::Serialize for ReplicationGroupProperties { if let Some(ref cache_subnet_group_name) = self.cache_subnet_group_name { ::serde::ser::SerializeMap::serialize_entry(&mut map, "CacheSubnetGroupName", cache_subnet_group_name)?; } + if let Some(ref data_tiering_enabled) = self.data_tiering_enabled { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataTieringEnabled", data_tiering_enabled)?; + } if let Some(ref engine) = self.engine { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Engine", engine)?; } @@ -953,6 +961,7 @@ impl<'de> ::serde::Deserialize<'de> for ReplicationGroupProperties { let mut cache_parameter_group_name: Option<::Value> = None; let mut cache_security_group_names: Option<::ValueList> = None; let mut cache_subnet_group_name: Option<::Value> = None; + let mut data_tiering_enabled: Option<::Value> = None; let mut engine: Option<::Value> = None; let mut engine_version: Option<::Value> = None; let mut global_replication_group_id: Option<::Value> = None; @@ -1006,6 +1015,9 @@ impl<'de> ::serde::Deserialize<'de> for ReplicationGroupProperties { "CacheSubnetGroupName" => { cache_subnet_group_name = ::serde::de::MapAccess::next_value(&mut map)?; } + "DataTieringEnabled" => { + data_tiering_enabled = ::serde::de::MapAccess::next_value(&mut map)?; + } "Engine" => { engine = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1097,6 +1109,7 @@ impl<'de> ::serde::Deserialize<'de> for ReplicationGroupProperties { cache_parameter_group_name: cache_parameter_group_name, cache_security_group_names: cache_security_group_names, cache_subnet_group_name: cache_subnet_group_name, + data_tiering_enabled: data_tiering_enabled, engine: engine, engine_version: engine_version, global_replication_group_id: global_replication_group_id, @@ -1699,15 +1712,13 @@ pub mod cache_cluster { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub log_group: Option<::Value>, + pub log_group: ::Value, } impl ::codec::SerializeValue for CloudWatchLogsDestinationDetails { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref log_group) = self.log_group { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogGroup", log_group)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogGroup", &self.log_group)?; ::serde::ser::SerializeMap::end(map) } } @@ -1736,7 +1747,7 @@ pub mod cache_cluster { } Ok(CloudWatchLogsDestinationDetails { - log_group: log_group, + log_group: log_group.ok_or(::serde::de::Error::missing_field("LogGroup"))?, }) } } @@ -1818,15 +1829,13 @@ pub mod cache_cluster { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub delivery_stream: Option<::Value>, + pub delivery_stream: ::Value, } impl ::codec::SerializeValue for KinesisFirehoseDestinationDetails { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref delivery_stream) = self.delivery_stream { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeliveryStream", delivery_stream)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeliveryStream", &self.delivery_stream)?; ::serde::ser::SerializeMap::end(map) } } @@ -1855,7 +1864,7 @@ pub mod cache_cluster { } Ok(KinesisFirehoseDestinationDetails { - delivery_stream: delivery_stream, + delivery_stream: delivery_stream.ok_or(::serde::de::Error::missing_field("DeliveryStream"))?, }) } } @@ -1871,39 +1880,31 @@ pub mod cache_cluster { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub destination_details: Option<::Value>, + pub destination_details: ::Value, /// Property [`DestinationType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-logdeliveryconfigurationrequest.html#cfn-elasticache-cachecluster-logdeliveryconfigurationrequest-destinationtype). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub destination_type: Option<::Value>, + pub destination_type: ::Value, /// Property [`LogFormat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-logdeliveryconfigurationrequest.html#cfn-elasticache-cachecluster-logdeliveryconfigurationrequest-logformat). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub log_format: Option<::Value>, + pub log_format: ::Value, /// Property [`LogType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-cachecluster-logdeliveryconfigurationrequest.html#cfn-elasticache-cachecluster-logdeliveryconfigurationrequest-logtype). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub log_type: Option<::Value>, + pub log_type: ::Value, } impl ::codec::SerializeValue for LogDeliveryConfigurationRequest { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref destination_details) = self.destination_details { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationDetails", destination_details)?; - } - if let Some(ref destination_type) = self.destination_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationType", destination_type)?; - } - if let Some(ref log_format) = self.log_format { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogFormat", log_format)?; - } - if let Some(ref log_type) = self.log_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogType", log_type)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationDetails", &self.destination_details)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationType", &self.destination_type)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogFormat", &self.log_format)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogType", &self.log_type)?; ::serde::ser::SerializeMap::end(map) } } @@ -1944,10 +1945,10 @@ pub mod cache_cluster { } Ok(LogDeliveryConfigurationRequest { - destination_details: destination_details, - destination_type: destination_type, - log_format: log_format, - log_type: log_type, + destination_details: destination_details.ok_or(::serde::de::Error::missing_field("DestinationDetails"))?, + destination_type: destination_type.ok_or(::serde::de::Error::missing_field("DestinationType"))?, + log_format: log_format.ok_or(::serde::de::Error::missing_field("LogFormat"))?, + log_type: log_type.ok_or(::serde::de::Error::missing_field("LogType"))?, }) } } @@ -2195,15 +2196,13 @@ pub mod replication_group { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub log_group: Option<::Value>, + pub log_group: ::Value, } impl ::codec::SerializeValue for CloudWatchLogsDestinationDetails { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref log_group) = self.log_group { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogGroup", log_group)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogGroup", &self.log_group)?; ::serde::ser::SerializeMap::end(map) } } @@ -2232,7 +2231,7 @@ pub mod replication_group { } Ok(CloudWatchLogsDestinationDetails { - log_group: log_group, + log_group: log_group.ok_or(::serde::de::Error::missing_field("LogGroup"))?, }) } } @@ -2314,15 +2313,13 @@ pub mod replication_group { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub delivery_stream: Option<::Value>, + pub delivery_stream: ::Value, } impl ::codec::SerializeValue for KinesisFirehoseDestinationDetails { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref delivery_stream) = self.delivery_stream { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeliveryStream", delivery_stream)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeliveryStream", &self.delivery_stream)?; ::serde::ser::SerializeMap::end(map) } } @@ -2351,7 +2348,7 @@ pub mod replication_group { } Ok(KinesisFirehoseDestinationDetails { - delivery_stream: delivery_stream, + delivery_stream: delivery_stream.ok_or(::serde::de::Error::missing_field("DeliveryStream"))?, }) } } @@ -2367,39 +2364,31 @@ pub mod replication_group { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub destination_details: Option<::Value>, + pub destination_details: ::Value, /// Property [`DestinationType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-logdeliveryconfigurationrequest.html#cfn-elasticache-replicationgroup-logdeliveryconfigurationrequest-destinationtype). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub destination_type: Option<::Value>, + pub destination_type: ::Value, /// Property [`LogFormat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-logdeliveryconfigurationrequest.html#cfn-elasticache-replicationgroup-logdeliveryconfigurationrequest-logformat). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub log_format: Option<::Value>, + pub log_format: ::Value, /// Property [`LogType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticache-replicationgroup-logdeliveryconfigurationrequest.html#cfn-elasticache-replicationgroup-logdeliveryconfigurationrequest-logtype). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub log_type: Option<::Value>, + pub log_type: ::Value, } impl ::codec::SerializeValue for LogDeliveryConfigurationRequest { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref destination_details) = self.destination_details { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationDetails", destination_details)?; - } - if let Some(ref destination_type) = self.destination_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationType", destination_type)?; - } - if let Some(ref log_format) = self.log_format { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogFormat", log_format)?; - } - if let Some(ref log_type) = self.log_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogType", log_type)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationDetails", &self.destination_details)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationType", &self.destination_type)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogFormat", &self.log_format)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogType", &self.log_type)?; ::serde::ser::SerializeMap::end(map) } } @@ -2440,10 +2429,10 @@ pub mod replication_group { } Ok(LogDeliveryConfigurationRequest { - destination_details: destination_details, - destination_type: destination_type, - log_format: log_format, - log_type: log_type, + destination_details: destination_details.ok_or(::serde::de::Error::missing_field("DestinationDetails"))?, + destination_type: destination_type.ok_or(::serde::de::Error::missing_field("DestinationType"))?, + log_format: log_format.ok_or(::serde::de::Error::missing_field("LogFormat"))?, + log_type: log_type.ok_or(::serde::de::Error::missing_field("LogType"))?, }) } } diff --git a/src/aws/elasticloadbalancingv2.rs b/src/aws/elasticloadbalancingv2.rs index 099150a..5f8f89f 100644 --- a/src/aws/elasticloadbalancingv2.rs +++ b/src/aws/elasticloadbalancingv2.rs @@ -574,6 +574,11 @@ pub struct TargetGroupProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub healthy_threshold_count: Option<::Value>, + /// Property [`IpAddressType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-ipaddresstype). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub ip_address_type: Option<::Value>, /// Property [`Matcher`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticloadbalancingv2-targetgroup.html#cfn-elasticloadbalancingv2-targetgroup-matcher). /// /// Update type: _Mutable_. @@ -655,6 +660,9 @@ impl ::serde::Serialize for TargetGroupProperties { if let Some(ref healthy_threshold_count) = self.healthy_threshold_count { ::serde::ser::SerializeMap::serialize_entry(&mut map, "HealthyThresholdCount", healthy_threshold_count)?; } + if let Some(ref ip_address_type) = self.ip_address_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IpAddressType", ip_address_type)?; + } if let Some(ref matcher) = self.matcher { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Matcher", matcher)?; } @@ -711,6 +719,7 @@ impl<'de> ::serde::Deserialize<'de> for TargetGroupProperties { let mut health_check_protocol: Option<::Value> = None; let mut health_check_timeout_seconds: Option<::Value> = None; let mut healthy_threshold_count: Option<::Value> = None; + let mut ip_address_type: Option<::Value> = None; let mut matcher: Option<::Value> = None; let mut name: Option<::Value> = None; let mut port: Option<::Value> = None; @@ -746,6 +755,9 @@ impl<'de> ::serde::Deserialize<'de> for TargetGroupProperties { "HealthyThresholdCount" => { healthy_threshold_count = ::serde::de::MapAccess::next_value(&mut map)?; } + "IpAddressType" => { + ip_address_type = ::serde::de::MapAccess::next_value(&mut map)?; + } "Matcher" => { matcher = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -791,6 +803,7 @@ impl<'de> ::serde::Deserialize<'de> for TargetGroupProperties { health_check_protocol: health_check_protocol, health_check_timeout_seconds: health_check_timeout_seconds, healthy_threshold_count: healthy_threshold_count, + ip_address_type: ip_address_type, matcher: matcher, name: name, port: port, diff --git a/src/aws/elasticsearch.rs b/src/aws/elasticsearch.rs index dc08777..75feb98 100644 --- a/src/aws/elasticsearch.rs +++ b/src/aws/elasticsearch.rs @@ -437,6 +437,59 @@ pub mod domain { } } + /// The [`AWS::Elasticsearch::Domain.ColdStorageOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-coldstorageoptions.html) property type. + #[derive(Debug, Default)] + pub struct ColdStorageOptions { + /// Property [`Enabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-coldstorageoptions.html#cfn-elasticsearch-domain-coldstorageoptions-enabled). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enabled: Option<::Value>, + } + + impl ::codec::SerializeValue for ColdStorageOptions { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref enabled) = self.enabled { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Enabled", enabled)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ColdStorageOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ColdStorageOptions; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ColdStorageOptions") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut enabled: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Enabled" => { + enabled = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ColdStorageOptions { + enabled: enabled, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::Elasticsearch::Domain.DomainEndpointOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-domainendpointoptions.html) property type. #[derive(Debug, Default)] pub struct DomainEndpointOptions { @@ -637,6 +690,11 @@ pub mod domain { /// The [`AWS::Elasticsearch::Domain.ElasticsearchClusterConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html) property type. #[derive(Debug, Default)] pub struct ElasticsearchClusterConfig { + /// Property [`ColdStorageOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticsearchclusterconfig-coldstorageoptions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub cold_storage_options: Option<::Value>, /// Property [`DedicatedMasterCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-elasticsearchclusterconfig.html#cfn-elasticsearch-domain-elasticseachclusterconfig-dedicatedmastercount). /// /// Update type: _Mutable_. @@ -692,6 +750,9 @@ pub mod domain { impl ::codec::SerializeValue for ElasticsearchClusterConfig { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref cold_storage_options) = self.cold_storage_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ColdStorageOptions", cold_storage_options)?; + } if let Some(ref dedicated_master_count) = self.dedicated_master_count { ::serde::ser::SerializeMap::serialize_entry(&mut map, "DedicatedMasterCount", dedicated_master_count)?; } @@ -738,6 +799,7 @@ pub mod domain { } fn visit_map>(self, mut map: A) -> Result { + let mut cold_storage_options: Option<::Value> = None; let mut dedicated_master_count: Option<::Value> = None; let mut dedicated_master_enabled: Option<::Value> = None; let mut dedicated_master_type: Option<::Value> = None; @@ -751,6 +813,9 @@ pub mod domain { while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "ColdStorageOptions" => { + cold_storage_options = ::serde::de::MapAccess::next_value(&mut map)?; + } "DedicatedMasterCount" => { dedicated_master_count = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -786,6 +851,7 @@ pub mod domain { } Ok(ElasticsearchClusterConfig { + cold_storage_options: cold_storage_options, dedicated_master_count: dedicated_master_count, dedicated_master_enabled: dedicated_master_enabled, dedicated_master_type: dedicated_master_type, diff --git a/src/aws/emr.rs b/src/aws/emr.rs index f270286..5279ff6 100644 --- a/src/aws/emr.rs +++ b/src/aws/emr.rs @@ -520,6 +520,11 @@ pub struct InstanceGroupConfigProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub configurations: Option<::ValueList>, + /// Property [`CustomAmiId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-instancegroupconfig.html#cfn-emr-instancegroupconfig-customamiid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub custom_ami_id: Option<::Value>, /// Property [`EbsConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-instancegroupconfig.html#cfn-emr-instancegroupconfig-ebsconfiguration). /// /// Update type: _Immutable_. @@ -569,6 +574,9 @@ impl ::serde::Serialize for InstanceGroupConfigProperties { if let Some(ref configurations) = self.configurations { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Configurations", configurations)?; } + if let Some(ref custom_ami_id) = self.custom_ami_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CustomAmiId", custom_ami_id)?; + } if let Some(ref ebs_configuration) = self.ebs_configuration { ::serde::ser::SerializeMap::serialize_entry(&mut map, "EbsConfiguration", ebs_configuration)?; } @@ -601,6 +609,7 @@ impl<'de> ::serde::Deserialize<'de> for InstanceGroupConfigProperties { let mut auto_scaling_policy: Option<::Value> = None; let mut bid_price: Option<::Value> = None; let mut configurations: Option<::ValueList> = None; + let mut custom_ami_id: Option<::Value> = None; let mut ebs_configuration: Option<::Value> = None; let mut instance_count: Option<::Value> = None; let mut instance_role: Option<::Value> = None; @@ -620,6 +629,9 @@ impl<'de> ::serde::Deserialize<'de> for InstanceGroupConfigProperties { "Configurations" => { configurations = ::serde::de::MapAccess::next_value(&mut map)?; } + "CustomAmiId" => { + custom_ami_id = ::serde::de::MapAccess::next_value(&mut map)?; + } "EbsConfiguration" => { ebs_configuration = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -649,6 +661,7 @@ impl<'de> ::serde::Deserialize<'de> for InstanceGroupConfigProperties { auto_scaling_policy: auto_scaling_policy, bid_price: bid_price, configurations: configurations, + custom_ami_id: custom_ami_id, ebs_configuration: ebs_configuration, instance_count: instance_count.ok_or(::serde::de::Error::missing_field("InstanceCount"))?, instance_role: instance_role.ok_or(::serde::de::Error::missing_field("InstanceRole"))?, @@ -910,6 +923,16 @@ pub struct StudioProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub engine_security_group_id: ::Value, + /// Property [`IdpAuthUrl`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-studio.html#cfn-emr-studio-idpauthurl). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub idp_auth_url: Option<::Value>, + /// Property [`IdpRelayStateParameterName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-studio.html#cfn-emr-studio-idprelaystateparametername). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub idp_relay_state_parameter_name: Option<::Value>, /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-studio.html#cfn-emr-studio-name). /// /// Update type: _Mutable_. @@ -934,7 +957,7 @@ pub struct StudioProperties { /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub user_role: ::Value, + pub user_role: Option<::Value>, /// Property [`VpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-emr-studio.html#cfn-emr-studio-vpcid). /// /// Update type: _Immutable_. @@ -956,13 +979,21 @@ impl ::serde::Serialize for StudioProperties { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "EngineSecurityGroupId", &self.engine_security_group_id)?; + if let Some(ref idp_auth_url) = self.idp_auth_url { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IdpAuthUrl", idp_auth_url)?; + } + if let Some(ref idp_relay_state_parameter_name) = self.idp_relay_state_parameter_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IdpRelayStateParameterName", idp_relay_state_parameter_name)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServiceRole", &self.service_role)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetIds", &self.subnet_ids)?; if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "UserRole", &self.user_role)?; + if let Some(ref user_role) = self.user_role { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UserRole", user_role)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcId", &self.vpc_id)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "WorkspaceSecurityGroupId", &self.workspace_security_group_id)?; ::serde::ser::SerializeMap::end(map) @@ -985,6 +1016,8 @@ impl<'de> ::serde::Deserialize<'de> for StudioProperties { let mut default_s3_location: Option<::Value> = None; let mut description: Option<::Value> = None; let mut engine_security_group_id: Option<::Value> = None; + let mut idp_auth_url: Option<::Value> = None; + let mut idp_relay_state_parameter_name: Option<::Value> = None; let mut name: Option<::Value> = None; let mut service_role: Option<::Value> = None; let mut subnet_ids: Option<::ValueList> = None; @@ -1007,6 +1040,12 @@ impl<'de> ::serde::Deserialize<'de> for StudioProperties { "EngineSecurityGroupId" => { engine_security_group_id = ::serde::de::MapAccess::next_value(&mut map)?; } + "IdpAuthUrl" => { + idp_auth_url = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IdpRelayStateParameterName" => { + idp_relay_state_parameter_name = ::serde::de::MapAccess::next_value(&mut map)?; + } "Name" => { name = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1037,11 +1076,13 @@ impl<'de> ::serde::Deserialize<'de> for StudioProperties { default_s3_location: default_s3_location.ok_or(::serde::de::Error::missing_field("DefaultS3Location"))?, description: description, engine_security_group_id: engine_security_group_id.ok_or(::serde::de::Error::missing_field("EngineSecurityGroupId"))?, + idp_auth_url: idp_auth_url, + idp_relay_state_parameter_name: idp_relay_state_parameter_name, name: name.ok_or(::serde::de::Error::missing_field("Name"))?, service_role: service_role.ok_or(::serde::de::Error::missing_field("ServiceRole"))?, subnet_ids: subnet_ids.ok_or(::serde::de::Error::missing_field("SubnetIds"))?, tags: tags, - user_role: user_role.ok_or(::serde::de::Error::missing_field("UserRole"))?, + user_role: user_role, vpc_id: vpc_id.ok_or(::serde::de::Error::missing_field("VpcId"))?, workspace_security_group_id: workspace_security_group_id.ok_or(::serde::de::Error::missing_field("WorkspaceSecurityGroupId"))?, }) @@ -2135,6 +2176,11 @@ pub mod cluster { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub configurations: Option<::ValueList>, + /// Property [`CustomAmiId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancegroupconfig.html#cfn-elasticmapreduce-cluster-instancegroupconfig-customamiid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub custom_ami_id: Option<::Value>, /// Property [`EbsConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancegroupconfig.html#cfn-elasticmapreduce-cluster-instancegroupconfig-ebsconfiguration). /// /// Update type: _Immutable_. @@ -2174,6 +2220,9 @@ pub mod cluster { if let Some(ref configurations) = self.configurations { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Configurations", configurations)?; } + if let Some(ref custom_ami_id) = self.custom_ami_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CustomAmiId", custom_ami_id)?; + } if let Some(ref ebs_configuration) = self.ebs_configuration { ::serde::ser::SerializeMap::serialize_entry(&mut map, "EbsConfiguration", ebs_configuration)?; } @@ -2204,6 +2253,7 @@ pub mod cluster { let mut auto_scaling_policy: Option<::Value> = None; let mut bid_price: Option<::Value> = None; let mut configurations: Option<::ValueList> = None; + let mut custom_ami_id: Option<::Value> = None; let mut ebs_configuration: Option<::Value> = None; let mut instance_count: Option<::Value> = None; let mut instance_type: Option<::Value> = None; @@ -2221,6 +2271,9 @@ pub mod cluster { "Configurations" => { configurations = ::serde::de::MapAccess::next_value(&mut map)?; } + "CustomAmiId" => { + custom_ami_id = ::serde::de::MapAccess::next_value(&mut map)?; + } "EbsConfiguration" => { ebs_configuration = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -2244,6 +2297,7 @@ pub mod cluster { auto_scaling_policy: auto_scaling_policy, bid_price: bid_price, configurations: configurations, + custom_ami_id: custom_ami_id, ebs_configuration: ebs_configuration, instance_count: instance_count.ok_or(::serde::de::Error::missing_field("InstanceCount"))?, instance_type: instance_type.ok_or(::serde::de::Error::missing_field("InstanceType"))?, @@ -2275,6 +2329,11 @@ pub mod cluster { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub configurations: Option<::ValueList>, + /// Property [`CustomAmiId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancetypeconfig.html#cfn-elasticmapreduce-cluster-instancetypeconfig-customamiid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub custom_ami_id: Option<::Value>, /// Property [`EbsConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-cluster-instancetypeconfig.html#cfn-elasticmapreduce-cluster-instancetypeconfig-ebsconfiguration). /// /// Update type: _Immutable_. @@ -2304,6 +2363,9 @@ pub mod cluster { if let Some(ref configurations) = self.configurations { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Configurations", configurations)?; } + if let Some(ref custom_ami_id) = self.custom_ami_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CustomAmiId", custom_ami_id)?; + } if let Some(ref ebs_configuration) = self.ebs_configuration { ::serde::ser::SerializeMap::serialize_entry(&mut map, "EbsConfiguration", ebs_configuration)?; } @@ -2330,6 +2392,7 @@ pub mod cluster { let mut bid_price: Option<::Value> = None; let mut bid_price_as_percentage_of_on_demand_price: Option<::Value> = None; let mut configurations: Option<::ValueList> = None; + let mut custom_ami_id: Option<::Value> = None; let mut ebs_configuration: Option<::Value> = None; let mut instance_type: Option<::Value> = None; let mut weighted_capacity: Option<::Value> = None; @@ -2345,6 +2408,9 @@ pub mod cluster { "Configurations" => { configurations = ::serde::de::MapAccess::next_value(&mut map)?; } + "CustomAmiId" => { + custom_ami_id = ::serde::de::MapAccess::next_value(&mut map)?; + } "EbsConfiguration" => { ebs_configuration = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -2362,6 +2428,7 @@ pub mod cluster { bid_price: bid_price, bid_price_as_percentage_of_on_demand_price: bid_price_as_percentage_of_on_demand_price, configurations: configurations, + custom_ami_id: custom_ami_id, ebs_configuration: ebs_configuration, instance_type: instance_type.ok_or(::serde::de::Error::missing_field("InstanceType"))?, weighted_capacity: weighted_capacity, @@ -3944,6 +4011,11 @@ pub mod instance_fleet_config { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub configurations: Option<::ValueList>, + /// Property [`CustomAmiId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-instancetypeconfig.html#cfn-elasticmapreduce-instancefleetconfig-instancetypeconfig-customamiid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub custom_ami_id: Option<::Value>, /// Property [`EbsConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticmapreduce-instancefleetconfig-instancetypeconfig.html#cfn-elasticmapreduce-instancefleetconfig-instancetypeconfig-ebsconfiguration). /// /// Update type: _Immutable_. @@ -3973,6 +4045,9 @@ pub mod instance_fleet_config { if let Some(ref configurations) = self.configurations { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Configurations", configurations)?; } + if let Some(ref custom_ami_id) = self.custom_ami_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CustomAmiId", custom_ami_id)?; + } if let Some(ref ebs_configuration) = self.ebs_configuration { ::serde::ser::SerializeMap::serialize_entry(&mut map, "EbsConfiguration", ebs_configuration)?; } @@ -3999,6 +4074,7 @@ pub mod instance_fleet_config { let mut bid_price: Option<::Value> = None; let mut bid_price_as_percentage_of_on_demand_price: Option<::Value> = None; let mut configurations: Option<::ValueList> = None; + let mut custom_ami_id: Option<::Value> = None; let mut ebs_configuration: Option<::Value> = None; let mut instance_type: Option<::Value> = None; let mut weighted_capacity: Option<::Value> = None; @@ -4014,6 +4090,9 @@ pub mod instance_fleet_config { "Configurations" => { configurations = ::serde::de::MapAccess::next_value(&mut map)?; } + "CustomAmiId" => { + custom_ami_id = ::serde::de::MapAccess::next_value(&mut map)?; + } "EbsConfiguration" => { ebs_configuration = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -4031,6 +4110,7 @@ pub mod instance_fleet_config { bid_price: bid_price, bid_price_as_percentage_of_on_demand_price: bid_price_as_percentage_of_on_demand_price, configurations: configurations, + custom_ami_id: custom_ami_id, ebs_configuration: ebs_configuration, instance_type: instance_type.ok_or(::serde::de::Error::missing_field("InstanceType"))?, weighted_capacity: weighted_capacity, diff --git a/src/aws/events.rs b/src/aws/events.rs index 485f001..ca90a6a 100644 --- a/src/aws/events.rs +++ b/src/aws/events.rs @@ -278,7 +278,7 @@ pub struct ConnectionProperties { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub auth_parameters: ::Value<::json::Value>, + pub auth_parameters: ::Value, /// Property [`AuthorizationType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-connection.html#cfn-events-connection-authorizationtype). /// /// Update type: _Mutable_. @@ -323,7 +323,7 @@ impl<'de> ::serde::Deserialize<'de> for ConnectionProperties { } fn visit_map>(self, mut map: A) -> Result { - let mut auth_parameters: Option<::Value<::json::Value>> = None; + let mut auth_parameters: Option<::Value> = None; let mut authorization_type: Option<::Value> = None; let mut description: Option<::Value> = None; let mut name: Option<::Value> = None; @@ -378,6 +378,143 @@ impl From for Connection { } } +/// The [`AWS::Events::Endpoint`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-endpoint.html) resource type. +#[derive(Debug, Default)] +pub struct Endpoint { + properties: EndpointProperties +} + +/// Properties for the `Endpoint` resource. +#[derive(Debug, Default)] +pub struct EndpointProperties { + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-endpoint.html#cfn-events-endpoint-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`EventBuses`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-endpoint.html#cfn-events-endpoint-eventbuses). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub event_buses: ::ValueList, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-endpoint.html#cfn-events-endpoint-name). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub name: ::Value, + /// Property [`ReplicationConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-endpoint.html#cfn-events-endpoint-replicationconfig). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub replication_config: Option<::Value>, + /// Property [`RoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-endpoint.html#cfn-events-endpoint-rolearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub role_arn: Option<::Value>, + /// Property [`RoutingConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-endpoint.html#cfn-events-endpoint-routingconfig). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub routing_config: ::Value, +} + +impl ::serde::Serialize for EndpointProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EventBuses", &self.event_buses)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + if let Some(ref replication_config) = self.replication_config { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReplicationConfig", replication_config)?; + } + if let Some(ref role_arn) = self.role_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RoleArn", role_arn)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RoutingConfig", &self.routing_config)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for EndpointProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = EndpointProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type EndpointProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut description: Option<::Value> = None; + let mut event_buses: Option<::ValueList> = None; + let mut name: Option<::Value> = None; + let mut replication_config: Option<::Value> = None; + let mut role_arn: Option<::Value> = None; + let mut routing_config: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EventBuses" => { + event_buses = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ReplicationConfig" => { + replication_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RoleArn" => { + role_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RoutingConfig" => { + routing_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(EndpointProperties { + description: description, + event_buses: event_buses.ok_or(::serde::de::Error::missing_field("EventBuses"))?, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + replication_config: replication_config, + role_arn: role_arn, + routing_config: routing_config.ok_or(::serde::de::Error::missing_field("RoutingConfig"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for Endpoint { + type Properties = EndpointProperties; + const TYPE: &'static str = "AWS::Events::Endpoint"; + fn properties(&self) -> &EndpointProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut EndpointProperties { + &mut self.properties + } +} + +impl ::private::Sealed for Endpoint {} + +impl From for Endpoint { + fn from(properties: EndpointProperties) -> Endpoint { + Endpoint { properties } + } +} + /// The [`AWS::Events::EventBus`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbus.html) resource type. #[derive(Debug, Default)] pub struct EventBus { @@ -397,6 +534,11 @@ pub struct EventBusProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub name: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-events-eventbus.html#cfn-events-eventbus-tags). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub tags: Option<::ValueList>, } impl ::serde::Serialize for EventBusProperties { @@ -406,6 +548,9 @@ impl ::serde::Serialize for EventBusProperties { ::serde::ser::SerializeMap::serialize_entry(&mut map, "EventSourceName", event_source_name)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -424,6 +569,7 @@ impl<'de> ::serde::Deserialize<'de> for EventBusProperties { fn visit_map>(self, mut map: A) -> Result { let mut event_source_name: Option<::Value> = None; let mut name: Option<::Value> = None; + let mut tags: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { @@ -433,6 +579,9 @@ impl<'de> ::serde::Deserialize<'de> for EventBusProperties { "Name" => { name = ::serde::de::MapAccess::next_value(&mut map)?; } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } @@ -440,6 +589,7 @@ impl<'de> ::serde::Deserialize<'de> for EventBusProperties { Ok(EventBusProperties { event_source_name: event_source_name, name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + tags: tags, }) } } @@ -777,80 +927,63 @@ impl From for Rule { } } -pub mod event_bus_policy { - //! Property types for the `EventBusPolicy` resource. +pub mod connection { + //! Property types for the `Connection` resource. - /// The [`AWS::Events::EventBusPolicy.Condition`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-eventbuspolicy-condition.html) property type. + /// The [`AWS::Events::Connection.ApiKeyAuthParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-apikeyauthparameters.html) property type. #[derive(Debug, Default)] - pub struct Condition { - /// Property [`Key`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-eventbuspolicy-condition.html#cfn-events-eventbuspolicy-condition-key). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub key: Option<::Value>, - /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-eventbuspolicy-condition.html#cfn-events-eventbuspolicy-condition-type). + pub struct ApiKeyAuthParameters { + /// Property [`ApiKeyName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-apikeyauthparameters.html#cfn-events-connection-apikeyauthparameters-apikeyname). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub r#type: Option<::Value>, - /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-eventbuspolicy-condition.html#cfn-events-eventbuspolicy-condition-value). + pub api_key_name: ::Value, + /// Property [`ApiKeyValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-apikeyauthparameters.html#cfn-events-connection-apikeyauthparameters-apikeyvalue). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub value: Option<::Value>, + pub api_key_value: ::Value, } - impl ::codec::SerializeValue for Condition { + impl ::codec::SerializeValue for ApiKeyAuthParameters { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref key) = self.key { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Key", key)?; - } - if let Some(ref r#type) = self.r#type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", r#type)?; - } - if let Some(ref value) = self.value { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", value)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ApiKeyName", &self.api_key_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ApiKeyValue", &self.api_key_value)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for Condition { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for ApiKeyAuthParameters { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = Condition; + type Value = ApiKeyAuthParameters; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type Condition") + write!(f, "a struct of type ApiKeyAuthParameters") } fn visit_map>(self, mut map: A) -> Result { - let mut key: Option<::Value> = None; - let mut r#type: Option<::Value> = None; - let mut value: Option<::Value> = None; + let mut api_key_name: Option<::Value> = None; + let mut api_key_value: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Key" => { - key = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Type" => { - r#type = ::serde::de::MapAccess::next_value(&mut map)?; + "ApiKeyName" => { + api_key_name = ::serde::de::MapAccess::next_value(&mut map)?; } - "Value" => { - value = ::serde::de::MapAccess::next_value(&mut map)?; + "ApiKeyValue" => { + api_key_value = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(Condition { - key: key, - r#type: r#type, - value: value, + Ok(ApiKeyAuthParameters { + api_key_name: api_key_name.ok_or(::serde::de::Error::missing_field("ApiKeyName"))?, + api_key_value: api_key_value.ok_or(::serde::de::Error::missing_field("ApiKeyValue"))?, }) } } @@ -858,80 +991,91 @@ pub mod event_bus_policy { d.deserialize_map(Visitor) } } -} - -pub mod rule { - //! Property types for the `Rule` resource. - /// The [`AWS::Events::Rule.AwsVpcConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-awsvpcconfiguration.html) property type. + /// The [`AWS::Events::Connection.AuthParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-authparameters.html) property type. #[derive(Debug, Default)] - pub struct AwsVpcConfiguration { - /// Property [`AssignPublicIp`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-awsvpcconfiguration.html#cfn-events-rule-awsvpcconfiguration-assignpublicip). + pub struct AuthParameters { + /// Property [`ApiKeyAuthParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-authparameters.html#cfn-events-connection-authparameters-apikeyauthparameters). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub assign_public_ip: Option<::Value>, - /// Property [`SecurityGroups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-awsvpcconfiguration.html#cfn-events-rule-awsvpcconfiguration-securitygroups). + pub api_key_auth_parameters: Option<::Value>, + /// Property [`BasicAuthParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-authparameters.html#cfn-events-connection-authparameters-basicauthparameters). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub security_groups: Option<::ValueList>, - /// Property [`Subnets`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-awsvpcconfiguration.html#cfn-events-rule-awsvpcconfiguration-subnets). + pub basic_auth_parameters: Option<::Value>, + /// Property [`InvocationHttpParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-authparameters.html#cfn-events-connection-authparameters-invocationhttpparameters). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub subnets: ::ValueList, + pub invocation_http_parameters: Option<::Value>, + /// Property [`OAuthParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-authparameters.html#cfn-events-connection-authparameters-oauthparameters). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub o_auth_parameters: Option<::Value>, } - impl ::codec::SerializeValue for AwsVpcConfiguration { + impl ::codec::SerializeValue for AuthParameters { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref assign_public_ip) = self.assign_public_ip { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AssignPublicIp", assign_public_ip)?; + if let Some(ref api_key_auth_parameters) = self.api_key_auth_parameters { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ApiKeyAuthParameters", api_key_auth_parameters)?; } - if let Some(ref security_groups) = self.security_groups { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityGroups", security_groups)?; + if let Some(ref basic_auth_parameters) = self.basic_auth_parameters { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BasicAuthParameters", basic_auth_parameters)?; + } + if let Some(ref invocation_http_parameters) = self.invocation_http_parameters { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InvocationHttpParameters", invocation_http_parameters)?; + } + if let Some(ref o_auth_parameters) = self.o_auth_parameters { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OAuthParameters", o_auth_parameters)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Subnets", &self.subnets)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for AwsVpcConfiguration { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for AuthParameters { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = AwsVpcConfiguration; + type Value = AuthParameters; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type AwsVpcConfiguration") + write!(f, "a struct of type AuthParameters") } fn visit_map>(self, mut map: A) -> Result { - let mut assign_public_ip: Option<::Value> = None; - let mut security_groups: Option<::ValueList> = None; - let mut subnets: Option<::ValueList> = None; + let mut api_key_auth_parameters: Option<::Value> = None; + let mut basic_auth_parameters: Option<::Value> = None; + let mut invocation_http_parameters: Option<::Value> = None; + let mut o_auth_parameters: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "AssignPublicIp" => { - assign_public_ip = ::serde::de::MapAccess::next_value(&mut map)?; + "ApiKeyAuthParameters" => { + api_key_auth_parameters = ::serde::de::MapAccess::next_value(&mut map)?; } - "SecurityGroups" => { - security_groups = ::serde::de::MapAccess::next_value(&mut map)?; + "BasicAuthParameters" => { + basic_auth_parameters = ::serde::de::MapAccess::next_value(&mut map)?; } - "Subnets" => { - subnets = ::serde::de::MapAccess::next_value(&mut map)?; + "InvocationHttpParameters" => { + invocation_http_parameters = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OAuthParameters" => { + o_auth_parameters = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(AwsVpcConfiguration { - assign_public_ip: assign_public_ip, - security_groups: security_groups, - subnets: subnets.ok_or(::serde::de::Error::missing_field("Subnets"))?, + Ok(AuthParameters { + api_key_auth_parameters: api_key_auth_parameters, + basic_auth_parameters: basic_auth_parameters, + invocation_http_parameters: invocation_http_parameters, + o_auth_parameters: o_auth_parameters, }) } } @@ -940,51 +1084,60 @@ pub mod rule { } } - /// The [`AWS::Events::Rule.BatchArrayProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batcharrayproperties.html) property type. + /// The [`AWS::Events::Connection.BasicAuthParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-basicauthparameters.html) property type. #[derive(Debug, Default)] - pub struct BatchArrayProperties { - /// Property [`Size`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batcharrayproperties.html#cfn-events-rule-batcharrayproperties-size). + pub struct BasicAuthParameters { + /// Property [`Password`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-basicauthparameters.html#cfn-events-connection-basicauthparameters-password). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub size: Option<::Value>, + pub password: ::Value, + /// Property [`Username`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-basicauthparameters.html#cfn-events-connection-basicauthparameters-username). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub username: ::Value, } - impl ::codec::SerializeValue for BatchArrayProperties { + impl ::codec::SerializeValue for BasicAuthParameters { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref size) = self.size { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Size", size)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Password", &self.password)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Username", &self.username)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for BatchArrayProperties { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for BasicAuthParameters { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = BatchArrayProperties; + type Value = BasicAuthParameters; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type BatchArrayProperties") + write!(f, "a struct of type BasicAuthParameters") } fn visit_map>(self, mut map: A) -> Result { - let mut size: Option<::Value> = None; + let mut password: Option<::Value> = None; + let mut username: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "Size" => { - size = ::serde::de::MapAccess::next_value(&mut map)?; + "Password" => { + password = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Username" => { + username = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(BatchArrayProperties { - size: size, + Ok(BasicAuthParameters { + password: password.ok_or(::serde::de::Error::missing_field("Password"))?, + username: username.ok_or(::serde::de::Error::missing_field("Username"))?, }) } } @@ -993,86 +1146,60 @@ pub mod rule { } } - /// The [`AWS::Events::Rule.BatchParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batchparameters.html) property type. + /// The [`AWS::Events::Connection.ClientParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-clientparameters.html) property type. #[derive(Debug, Default)] - pub struct BatchParameters { - /// Property [`ArrayProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batchparameters.html#cfn-events-rule-batchparameters-arrayproperties). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub array_properties: Option<::Value>, - /// Property [`JobDefinition`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batchparameters.html#cfn-events-rule-batchparameters-jobdefinition). + pub struct ClientParameters { + /// Property [`ClientID`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-clientparameters.html#cfn-events-connection-clientparameters-clientid). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub job_definition: ::Value, - /// Property [`JobName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batchparameters.html#cfn-events-rule-batchparameters-jobname). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub job_name: ::Value, - /// Property [`RetryStrategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batchparameters.html#cfn-events-rule-batchparameters-retrystrategy). + pub client_id: ::Value, + /// Property [`ClientSecret`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-clientparameters.html#cfn-events-connection-clientparameters-clientsecret). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub retry_strategy: Option<::Value>, + pub client_secret: ::Value, } - impl ::codec::SerializeValue for BatchParameters { + impl ::codec::SerializeValue for ClientParameters { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref array_properties) = self.array_properties { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ArrayProperties", array_properties)?; - } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "JobDefinition", &self.job_definition)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "JobName", &self.job_name)?; - if let Some(ref retry_strategy) = self.retry_strategy { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "RetryStrategy", retry_strategy)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ClientID", &self.client_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ClientSecret", &self.client_secret)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for BatchParameters { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for ClientParameters { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = BatchParameters; + type Value = ClientParameters; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type BatchParameters") + write!(f, "a struct of type ClientParameters") } fn visit_map>(self, mut map: A) -> Result { - let mut array_properties: Option<::Value> = None; - let mut job_definition: Option<::Value> = None; - let mut job_name: Option<::Value> = None; - let mut retry_strategy: Option<::Value> = None; + let mut client_id: Option<::Value> = None; + let mut client_secret: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "ArrayProperties" => { - array_properties = ::serde::de::MapAccess::next_value(&mut map)?; - } - "JobDefinition" => { - job_definition = ::serde::de::MapAccess::next_value(&mut map)?; - } - "JobName" => { - job_name = ::serde::de::MapAccess::next_value(&mut map)?; + "ClientID" => { + client_id = ::serde::de::MapAccess::next_value(&mut map)?; } - "RetryStrategy" => { - retry_strategy = ::serde::de::MapAccess::next_value(&mut map)?; + "ClientSecret" => { + client_secret = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(BatchParameters { - array_properties: array_properties, - job_definition: job_definition.ok_or(::serde::de::Error::missing_field("JobDefinition"))?, - job_name: job_name.ok_or(::serde::de::Error::missing_field("JobName"))?, - retry_strategy: retry_strategy, + Ok(ClientParameters { + client_id: client_id.ok_or(::serde::de::Error::missing_field("ClientID"))?, + client_secret: client_secret.ok_or(::serde::de::Error::missing_field("ClientSecret"))?, }) } } @@ -1081,18 +1208,950 @@ pub mod rule { } } - /// The [`AWS::Events::Rule.BatchRetryStrategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batchretrystrategy.html) property type. + /// The [`AWS::Events::Connection.ConnectionHttpParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-connectionhttpparameters.html) property type. #[derive(Debug, Default)] - pub struct BatchRetryStrategy { - /// Property [`Attempts`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batchretrystrategy.html#cfn-events-rule-batchretrystrategy-attempts). + pub struct ConnectionHttpParameters { + /// Property [`BodyParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-connectionhttpparameters.html#cfn-events-connection-connectionhttpparameters-bodyparameters). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub attempts: Option<::Value>, - } - - impl ::codec::SerializeValue for BatchRetryStrategy { - fn serialize(&self, s: S) -> Result { + pub body_parameters: Option<::ValueList>, + /// Property [`HeaderParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-connectionhttpparameters.html#cfn-events-connection-connectionhttpparameters-headerparameters). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub header_parameters: Option<::ValueList>, + /// Property [`QueryStringParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-connectionhttpparameters.html#cfn-events-connection-connectionhttpparameters-querystringparameters). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub query_string_parameters: Option<::ValueList>, + } + + impl ::codec::SerializeValue for ConnectionHttpParameters { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref body_parameters) = self.body_parameters { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BodyParameters", body_parameters)?; + } + if let Some(ref header_parameters) = self.header_parameters { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HeaderParameters", header_parameters)?; + } + if let Some(ref query_string_parameters) = self.query_string_parameters { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "QueryStringParameters", query_string_parameters)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ConnectionHttpParameters { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ConnectionHttpParameters; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ConnectionHttpParameters") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut body_parameters: Option<::ValueList> = None; + let mut header_parameters: Option<::ValueList> = None; + let mut query_string_parameters: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "BodyParameters" => { + body_parameters = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HeaderParameters" => { + header_parameters = ::serde::de::MapAccess::next_value(&mut map)?; + } + "QueryStringParameters" => { + query_string_parameters = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ConnectionHttpParameters { + body_parameters: body_parameters, + header_parameters: header_parameters, + query_string_parameters: query_string_parameters, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Events::Connection.OAuthParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-oauthparameters.html) property type. + #[derive(Debug, Default)] + pub struct OAuthParameters { + /// Property [`AuthorizationEndpoint`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-oauthparameters.html#cfn-events-connection-oauthparameters-authorizationendpoint). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub authorization_endpoint: ::Value, + /// Property [`ClientParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-oauthparameters.html#cfn-events-connection-oauthparameters-clientparameters). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub client_parameters: ::Value, + /// Property [`HttpMethod`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-oauthparameters.html#cfn-events-connection-oauthparameters-httpmethod). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub http_method: ::Value, + /// Property [`OAuthHttpParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-oauthparameters.html#cfn-events-connection-oauthparameters-oauthhttpparameters). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub o_auth_http_parameters: Option<::Value>, + } + + impl ::codec::SerializeValue for OAuthParameters { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AuthorizationEndpoint", &self.authorization_endpoint)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ClientParameters", &self.client_parameters)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HttpMethod", &self.http_method)?; + if let Some(ref o_auth_http_parameters) = self.o_auth_http_parameters { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OAuthHttpParameters", o_auth_http_parameters)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for OAuthParameters { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = OAuthParameters; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type OAuthParameters") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut authorization_endpoint: Option<::Value> = None; + let mut client_parameters: Option<::Value> = None; + let mut http_method: Option<::Value> = None; + let mut o_auth_http_parameters: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AuthorizationEndpoint" => { + authorization_endpoint = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ClientParameters" => { + client_parameters = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HttpMethod" => { + http_method = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OAuthHttpParameters" => { + o_auth_http_parameters = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(OAuthParameters { + authorization_endpoint: authorization_endpoint.ok_or(::serde::de::Error::missing_field("AuthorizationEndpoint"))?, + client_parameters: client_parameters.ok_or(::serde::de::Error::missing_field("ClientParameters"))?, + http_method: http_method.ok_or(::serde::de::Error::missing_field("HttpMethod"))?, + o_auth_http_parameters: o_auth_http_parameters, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Events::Connection.Parameter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-parameter.html) property type. + #[derive(Debug, Default)] + pub struct Parameter { + /// Property [`IsValueSecret`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-parameter.html#cfn-events-connection-parameter-isvaluesecret). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub is_value_secret: Option<::Value>, + /// Property [`Key`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-parameter.html#cfn-events-connection-parameter-key). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub key: ::Value, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-connection-parameter.html#cfn-events-connection-parameter-value). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub value: ::Value, + } + + impl ::codec::SerializeValue for Parameter { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref is_value_secret) = self.is_value_secret { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IsValueSecret", is_value_secret)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Key", &self.key)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", &self.value)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Parameter { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Parameter; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Parameter") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut is_value_secret: Option<::Value> = None; + let mut key: Option<::Value> = None; + let mut value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "IsValueSecret" => { + is_value_secret = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Key" => { + key = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Parameter { + is_value_secret: is_value_secret, + key: key.ok_or(::serde::de::Error::missing_field("Key"))?, + value: value.ok_or(::serde::de::Error::missing_field("Value"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + +pub mod endpoint { + //! Property types for the `Endpoint` resource. + + /// The [`AWS::Events::Endpoint.EndpointEventBus`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-endpointeventbus.html) property type. + #[derive(Debug, Default)] + pub struct EndpointEventBus { + /// Property [`EventBusArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-endpointeventbus.html#cfn-events-endpoint-endpointeventbus-eventbusarn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub event_bus_arn: ::Value, + } + + impl ::codec::SerializeValue for EndpointEventBus { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EventBusArn", &self.event_bus_arn)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for EndpointEventBus { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = EndpointEventBus; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type EndpointEventBus") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut event_bus_arn: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "EventBusArn" => { + event_bus_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(EndpointEventBus { + event_bus_arn: event_bus_arn.ok_or(::serde::de::Error::missing_field("EventBusArn"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Events::Endpoint.FailoverConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-failoverconfig.html) property type. + #[derive(Debug, Default)] + pub struct FailoverConfig { + /// Property [`Primary`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-failoverconfig.html#cfn-events-endpoint-failoverconfig-primary). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub primary: ::Value, + /// Property [`Secondary`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-failoverconfig.html#cfn-events-endpoint-failoverconfig-secondary). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub secondary: ::Value, + } + + impl ::codec::SerializeValue for FailoverConfig { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Primary", &self.primary)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Secondary", &self.secondary)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for FailoverConfig { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = FailoverConfig; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type FailoverConfig") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut primary: Option<::Value> = None; + let mut secondary: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Primary" => { + primary = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Secondary" => { + secondary = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(FailoverConfig { + primary: primary.ok_or(::serde::de::Error::missing_field("Primary"))?, + secondary: secondary.ok_or(::serde::de::Error::missing_field("Secondary"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Events::Endpoint.Primary`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-primary.html) property type. + #[derive(Debug, Default)] + pub struct Primary { + /// Property [`HealthCheck`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-primary.html#cfn-events-endpoint-primary-healthcheck). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub health_check: ::Value, + } + + impl ::codec::SerializeValue for Primary { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HealthCheck", &self.health_check)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Primary { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Primary; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Primary") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut health_check: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "HealthCheck" => { + health_check = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Primary { + health_check: health_check.ok_or(::serde::de::Error::missing_field("HealthCheck"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Events::Endpoint.ReplicationConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-replicationconfig.html) property type. + #[derive(Debug, Default)] + pub struct ReplicationConfig { + /// Property [`State`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-replicationconfig.html#cfn-events-endpoint-replicationconfig-state). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub state: ::Value, + } + + impl ::codec::SerializeValue for ReplicationConfig { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "State", &self.state)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ReplicationConfig { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ReplicationConfig; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ReplicationConfig") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut state: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "State" => { + state = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ReplicationConfig { + state: state.ok_or(::serde::de::Error::missing_field("State"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Events::Endpoint.RoutingConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-routingconfig.html) property type. + #[derive(Debug, Default)] + pub struct RoutingConfig { + /// Property [`FailoverConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-routingconfig.html#cfn-events-endpoint-routingconfig-failoverconfig). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub failover_config: ::Value, + } + + impl ::codec::SerializeValue for RoutingConfig { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FailoverConfig", &self.failover_config)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for RoutingConfig { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = RoutingConfig; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type RoutingConfig") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut failover_config: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "FailoverConfig" => { + failover_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(RoutingConfig { + failover_config: failover_config.ok_or(::serde::de::Error::missing_field("FailoverConfig"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Events::Endpoint.Secondary`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-secondary.html) property type. + #[derive(Debug, Default)] + pub struct Secondary { + /// Property [`Route`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-endpoint-secondary.html#cfn-events-endpoint-secondary-route). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub route: ::Value, + } + + impl ::codec::SerializeValue for Secondary { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Route", &self.route)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Secondary { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Secondary; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Secondary") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut route: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Route" => { + route = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Secondary { + route: route.ok_or(::serde::de::Error::missing_field("Route"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + +pub mod event_bus { + //! Property types for the `EventBus` resource. + + /// The [`AWS::Events::EventBus.TagEntry`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-eventbus-tagentry.html) property type. + #[derive(Debug, Default)] + pub struct TagEntry { + /// Property [`Key`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-eventbus-tagentry.html#cfn-events-eventbus-tagentry-key). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub key: ::Value, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-eventbus-tagentry.html#cfn-events-eventbus-tagentry-value). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub value: ::Value, + } + + impl ::codec::SerializeValue for TagEntry { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Key", &self.key)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", &self.value)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for TagEntry { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = TagEntry; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type TagEntry") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut key: Option<::Value> = None; + let mut value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Key" => { + key = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(TagEntry { + key: key.ok_or(::serde::de::Error::missing_field("Key"))?, + value: value.ok_or(::serde::de::Error::missing_field("Value"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + +pub mod event_bus_policy { + //! Property types for the `EventBusPolicy` resource. + + /// The [`AWS::Events::EventBusPolicy.Condition`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-eventbuspolicy-condition.html) property type. + #[derive(Debug, Default)] + pub struct Condition { + /// Property [`Key`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-eventbuspolicy-condition.html#cfn-events-eventbuspolicy-condition-key). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub key: Option<::Value>, + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-eventbuspolicy-condition.html#cfn-events-eventbuspolicy-condition-type). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#type: Option<::Value>, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-eventbuspolicy-condition.html#cfn-events-eventbuspolicy-condition-value). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub value: Option<::Value>, + } + + impl ::codec::SerializeValue for Condition { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref key) = self.key { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Key", key)?; + } + if let Some(ref r#type) = self.r#type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", r#type)?; + } + if let Some(ref value) = self.value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", value)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Condition { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Condition; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Condition") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut key: Option<::Value> = None; + let mut r#type: Option<::Value> = None; + let mut value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Key" => { + key = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Condition { + key: key, + r#type: r#type, + value: value, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + +pub mod rule { + //! Property types for the `Rule` resource. + + /// The [`AWS::Events::Rule.AwsVpcConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-awsvpcconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct AwsVpcConfiguration { + /// Property [`AssignPublicIp`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-awsvpcconfiguration.html#cfn-events-rule-awsvpcconfiguration-assignpublicip). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub assign_public_ip: Option<::Value>, + /// Property [`SecurityGroups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-awsvpcconfiguration.html#cfn-events-rule-awsvpcconfiguration-securitygroups). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub security_groups: Option<::ValueList>, + /// Property [`Subnets`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-awsvpcconfiguration.html#cfn-events-rule-awsvpcconfiguration-subnets). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub subnets: ::ValueList, + } + + impl ::codec::SerializeValue for AwsVpcConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref assign_public_ip) = self.assign_public_ip { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AssignPublicIp", assign_public_ip)?; + } + if let Some(ref security_groups) = self.security_groups { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityGroups", security_groups)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Subnets", &self.subnets)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AwsVpcConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AwsVpcConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AwsVpcConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut assign_public_ip: Option<::Value> = None; + let mut security_groups: Option<::ValueList> = None; + let mut subnets: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AssignPublicIp" => { + assign_public_ip = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SecurityGroups" => { + security_groups = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Subnets" => { + subnets = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AwsVpcConfiguration { + assign_public_ip: assign_public_ip, + security_groups: security_groups, + subnets: subnets.ok_or(::serde::de::Error::missing_field("Subnets"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Events::Rule.BatchArrayProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batcharrayproperties.html) property type. + #[derive(Debug, Default)] + pub struct BatchArrayProperties { + /// Property [`Size`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batcharrayproperties.html#cfn-events-rule-batcharrayproperties-size). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub size: Option<::Value>, + } + + impl ::codec::SerializeValue for BatchArrayProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref size) = self.size { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Size", size)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for BatchArrayProperties { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = BatchArrayProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type BatchArrayProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut size: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Size" => { + size = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(BatchArrayProperties { + size: size, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Events::Rule.BatchParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batchparameters.html) property type. + #[derive(Debug, Default)] + pub struct BatchParameters { + /// Property [`ArrayProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batchparameters.html#cfn-events-rule-batchparameters-arrayproperties). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub array_properties: Option<::Value>, + /// Property [`JobDefinition`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batchparameters.html#cfn-events-rule-batchparameters-jobdefinition). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub job_definition: ::Value, + /// Property [`JobName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batchparameters.html#cfn-events-rule-batchparameters-jobname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub job_name: ::Value, + /// Property [`RetryStrategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batchparameters.html#cfn-events-rule-batchparameters-retrystrategy). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub retry_strategy: Option<::Value>, + } + + impl ::codec::SerializeValue for BatchParameters { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref array_properties) = self.array_properties { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ArrayProperties", array_properties)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "JobDefinition", &self.job_definition)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "JobName", &self.job_name)?; + if let Some(ref retry_strategy) = self.retry_strategy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RetryStrategy", retry_strategy)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for BatchParameters { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = BatchParameters; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type BatchParameters") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut array_properties: Option<::Value> = None; + let mut job_definition: Option<::Value> = None; + let mut job_name: Option<::Value> = None; + let mut retry_strategy: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ArrayProperties" => { + array_properties = ::serde::de::MapAccess::next_value(&mut map)?; + } + "JobDefinition" => { + job_definition = ::serde::de::MapAccess::next_value(&mut map)?; + } + "JobName" => { + job_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RetryStrategy" => { + retry_strategy = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(BatchParameters { + array_properties: array_properties, + job_definition: job_definition.ok_or(::serde::de::Error::missing_field("JobDefinition"))?, + job_name: job_name.ok_or(::serde::de::Error::missing_field("JobName"))?, + retry_strategy: retry_strategy, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Events::Rule.BatchRetryStrategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batchretrystrategy.html) property type. + #[derive(Debug, Default)] + pub struct BatchRetryStrategy { + /// Property [`Attempts`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-batchretrystrategy.html#cfn-events-rule-batchretrystrategy-attempts). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub attempts: Option<::Value>, + } + + impl ::codec::SerializeValue for BatchRetryStrategy { + fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; if let Some(ref attempts) = self.attempts { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Attempts", attempts)?; @@ -1134,6 +2193,83 @@ pub mod rule { } } + /// The [`AWS::Events::Rule.CapacityProviderStrategyItem`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-capacityproviderstrategyitem.html) property type. + #[derive(Debug, Default)] + pub struct CapacityProviderStrategyItem { + /// Property [`Base`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-capacityproviderstrategyitem.html#cfn-events-rule-capacityproviderstrategyitem-base). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub base: Option<::Value>, + /// Property [`CapacityProvider`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-capacityproviderstrategyitem.html#cfn-events-rule-capacityproviderstrategyitem-capacityprovider). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub capacity_provider: ::Value, + /// Property [`Weight`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-capacityproviderstrategyitem.html#cfn-events-rule-capacityproviderstrategyitem-weight). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub weight: Option<::Value>, + } + + impl ::codec::SerializeValue for CapacityProviderStrategyItem { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref base) = self.base { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Base", base)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CapacityProvider", &self.capacity_provider)?; + if let Some(ref weight) = self.weight { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Weight", weight)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CapacityProviderStrategyItem { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CapacityProviderStrategyItem; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CapacityProviderStrategyItem") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut base: Option<::Value> = None; + let mut capacity_provider: Option<::Value> = None; + let mut weight: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Base" => { + base = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CapacityProvider" => { + capacity_provider = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Weight" => { + weight = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CapacityProviderStrategyItem { + base: base, + capacity_provider: capacity_provider.ok_or(::serde::de::Error::missing_field("CapacityProvider"))?, + weight: weight, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::Events::Rule.DeadLetterConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-deadletterconfig.html) property type. #[derive(Debug, Default)] pub struct DeadLetterConfig { @@ -1190,6 +2326,21 @@ pub mod rule { /// The [`AWS::Events::Rule.EcsParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html) property type. #[derive(Debug, Default)] pub struct EcsParameters { + /// Property [`CapacityProviderStrategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-capacityproviderstrategy). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub capacity_provider_strategy: Option<::ValueList>, + /// Property [`EnableECSManagedTags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-enableecsmanagedtags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enable_ecs_managed_tags: Option<::Value>, + /// Property [`EnableExecuteCommand`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-enableexecutecommand). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enable_execute_command: Option<::Value>, /// Property [`Group`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-group). /// /// Update type: _Mutable_. @@ -1205,11 +2356,36 @@ pub mod rule { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub network_configuration: Option<::Value>, + /// Property [`PlacementConstraints`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-placementconstraints). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub placement_constraints: Option<::ValueList>, + /// Property [`PlacementStrategies`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-placementstrategies). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub placement_strategies: Option<::ValueList>, /// Property [`PlatformVersion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-platformversion). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub platform_version: Option<::Value>, + pub platform_version: Option<::Value>, + /// Property [`PropagateTags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-propagatetags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub propagate_tags: Option<::Value>, + /// Property [`ReferenceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-referenceid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub reference_id: Option<::Value>, + /// Property [`TagList`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-taglist). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tag_list: Option<::ValueList<::Tag>>, /// Property [`TaskCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-ecsparameters.html#cfn-events-rule-ecsparameters-taskcount). /// /// Update type: _Mutable_. @@ -1225,6 +2401,15 @@ pub mod rule { impl ::codec::SerializeValue for EcsParameters { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref capacity_provider_strategy) = self.capacity_provider_strategy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CapacityProviderStrategy", capacity_provider_strategy)?; + } + if let Some(ref enable_ecs_managed_tags) = self.enable_ecs_managed_tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EnableECSManagedTags", enable_ecs_managed_tags)?; + } + if let Some(ref enable_execute_command) = self.enable_execute_command { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EnableExecuteCommand", enable_execute_command)?; + } if let Some(ref group) = self.group { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Group", group)?; } @@ -1234,9 +2419,24 @@ pub mod rule { if let Some(ref network_configuration) = self.network_configuration { ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkConfiguration", network_configuration)?; } + if let Some(ref placement_constraints) = self.placement_constraints { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PlacementConstraints", placement_constraints)?; + } + if let Some(ref placement_strategies) = self.placement_strategies { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PlacementStrategies", placement_strategies)?; + } if let Some(ref platform_version) = self.platform_version { ::serde::ser::SerializeMap::serialize_entry(&mut map, "PlatformVersion", platform_version)?; } + if let Some(ref propagate_tags) = self.propagate_tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PropagateTags", propagate_tags)?; + } + if let Some(ref reference_id) = self.reference_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReferenceId", reference_id)?; + } + if let Some(ref tag_list) = self.tag_list { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TagList", tag_list)?; + } if let Some(ref task_count) = self.task_count { ::serde::ser::SerializeMap::serialize_entry(&mut map, "TaskCount", task_count)?; } @@ -1257,15 +2457,32 @@ pub mod rule { } fn visit_map>(self, mut map: A) -> Result { + let mut capacity_provider_strategy: Option<::ValueList> = None; + let mut enable_ecs_managed_tags: Option<::Value> = None; + let mut enable_execute_command: Option<::Value> = None; let mut group: Option<::Value> = None; let mut launch_type: Option<::Value> = None; let mut network_configuration: Option<::Value> = None; + let mut placement_constraints: Option<::ValueList> = None; + let mut placement_strategies: Option<::ValueList> = None; let mut platform_version: Option<::Value> = None; + let mut propagate_tags: Option<::Value> = None; + let mut reference_id: Option<::Value> = None; + let mut tag_list: Option<::ValueList<::Tag>> = None; let mut task_count: Option<::Value> = None; let mut task_definition_arn: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "CapacityProviderStrategy" => { + capacity_provider_strategy = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EnableECSManagedTags" => { + enable_ecs_managed_tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EnableExecuteCommand" => { + enable_execute_command = ::serde::de::MapAccess::next_value(&mut map)?; + } "Group" => { group = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1275,9 +2492,24 @@ pub mod rule { "NetworkConfiguration" => { network_configuration = ::serde::de::MapAccess::next_value(&mut map)?; } + "PlacementConstraints" => { + placement_constraints = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PlacementStrategies" => { + placement_strategies = ::serde::de::MapAccess::next_value(&mut map)?; + } "PlatformVersion" => { platform_version = ::serde::de::MapAccess::next_value(&mut map)?; } + "PropagateTags" => { + propagate_tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ReferenceId" => { + reference_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TagList" => { + tag_list = ::serde::de::MapAccess::next_value(&mut map)?; + } "TaskCount" => { task_count = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1289,10 +2521,18 @@ pub mod rule { } Ok(EcsParameters { + capacity_provider_strategy: capacity_provider_strategy, + enable_ecs_managed_tags: enable_ecs_managed_tags, + enable_execute_command: enable_execute_command, group: group, launch_type: launch_type, network_configuration: network_configuration, + placement_constraints: placement_constraints, + placement_strategies: placement_strategies, platform_version: platform_version, + propagate_tags: propagate_tags, + reference_id: reference_id, + tag_list: tag_list, task_count: task_count, task_definition_arn: task_definition_arn.ok_or(::serde::de::Error::missing_field("TaskDefinitionArn"))?, }) @@ -1550,6 +2790,138 @@ pub mod rule { } } + /// The [`AWS::Events::Rule.PlacementConstraint`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-placementconstraint.html) property type. + #[derive(Debug, Default)] + pub struct PlacementConstraint { + /// Property [`Expression`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-placementconstraint.html#cfn-events-rule-placementconstraint-expression). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub expression: Option<::Value>, + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-placementconstraint.html#cfn-events-rule-placementconstraint-type). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#type: Option<::Value>, + } + + impl ::codec::SerializeValue for PlacementConstraint { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref expression) = self.expression { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Expression", expression)?; + } + if let Some(ref r#type) = self.r#type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", r#type)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for PlacementConstraint { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = PlacementConstraint; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type PlacementConstraint") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut expression: Option<::Value> = None; + let mut r#type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Expression" => { + expression = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(PlacementConstraint { + expression: expression, + r#type: r#type, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Events::Rule.PlacementStrategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-placementstrategy.html) property type. + #[derive(Debug, Default)] + pub struct PlacementStrategy { + /// Property [`Field`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-placementstrategy.html#cfn-events-rule-placementstrategy-field). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub field: Option<::Value>, + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-placementstrategy.html#cfn-events-rule-placementstrategy-type). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#type: Option<::Value>, + } + + impl ::codec::SerializeValue for PlacementStrategy { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref field) = self.field { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Field", field)?; + } + if let Some(ref r#type) = self.r#type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", r#type)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for PlacementStrategy { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = PlacementStrategy; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type PlacementStrategy") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut field: Option<::Value> = None; + let mut r#type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Field" => { + field = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(PlacementStrategy { + field: field, + r#type: r#type, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::Events::Rule.RedshiftDataParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-redshiftdataparameters.html) property type. #[derive(Debug, Default)] pub struct RedshiftDataParameters { @@ -1843,6 +3215,121 @@ pub mod rule { } } + /// The [`AWS::Events::Rule.SageMakerPipelineParameter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-sagemakerpipelineparameter.html) property type. + #[derive(Debug, Default)] + pub struct SageMakerPipelineParameter { + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-sagemakerpipelineparameter.html#cfn-events-rule-sagemakerpipelineparameter-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: ::Value, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-sagemakerpipelineparameter.html#cfn-events-rule-sagemakerpipelineparameter-value). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub value: ::Value, + } + + impl ::codec::SerializeValue for SageMakerPipelineParameter { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", &self.value)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for SageMakerPipelineParameter { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = SageMakerPipelineParameter; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type SageMakerPipelineParameter") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut name: Option<::Value> = None; + let mut value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(SageMakerPipelineParameter { + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + value: value.ok_or(::serde::de::Error::missing_field("Value"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Events::Rule.SageMakerPipelineParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-sagemakerpipelineparameters.html) property type. + #[derive(Debug, Default)] + pub struct SageMakerPipelineParameters { + /// Property [`PipelineParameterList`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-sagemakerpipelineparameters.html#cfn-events-rule-sagemakerpipelineparameters-pipelineparameterlist). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub pipeline_parameter_list: Option<::ValueList>, + } + + impl ::codec::SerializeValue for SageMakerPipelineParameters { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref pipeline_parameter_list) = self.pipeline_parameter_list { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PipelineParameterList", pipeline_parameter_list)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for SageMakerPipelineParameters { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = SageMakerPipelineParameters; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type SageMakerPipelineParameters") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut pipeline_parameter_list: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "PipelineParameterList" => { + pipeline_parameter_list = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(SageMakerPipelineParameters { + pipeline_parameter_list: pipeline_parameter_list, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::Events::Rule.SqsParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-sqsparameters.html) property type. #[derive(Debug, Default)] pub struct SqsParameters { @@ -1894,6 +3381,72 @@ pub mod rule { } } + /// The [`AWS::Events::Rule.Tag`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-tag.html) property type. + #[derive(Debug, Default)] + pub struct Tag { + /// Property [`Key`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-tag.html#cfn-events-rule-tag-key). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub key: Option<::Value>, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-tag.html#cfn-events-rule-tag-value). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub value: Option<::Value>, + } + + impl ::codec::SerializeValue for Tag { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref key) = self.key { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Key", key)?; + } + if let Some(ref value) = self.value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", value)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Tag { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Tag; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Tag") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut key: Option<::Value> = None; + let mut value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Key" => { + key = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Tag { + key: key, + value: value, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::Events::Rule.Target`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html) property type. #[derive(Debug, Default)] pub struct Target { @@ -1967,6 +3520,11 @@ pub mod rule { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub run_command_parameters: Option<::Value>, + /// Property [`SageMakerPipelineParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-sagemakerpipelineparameters). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub sage_maker_pipeline_parameters: Option<::Value>, /// Property [`SqsParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-events-rule-target.html#cfn-events-rule-target-sqsparameters). /// /// Update type: _Mutable_. @@ -2015,6 +3573,9 @@ pub mod rule { if let Some(ref run_command_parameters) = self.run_command_parameters { ::serde::ser::SerializeMap::serialize_entry(&mut map, "RunCommandParameters", run_command_parameters)?; } + if let Some(ref sage_maker_pipeline_parameters) = self.sage_maker_pipeline_parameters { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SageMakerPipelineParameters", sage_maker_pipeline_parameters)?; + } if let Some(ref sqs_parameters) = self.sqs_parameters { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SqsParameters", sqs_parameters)?; } @@ -2048,6 +3609,7 @@ pub mod rule { let mut retry_policy: Option<::Value> = None; let mut role_arn: Option<::Value> = None; let mut run_command_parameters: Option<::Value> = None; + let mut sage_maker_pipeline_parameters: Option<::Value> = None; let mut sqs_parameters: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { @@ -2094,6 +3656,9 @@ pub mod rule { "RunCommandParameters" => { run_command_parameters = ::serde::de::MapAccess::next_value(&mut map)?; } + "SageMakerPipelineParameters" => { + sage_maker_pipeline_parameters = ::serde::de::MapAccess::next_value(&mut map)?; + } "SqsParameters" => { sqs_parameters = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -2116,6 +3681,7 @@ pub mod rule { retry_policy: retry_policy, role_arn: role_arn, run_command_parameters: run_command_parameters, + sage_maker_pipeline_parameters: sage_maker_pipeline_parameters, sqs_parameters: sqs_parameters, }) } diff --git a/src/aws/eventschemas.rs b/src/aws/eventschemas.rs index 1498c75..e3223e1 100644 --- a/src/aws/eventschemas.rs +++ b/src/aws/eventschemas.rs @@ -9,6 +9,11 @@ pub struct Discoverer { /// Properties for the `Discoverer` resource. #[derive(Debug, Default)] pub struct DiscovererProperties { + /// Property [`CrossAccount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eventschemas-discoverer.html#cfn-eventschemas-discoverer-crossaccount). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub cross_account: Option<::Value>, /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eventschemas-discoverer.html#cfn-eventschemas-discoverer-description). /// /// Update type: _Mutable_. @@ -29,6 +34,9 @@ pub struct DiscovererProperties { impl ::serde::Serialize for DiscovererProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref cross_account) = self.cross_account { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CrossAccount", cross_account)?; + } if let Some(ref description) = self.description { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; } @@ -52,12 +60,16 @@ impl<'de> ::serde::Deserialize<'de> for DiscovererProperties { } fn visit_map>(self, mut map: A) -> Result { + let mut cross_account: Option<::Value> = None; let mut description: Option<::Value> = None; let mut source_arn: Option<::Value> = None; let mut tags: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "CrossAccount" => { + cross_account = ::serde::de::MapAccess::next_value(&mut map)?; + } "Description" => { description = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -72,6 +84,7 @@ impl<'de> ::serde::Deserialize<'de> for DiscovererProperties { } Ok(DiscovererProperties { + cross_account: cross_account, description: description, source_arn: source_arn.ok_or(::serde::de::Error::missing_field("SourceArn"))?, tags: tags, diff --git a/src/aws/evidently.rs b/src/aws/evidently.rs new file mode 100644 index 0000000..1cab3b7 --- /dev/null +++ b/src/aws/evidently.rs @@ -0,0 +1,1558 @@ +//! Types for the `Evidently` service. + +/// The [`AWS::Evidently::Experiment`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-experiment.html) resource type. +#[derive(Debug, Default)] +pub struct Experiment { + properties: ExperimentProperties +} + +/// Properties for the `Experiment` resource. +#[derive(Debug, Default)] +pub struct ExperimentProperties { + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-experiment.html#cfn-evidently-experiment-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`MetricGoals`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-experiment.html#cfn-evidently-experiment-metricgoals). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub metric_goals: ::ValueList, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-experiment.html#cfn-evidently-experiment-name). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub name: ::Value, + /// Property [`OnlineAbConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-experiment.html#cfn-evidently-experiment-onlineabconfig). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub online_ab_config: ::Value, + /// Property [`Project`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-experiment.html#cfn-evidently-experiment-project). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub project: ::Value, + /// Property [`RandomizationSalt`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-experiment.html#cfn-evidently-experiment-randomizationsalt). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub randomization_salt: Option<::Value>, + /// Property [`SamplingRate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-experiment.html#cfn-evidently-experiment-samplingrate). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub sampling_rate: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-experiment.html#cfn-evidently-experiment-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`Treatments`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-experiment.html#cfn-evidently-experiment-treatments). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub treatments: ::ValueList, +} + +impl ::serde::Serialize for ExperimentProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MetricGoals", &self.metric_goals)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OnlineAbConfig", &self.online_ab_config)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Project", &self.project)?; + if let Some(ref randomization_salt) = self.randomization_salt { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RandomizationSalt", randomization_salt)?; + } + if let Some(ref sampling_rate) = self.sampling_rate { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SamplingRate", sampling_rate)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Treatments", &self.treatments)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for ExperimentProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ExperimentProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ExperimentProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut description: Option<::Value> = None; + let mut metric_goals: Option<::ValueList> = None; + let mut name: Option<::Value> = None; + let mut online_ab_config: Option<::Value> = None; + let mut project: Option<::Value> = None; + let mut randomization_salt: Option<::Value> = None; + let mut sampling_rate: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut treatments: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MetricGoals" => { + metric_goals = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OnlineAbConfig" => { + online_ab_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Project" => { + project = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RandomizationSalt" => { + randomization_salt = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SamplingRate" => { + sampling_rate = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Treatments" => { + treatments = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ExperimentProperties { + description: description, + metric_goals: metric_goals.ok_or(::serde::de::Error::missing_field("MetricGoals"))?, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + online_ab_config: online_ab_config.ok_or(::serde::de::Error::missing_field("OnlineAbConfig"))?, + project: project.ok_or(::serde::de::Error::missing_field("Project"))?, + randomization_salt: randomization_salt, + sampling_rate: sampling_rate, + tags: tags, + treatments: treatments.ok_or(::serde::de::Error::missing_field("Treatments"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for Experiment { + type Properties = ExperimentProperties; + const TYPE: &'static str = "AWS::Evidently::Experiment"; + fn properties(&self) -> &ExperimentProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut ExperimentProperties { + &mut self.properties + } +} + +impl ::private::Sealed for Experiment {} + +impl From for Experiment { + fn from(properties: ExperimentProperties) -> Experiment { + Experiment { properties } + } +} + +/// The [`AWS::Evidently::Feature`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-feature.html) resource type. +#[derive(Debug, Default)] +pub struct Feature { + properties: FeatureProperties +} + +/// Properties for the `Feature` resource. +#[derive(Debug, Default)] +pub struct FeatureProperties { + /// Property [`DefaultVariation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-feature.html#cfn-evidently-feature-defaultvariation). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub default_variation: Option<::Value>, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-feature.html#cfn-evidently-feature-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`EntityOverrides`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-feature.html#cfn-evidently-feature-entityoverrides). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub entity_overrides: Option<::ValueList>, + /// Property [`EvaluationStrategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-feature.html#cfn-evidently-feature-evaluationstrategy). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub evaluation_strategy: Option<::Value>, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-feature.html#cfn-evidently-feature-name). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub name: ::Value, + /// Property [`Project`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-feature.html#cfn-evidently-feature-project). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub project: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-feature.html#cfn-evidently-feature-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`Variations`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-feature.html#cfn-evidently-feature-variations). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub variations: ::ValueList, +} + +impl ::serde::Serialize for FeatureProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref default_variation) = self.default_variation { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DefaultVariation", default_variation)?; + } + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + if let Some(ref entity_overrides) = self.entity_overrides { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EntityOverrides", entity_overrides)?; + } + if let Some(ref evaluation_strategy) = self.evaluation_strategy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EvaluationStrategy", evaluation_strategy)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Project", &self.project)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Variations", &self.variations)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for FeatureProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = FeatureProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type FeatureProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut default_variation: Option<::Value> = None; + let mut description: Option<::Value> = None; + let mut entity_overrides: Option<::ValueList> = None; + let mut evaluation_strategy: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut project: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut variations: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DefaultVariation" => { + default_variation = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EntityOverrides" => { + entity_overrides = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EvaluationStrategy" => { + evaluation_strategy = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Project" => { + project = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Variations" => { + variations = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(FeatureProperties { + default_variation: default_variation, + description: description, + entity_overrides: entity_overrides, + evaluation_strategy: evaluation_strategy, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + project: project.ok_or(::serde::de::Error::missing_field("Project"))?, + tags: tags, + variations: variations.ok_or(::serde::de::Error::missing_field("Variations"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for Feature { + type Properties = FeatureProperties; + const TYPE: &'static str = "AWS::Evidently::Feature"; + fn properties(&self) -> &FeatureProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut FeatureProperties { + &mut self.properties + } +} + +impl ::private::Sealed for Feature {} + +impl From for Feature { + fn from(properties: FeatureProperties) -> Feature { + Feature { properties } + } +} + +/// The [`AWS::Evidently::Launch`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-launch.html) resource type. +#[derive(Debug, Default)] +pub struct Launch { + properties: LaunchProperties +} + +/// Properties for the `Launch` resource. +#[derive(Debug, Default)] +pub struct LaunchProperties { + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-launch.html#cfn-evidently-launch-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`Groups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-launch.html#cfn-evidently-launch-groups). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub groups: ::ValueList, + /// Property [`MetricMonitors`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-launch.html#cfn-evidently-launch-metricmonitors). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub metric_monitors: Option<::ValueList>, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-launch.html#cfn-evidently-launch-name). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub name: ::Value, + /// Property [`Project`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-launch.html#cfn-evidently-launch-project). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub project: ::Value, + /// Property [`RandomizationSalt`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-launch.html#cfn-evidently-launch-randomizationsalt). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub randomization_salt: Option<::Value>, + /// Property [`ScheduledSplitsConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-launch.html#cfn-evidently-launch-scheduledsplitsconfig). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub scheduled_splits_config: ::ValueList, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-launch.html#cfn-evidently-launch-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, +} + +impl ::serde::Serialize for LaunchProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Groups", &self.groups)?; + if let Some(ref metric_monitors) = self.metric_monitors { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MetricMonitors", metric_monitors)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Project", &self.project)?; + if let Some(ref randomization_salt) = self.randomization_salt { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RandomizationSalt", randomization_salt)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ScheduledSplitsConfig", &self.scheduled_splits_config)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for LaunchProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = LaunchProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type LaunchProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut description: Option<::Value> = None; + let mut groups: Option<::ValueList> = None; + let mut metric_monitors: Option<::ValueList> = None; + let mut name: Option<::Value> = None; + let mut project: Option<::Value> = None; + let mut randomization_salt: Option<::Value> = None; + let mut scheduled_splits_config: Option<::ValueList> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Groups" => { + groups = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MetricMonitors" => { + metric_monitors = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Project" => { + project = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RandomizationSalt" => { + randomization_salt = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ScheduledSplitsConfig" => { + scheduled_splits_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(LaunchProperties { + description: description, + groups: groups.ok_or(::serde::de::Error::missing_field("Groups"))?, + metric_monitors: metric_monitors, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + project: project.ok_or(::serde::de::Error::missing_field("Project"))?, + randomization_salt: randomization_salt, + scheduled_splits_config: scheduled_splits_config.ok_or(::serde::de::Error::missing_field("ScheduledSplitsConfig"))?, + tags: tags, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for Launch { + type Properties = LaunchProperties; + const TYPE: &'static str = "AWS::Evidently::Launch"; + fn properties(&self) -> &LaunchProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut LaunchProperties { + &mut self.properties + } +} + +impl ::private::Sealed for Launch {} + +impl From for Launch { + fn from(properties: LaunchProperties) -> Launch { + Launch { properties } + } +} + +/// The [`AWS::Evidently::Project`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-project.html) resource type. +#[derive(Debug, Default)] +pub struct Project { + properties: ProjectProperties +} + +/// Properties for the `Project` resource. +#[derive(Debug, Default)] +pub struct ProjectProperties { + /// Property [`DataDelivery`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-project.html#cfn-evidently-project-datadelivery). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub data_delivery: Option<::Value>, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-project.html#cfn-evidently-project-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-project.html#cfn-evidently-project-name). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub name: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-evidently-project.html#cfn-evidently-project-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, +} + +impl ::serde::Serialize for ProjectProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref data_delivery) = self.data_delivery { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataDelivery", data_delivery)?; + } + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for ProjectProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ProjectProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ProjectProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut data_delivery: Option<::Value> = None; + let mut description: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DataDelivery" => { + data_delivery = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ProjectProperties { + data_delivery: data_delivery, + description: description, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + tags: tags, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for Project { + type Properties = ProjectProperties; + const TYPE: &'static str = "AWS::Evidently::Project"; + fn properties(&self) -> &ProjectProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut ProjectProperties { + &mut self.properties + } +} + +impl ::private::Sealed for Project {} + +impl From for Project { + fn from(properties: ProjectProperties) -> Project { + Project { properties } + } +} + +pub mod experiment { + //! Property types for the `Experiment` resource. + + /// The [`AWS::Evidently::Experiment.MetricGoalObject`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-metricgoalobject.html) property type. + #[derive(Debug, Default)] + pub struct MetricGoalObject { + /// Property [`DesiredChange`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-metricgoalobject.html#cfn-evidently-experiment-metricgoalobject-desiredchange). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub desired_change: ::Value, + /// Property [`EntityIdKey`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-metricgoalobject.html#cfn-evidently-experiment-metricgoalobject-entityidkey). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub entity_id_key: ::Value, + /// Property [`EventPattern`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-metricgoalobject.html#cfn-evidently-experiment-metricgoalobject-eventpattern). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub event_pattern: ::Value, + /// Property [`MetricName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-metricgoalobject.html#cfn-evidently-experiment-metricgoalobject-metricname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub metric_name: ::Value, + /// Property [`UnitLabel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-metricgoalobject.html#cfn-evidently-experiment-metricgoalobject-unitlabel). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub unit_label: Option<::Value>, + /// Property [`ValueKey`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-metricgoalobject.html#cfn-evidently-experiment-metricgoalobject-valuekey). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub value_key: ::Value, + } + + impl ::codec::SerializeValue for MetricGoalObject { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DesiredChange", &self.desired_change)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EntityIdKey", &self.entity_id_key)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EventPattern", &self.event_pattern)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MetricName", &self.metric_name)?; + if let Some(ref unit_label) = self.unit_label { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UnitLabel", unit_label)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ValueKey", &self.value_key)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for MetricGoalObject { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MetricGoalObject; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MetricGoalObject") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut desired_change: Option<::Value> = None; + let mut entity_id_key: Option<::Value> = None; + let mut event_pattern: Option<::Value> = None; + let mut metric_name: Option<::Value> = None; + let mut unit_label: Option<::Value> = None; + let mut value_key: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DesiredChange" => { + desired_change = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EntityIdKey" => { + entity_id_key = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EventPattern" => { + event_pattern = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MetricName" => { + metric_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UnitLabel" => { + unit_label = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ValueKey" => { + value_key = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(MetricGoalObject { + desired_change: desired_change.ok_or(::serde::de::Error::missing_field("DesiredChange"))?, + entity_id_key: entity_id_key.ok_or(::serde::de::Error::missing_field("EntityIdKey"))?, + event_pattern: event_pattern.ok_or(::serde::de::Error::missing_field("EventPattern"))?, + metric_name: metric_name.ok_or(::serde::de::Error::missing_field("MetricName"))?, + unit_label: unit_label, + value_key: value_key.ok_or(::serde::de::Error::missing_field("ValueKey"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Evidently::Experiment.OnlineAbConfigObject`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-onlineabconfigobject.html) property type. + #[derive(Debug, Default)] + pub struct OnlineAbConfigObject { + /// Property [`ControlTreatmentName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-onlineabconfigobject.html#cfn-evidently-experiment-onlineabconfigobject-controltreatmentname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub control_treatment_name: Option<::Value>, + /// Property [`TreatmentWeights`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-onlineabconfigobject.html#cfn-evidently-experiment-onlineabconfigobject-treatmentweights). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub treatment_weights: Option<::ValueList>, + } + + impl ::codec::SerializeValue for OnlineAbConfigObject { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref control_treatment_name) = self.control_treatment_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ControlTreatmentName", control_treatment_name)?; + } + if let Some(ref treatment_weights) = self.treatment_weights { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TreatmentWeights", treatment_weights)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for OnlineAbConfigObject { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = OnlineAbConfigObject; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type OnlineAbConfigObject") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut control_treatment_name: Option<::Value> = None; + let mut treatment_weights: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ControlTreatmentName" => { + control_treatment_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TreatmentWeights" => { + treatment_weights = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(OnlineAbConfigObject { + control_treatment_name: control_treatment_name, + treatment_weights: treatment_weights, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Evidently::Experiment.TreatmentObject`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-treatmentobject.html) property type. + #[derive(Debug, Default)] + pub struct TreatmentObject { + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-treatmentobject.html#cfn-evidently-experiment-treatmentobject-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`Feature`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-treatmentobject.html#cfn-evidently-experiment-treatmentobject-feature). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub feature: ::Value, + /// Property [`TreatmentName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-treatmentobject.html#cfn-evidently-experiment-treatmentobject-treatmentname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub treatment_name: ::Value, + /// Property [`Variation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-treatmentobject.html#cfn-evidently-experiment-treatmentobject-variation). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub variation: ::Value, + } + + impl ::codec::SerializeValue for TreatmentObject { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Feature", &self.feature)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TreatmentName", &self.treatment_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Variation", &self.variation)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for TreatmentObject { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = TreatmentObject; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type TreatmentObject") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut description: Option<::Value> = None; + let mut feature: Option<::Value> = None; + let mut treatment_name: Option<::Value> = None; + let mut variation: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Feature" => { + feature = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TreatmentName" => { + treatment_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Variation" => { + variation = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(TreatmentObject { + description: description, + feature: feature.ok_or(::serde::de::Error::missing_field("Feature"))?, + treatment_name: treatment_name.ok_or(::serde::de::Error::missing_field("TreatmentName"))?, + variation: variation.ok_or(::serde::de::Error::missing_field("Variation"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Evidently::Experiment.TreatmentToWeight`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-treatmenttoweight.html) property type. + #[derive(Debug, Default)] + pub struct TreatmentToWeight { + /// Property [`SplitWeight`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-treatmenttoweight.html#cfn-evidently-experiment-treatmenttoweight-splitweight). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub split_weight: ::Value, + /// Property [`Treatment`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-experiment-treatmenttoweight.html#cfn-evidently-experiment-treatmenttoweight-treatment). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub treatment: ::Value, + } + + impl ::codec::SerializeValue for TreatmentToWeight { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SplitWeight", &self.split_weight)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Treatment", &self.treatment)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for TreatmentToWeight { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = TreatmentToWeight; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type TreatmentToWeight") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut split_weight: Option<::Value> = None; + let mut treatment: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "SplitWeight" => { + split_weight = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Treatment" => { + treatment = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(TreatmentToWeight { + split_weight: split_weight.ok_or(::serde::de::Error::missing_field("SplitWeight"))?, + treatment: treatment.ok_or(::serde::de::Error::missing_field("Treatment"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + +pub mod feature { + //! Property types for the `Feature` resource. + + /// The [`AWS::Evidently::Feature.EntityOverride`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-feature-entityoverride.html) property type. + #[derive(Debug, Default)] + pub struct EntityOverride { + /// Property [`EntityId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-feature-entityoverride.html#cfn-evidently-feature-entityoverride-entityid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub entity_id: Option<::Value>, + /// Property [`Variation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-feature-entityoverride.html#cfn-evidently-feature-entityoverride-variation). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub variation: Option<::Value>, + } + + impl ::codec::SerializeValue for EntityOverride { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref entity_id) = self.entity_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EntityId", entity_id)?; + } + if let Some(ref variation) = self.variation { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Variation", variation)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for EntityOverride { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = EntityOverride; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type EntityOverride") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut entity_id: Option<::Value> = None; + let mut variation: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "EntityId" => { + entity_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Variation" => { + variation = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(EntityOverride { + entity_id: entity_id, + variation: variation, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Evidently::Feature.VariationObject`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-feature-variationobject.html) property type. + #[derive(Debug, Default)] + pub struct VariationObject { + /// Property [`BooleanValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-feature-variationobject.html#cfn-evidently-feature-variationobject-booleanvalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub boolean_value: Option<::Value>, + /// Property [`DoubleValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-feature-variationobject.html#cfn-evidently-feature-variationobject-doublevalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub double_value: Option<::Value>, + /// Property [`LongValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-feature-variationobject.html#cfn-evidently-feature-variationobject-longvalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub long_value: Option<::Value>, + /// Property [`StringValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-feature-variationobject.html#cfn-evidently-feature-variationobject-stringvalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub string_value: Option<::Value>, + /// Property [`VariationName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-feature-variationobject.html#cfn-evidently-feature-variationobject-variationname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub variation_name: Option<::Value>, + } + + impl ::codec::SerializeValue for VariationObject { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref boolean_value) = self.boolean_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BooleanValue", boolean_value)?; + } + if let Some(ref double_value) = self.double_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DoubleValue", double_value)?; + } + if let Some(ref long_value) = self.long_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LongValue", long_value)?; + } + if let Some(ref string_value) = self.string_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "StringValue", string_value)?; + } + if let Some(ref variation_name) = self.variation_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VariationName", variation_name)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for VariationObject { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = VariationObject; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type VariationObject") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut boolean_value: Option<::Value> = None; + let mut double_value: Option<::Value> = None; + let mut long_value: Option<::Value> = None; + let mut string_value: Option<::Value> = None; + let mut variation_name: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "BooleanValue" => { + boolean_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DoubleValue" => { + double_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LongValue" => { + long_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + "StringValue" => { + string_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VariationName" => { + variation_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(VariationObject { + boolean_value: boolean_value, + double_value: double_value, + long_value: long_value, + string_value: string_value, + variation_name: variation_name, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + +pub mod launch { + //! Property types for the `Launch` resource. + + /// The [`AWS::Evidently::Launch.GroupToWeight`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-grouptoweight.html) property type. + #[derive(Debug, Default)] + pub struct GroupToWeight { + /// Property [`GroupName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-grouptoweight.html#cfn-evidently-launch-grouptoweight-groupname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub group_name: ::Value, + /// Property [`SplitWeight`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-grouptoweight.html#cfn-evidently-launch-grouptoweight-splitweight). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub split_weight: ::Value, + } + + impl ::codec::SerializeValue for GroupToWeight { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupName", &self.group_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SplitWeight", &self.split_weight)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for GroupToWeight { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = GroupToWeight; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type GroupToWeight") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut group_name: Option<::Value> = None; + let mut split_weight: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "GroupName" => { + group_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SplitWeight" => { + split_weight = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(GroupToWeight { + group_name: group_name.ok_or(::serde::de::Error::missing_field("GroupName"))?, + split_weight: split_weight.ok_or(::serde::de::Error::missing_field("SplitWeight"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Evidently::Launch.LaunchGroupObject`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-launchgroupobject.html) property type. + #[derive(Debug, Default)] + pub struct LaunchGroupObject { + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-launchgroupobject.html#cfn-evidently-launch-launchgroupobject-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`Feature`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-launchgroupobject.html#cfn-evidently-launch-launchgroupobject-feature). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub feature: ::Value, + /// Property [`GroupName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-launchgroupobject.html#cfn-evidently-launch-launchgroupobject-groupname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub group_name: ::Value, + /// Property [`Variation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-launchgroupobject.html#cfn-evidently-launch-launchgroupobject-variation). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub variation: ::Value, + } + + impl ::codec::SerializeValue for LaunchGroupObject { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Feature", &self.feature)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupName", &self.group_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Variation", &self.variation)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for LaunchGroupObject { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = LaunchGroupObject; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type LaunchGroupObject") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut description: Option<::Value> = None; + let mut feature: Option<::Value> = None; + let mut group_name: Option<::Value> = None; + let mut variation: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Feature" => { + feature = ::serde::de::MapAccess::next_value(&mut map)?; + } + "GroupName" => { + group_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Variation" => { + variation = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(LaunchGroupObject { + description: description, + feature: feature.ok_or(::serde::de::Error::missing_field("Feature"))?, + group_name: group_name.ok_or(::serde::de::Error::missing_field("GroupName"))?, + variation: variation.ok_or(::serde::de::Error::missing_field("Variation"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Evidently::Launch.MetricDefinitionObject`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-metricdefinitionobject.html) property type. + #[derive(Debug, Default)] + pub struct MetricDefinitionObject { + /// Property [`EntityIdKey`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-metricdefinitionobject.html#cfn-evidently-launch-metricdefinitionobject-entityidkey). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub entity_id_key: ::Value, + /// Property [`EventPattern`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-metricdefinitionobject.html#cfn-evidently-launch-metricdefinitionobject-eventpattern). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub event_pattern: ::Value, + /// Property [`MetricName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-metricdefinitionobject.html#cfn-evidently-launch-metricdefinitionobject-metricname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub metric_name: ::Value, + /// Property [`UnitLabel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-metricdefinitionobject.html#cfn-evidently-launch-metricdefinitionobject-unitlabel). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub unit_label: Option<::Value>, + /// Property [`ValueKey`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-metricdefinitionobject.html#cfn-evidently-launch-metricdefinitionobject-valuekey). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub value_key: ::Value, + } + + impl ::codec::SerializeValue for MetricDefinitionObject { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EntityIdKey", &self.entity_id_key)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EventPattern", &self.event_pattern)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MetricName", &self.metric_name)?; + if let Some(ref unit_label) = self.unit_label { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UnitLabel", unit_label)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ValueKey", &self.value_key)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for MetricDefinitionObject { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MetricDefinitionObject; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MetricDefinitionObject") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut entity_id_key: Option<::Value> = None; + let mut event_pattern: Option<::Value> = None; + let mut metric_name: Option<::Value> = None; + let mut unit_label: Option<::Value> = None; + let mut value_key: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "EntityIdKey" => { + entity_id_key = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EventPattern" => { + event_pattern = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MetricName" => { + metric_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UnitLabel" => { + unit_label = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ValueKey" => { + value_key = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(MetricDefinitionObject { + entity_id_key: entity_id_key.ok_or(::serde::de::Error::missing_field("EntityIdKey"))?, + event_pattern: event_pattern.ok_or(::serde::de::Error::missing_field("EventPattern"))?, + metric_name: metric_name.ok_or(::serde::de::Error::missing_field("MetricName"))?, + unit_label: unit_label, + value_key: value_key.ok_or(::serde::de::Error::missing_field("ValueKey"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Evidently::Launch.StepConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-stepconfig.html) property type. + #[derive(Debug, Default)] + pub struct StepConfig { + /// Property [`GroupWeights`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-stepconfig.html#cfn-evidently-launch-stepconfig-groupweights). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub group_weights: ::ValueList, + /// Property [`StartTime`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-launch-stepconfig.html#cfn-evidently-launch-stepconfig-starttime). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub start_time: ::Value, + } + + impl ::codec::SerializeValue for StepConfig { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupWeights", &self.group_weights)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "StartTime", &self.start_time)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for StepConfig { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = StepConfig; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type StepConfig") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut group_weights: Option<::ValueList> = None; + let mut start_time: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "GroupWeights" => { + group_weights = ::serde::de::MapAccess::next_value(&mut map)?; + } + "StartTime" => { + start_time = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(StepConfig { + group_weights: group_weights.ok_or(::serde::de::Error::missing_field("GroupWeights"))?, + start_time: start_time.ok_or(::serde::de::Error::missing_field("StartTime"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + +pub mod project { + //! Property types for the `Project` resource. + + /// The [`AWS::Evidently::Project.DataDeliveryObject`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-project-datadeliveryobject.html) property type. + #[derive(Debug, Default)] + pub struct DataDeliveryObject { + /// Property [`LogGroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-project-datadeliveryobject.html#cfn-evidently-project-datadeliveryobject-loggroup). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub log_group: Option<::Value>, + /// Property [`S3`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-project-datadeliveryobject.html#cfn-evidently-project-datadeliveryobject-s3). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub s3: Option<::Value>, + } + + impl ::codec::SerializeValue for DataDeliveryObject { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref log_group) = self.log_group { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogGroup", log_group)?; + } + if let Some(ref s3) = self.s3 { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3", s3)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for DataDeliveryObject { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = DataDeliveryObject; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type DataDeliveryObject") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut log_group: Option<::Value> = None; + let mut s3: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "LogGroup" => { + log_group = ::serde::de::MapAccess::next_value(&mut map)?; + } + "S3" => { + s3 = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(DataDeliveryObject { + log_group: log_group, + s3: s3, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Evidently::Project.S3Destination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-project-s3destination.html) property type. + #[derive(Debug, Default)] + pub struct S3Destination { + /// Property [`BucketName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-project-s3destination.html#cfn-evidently-project-s3destination-bucketname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub bucket_name: ::Value, + /// Property [`Prefix`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-evidently-project-s3destination.html#cfn-evidently-project-s3destination-prefix). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub prefix: Option<::Value>, + } + + impl ::codec::SerializeValue for S3Destination { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BucketName", &self.bucket_name)?; + if let Some(ref prefix) = self.prefix { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Prefix", prefix)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for S3Destination { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = S3Destination; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type S3Destination") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut bucket_name: Option<::Value> = None; + let mut prefix: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "BucketName" => { + bucket_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Prefix" => { + prefix = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(S3Destination { + bucket_name: bucket_name.ok_or(::serde::de::Error::missing_field("BucketName"))?, + prefix: prefix, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} diff --git a/src/aws/finspace.rs b/src/aws/finspace.rs index f648b0f..766eb3a 100644 --- a/src/aws/finspace.rs +++ b/src/aws/finspace.rs @@ -9,6 +9,11 @@ pub struct Environment { /// Properties for the `Environment` resource. #[derive(Debug, Default)] pub struct EnvironmentProperties { + /// Property [`DataBundles`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-finspace-environment.html#cfn-finspace-environment-databundles). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub data_bundles: Option<::ValueList>, /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-finspace-environment.html#cfn-finspace-environment-description). /// /// Update type: _Mutable_. @@ -34,11 +39,19 @@ pub struct EnvironmentProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub name: ::Value, + /// Property [`SuperuserParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-finspace-environment.html#cfn-finspace-environment-superuserparameters). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub superuser_parameters: Option<::Value>, } impl ::serde::Serialize for EnvironmentProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref data_bundles) = self.data_bundles { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataBundles", data_bundles)?; + } if let Some(ref description) = self.description { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; } @@ -52,6 +65,9 @@ impl ::serde::Serialize for EnvironmentProperties { ::serde::ser::SerializeMap::serialize_entry(&mut map, "KmsKeyId", kms_key_id)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + if let Some(ref superuser_parameters) = self.superuser_parameters { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SuperuserParameters", superuser_parameters)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -68,14 +84,19 @@ impl<'de> ::serde::Deserialize<'de> for EnvironmentProperties { } fn visit_map>(self, mut map: A) -> Result { + let mut data_bundles: Option<::ValueList> = None; let mut description: Option<::Value> = None; let mut federation_mode: Option<::Value> = None; let mut federation_parameters: Option<::Value> = None; let mut kms_key_id: Option<::Value> = None; let mut name: Option<::Value> = None; + let mut superuser_parameters: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "DataBundles" => { + data_bundles = ::serde::de::MapAccess::next_value(&mut map)?; + } "Description" => { description = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -91,16 +112,21 @@ impl<'de> ::serde::Deserialize<'de> for EnvironmentProperties { "Name" => { name = ::serde::de::MapAccess::next_value(&mut map)?; } + "SuperuserParameters" => { + superuser_parameters = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } Ok(EnvironmentProperties { + data_bundles: data_bundles, description: description, federation_mode: federation_mode, federation_parameters: federation_parameters, kms_key_id: kms_key_id, name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + superuser_parameters: superuser_parameters, }) } } @@ -248,4 +274,83 @@ pub mod environment { d.deserialize_map(Visitor) } } + + /// The [`AWS::FinSpace::Environment.SuperuserParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-finspace-environment-superuserparameters.html) property type. + #[derive(Debug, Default)] + pub struct SuperuserParameters { + /// Property [`EmailAddress`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-finspace-environment-superuserparameters.html#cfn-finspace-environment-superuserparameters-emailaddress). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub email_address: Option<::Value>, + /// Property [`FirstName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-finspace-environment-superuserparameters.html#cfn-finspace-environment-superuserparameters-firstname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub first_name: Option<::Value>, + /// Property [`LastName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-finspace-environment-superuserparameters.html#cfn-finspace-environment-superuserparameters-lastname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub last_name: Option<::Value>, + } + + impl ::codec::SerializeValue for SuperuserParameters { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref email_address) = self.email_address { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EmailAddress", email_address)?; + } + if let Some(ref first_name) = self.first_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FirstName", first_name)?; + } + if let Some(ref last_name) = self.last_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LastName", last_name)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for SuperuserParameters { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = SuperuserParameters; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type SuperuserParameters") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut email_address: Option<::Value> = None; + let mut first_name: Option<::Value> = None; + let mut last_name: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "EmailAddress" => { + email_address = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FirstName" => { + first_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LastName" => { + last_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(SuperuserParameters { + email_address: email_address, + first_name: first_name, + last_name: last_name, + }) + } + } + + d.deserialize_map(Visitor) + } + } } diff --git a/src/aws/fis.rs b/src/aws/fis.rs index c7d1865..90cb512 100644 --- a/src/aws/fis.rs +++ b/src/aws/fis.rs @@ -19,6 +19,11 @@ pub struct ExperimentTemplateProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub description: ::Value, + /// Property [`LogConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fis-experimenttemplate.html#cfn-fis-experimenttemplate-logconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub log_configuration: Option<::Value>, /// Property [`RoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fis-experimenttemplate.html#cfn-fis-experimenttemplate-rolearn). /// /// Update type: _Mutable_. @@ -48,6 +53,9 @@ impl ::serde::Serialize for ExperimentTemplateProperties { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Actions", actions)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", &self.description)?; + if let Some(ref log_configuration) = self.log_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogConfiguration", log_configuration)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "RoleArn", &self.role_arn)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "StopConditions", &self.stop_conditions)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", &self.tags)?; @@ -70,6 +78,7 @@ impl<'de> ::serde::Deserialize<'de> for ExperimentTemplateProperties { fn visit_map>(self, mut map: A) -> Result { let mut actions: Option<::ValueMap> = None; let mut description: Option<::Value> = None; + let mut log_configuration: Option<::Value> = None; let mut role_arn: Option<::Value> = None; let mut stop_conditions: Option<::ValueList> = None; let mut tags: Option<::ValueMap> = None; @@ -83,6 +92,9 @@ impl<'de> ::serde::Deserialize<'de> for ExperimentTemplateProperties { "Description" => { description = ::serde::de::MapAccess::next_value(&mut map)?; } + "LogConfiguration" => { + log_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } "RoleArn" => { role_arn = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -102,6 +114,7 @@ impl<'de> ::serde::Deserialize<'de> for ExperimentTemplateProperties { Ok(ExperimentTemplateProperties { actions: actions, description: description.ok_or(::serde::de::Error::missing_field("Description"))?, + log_configuration: log_configuration, role_arn: role_arn.ok_or(::serde::de::Error::missing_field("RoleArn"))?, stop_conditions: stop_conditions.ok_or(::serde::de::Error::missing_field("StopConditions"))?, tags: tags.ok_or(::serde::de::Error::missing_field("Tags"))?, @@ -239,6 +252,83 @@ pub mod experiment_template { } } + /// The [`AWS::FIS::ExperimentTemplate.ExperimentTemplateLogConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatelogconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct ExperimentTemplateLogConfiguration { + /// Property [`CloudWatchLogsConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatelogconfiguration.html#cfn-fis-experimenttemplate-experimenttemplatelogconfiguration-cloudwatchlogsconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub cloud_watch_logs_configuration: Option<::Value<::json::Value>>, + /// Property [`LogSchemaVersion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatelogconfiguration.html#cfn-fis-experimenttemplate-experimenttemplatelogconfiguration-logschemaversion). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub log_schema_version: ::Value, + /// Property [`S3Configuration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatelogconfiguration.html#cfn-fis-experimenttemplate-experimenttemplatelogconfiguration-s3configuration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub s3_configuration: Option<::Value<::json::Value>>, + } + + impl ::codec::SerializeValue for ExperimentTemplateLogConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref cloud_watch_logs_configuration) = self.cloud_watch_logs_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CloudWatchLogsConfiguration", cloud_watch_logs_configuration)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogSchemaVersion", &self.log_schema_version)?; + if let Some(ref s3_configuration) = self.s3_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3Configuration", s3_configuration)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ExperimentTemplateLogConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ExperimentTemplateLogConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ExperimentTemplateLogConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut cloud_watch_logs_configuration: Option<::Value<::json::Value>> = None; + let mut log_schema_version: Option<::Value> = None; + let mut s3_configuration: Option<::Value<::json::Value>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CloudWatchLogsConfiguration" => { + cloud_watch_logs_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LogSchemaVersion" => { + log_schema_version = ::serde::de::MapAccess::next_value(&mut map)?; + } + "S3Configuration" => { + s3_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ExperimentTemplateLogConfiguration { + cloud_watch_logs_configuration: cloud_watch_logs_configuration, + log_schema_version: log_schema_version.ok_or(::serde::de::Error::missing_field("LogSchemaVersion"))?, + s3_configuration: s3_configuration, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::FIS::ExperimentTemplate.ExperimentTemplateStopCondition`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatestopcondition.html) property type. #[derive(Debug, Default)] pub struct ExperimentTemplateStopCondition { @@ -311,6 +401,11 @@ pub mod experiment_template { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub filters: Option<::ValueList>, + /// Property [`Parameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatetarget.html#cfn-fis-experimenttemplate-experimenttemplatetarget-parameters). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub parameters: Option<::ValueMap>, /// Property [`ResourceArns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fis-experimenttemplate-experimenttemplatetarget.html#cfn-fis-experimenttemplate-experimenttemplatetarget-resourcearns). /// /// Update type: _Mutable_. @@ -339,6 +434,9 @@ pub mod experiment_template { if let Some(ref filters) = self.filters { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Filters", filters)?; } + if let Some(ref parameters) = self.parameters { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Parameters", parameters)?; + } if let Some(ref resource_arns) = self.resource_arns { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceArns", resource_arns)?; } @@ -364,6 +462,7 @@ pub mod experiment_template { fn visit_map>(self, mut map: A) -> Result { let mut filters: Option<::ValueList> = None; + let mut parameters: Option<::ValueMap> = None; let mut resource_arns: Option<::ValueList> = None; let mut resource_tags: Option<::ValueMap> = None; let mut resource_type: Option<::Value> = None; @@ -374,6 +473,9 @@ pub mod experiment_template { "Filters" => { filters = ::serde::de::MapAccess::next_value(&mut map)?; } + "Parameters" => { + parameters = ::serde::de::MapAccess::next_value(&mut map)?; + } "ResourceArns" => { resource_arns = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -392,6 +494,7 @@ pub mod experiment_template { Ok(ExperimentTemplateTarget { filters: filters, + parameters: parameters, resource_arns: resource_arns, resource_tags: resource_tags, resource_type: resource_type.ok_or(::serde::de::Error::missing_field("ResourceType"))?, diff --git a/src/aws/fms.rs b/src/aws/fms.rs index c9e6dff..f910b11 100644 --- a/src/aws/fms.rs +++ b/src/aws/fms.rs @@ -141,6 +141,11 @@ pub struct PolicyProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub resource_type_list: Option<::ValueList>, + /// Property [`ResourcesCleanUp`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-policy.html#cfn-fms-policy-resourcescleanup). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub resources_clean_up: Option<::Value>, /// Property [`SecurityServicePolicyData`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fms-policy.html#cfn-fms-policy-securityservicepolicydata). /// /// Update type: _Mutable_. @@ -175,6 +180,9 @@ impl ::serde::Serialize for PolicyProperties { if let Some(ref resource_type_list) = self.resource_type_list { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceTypeList", resource_type_list)?; } + if let Some(ref resources_clean_up) = self.resources_clean_up { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourcesCleanUp", resources_clean_up)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityServicePolicyData", &self.security_service_policy_data)?; if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; @@ -204,6 +212,7 @@ impl<'de> ::serde::Deserialize<'de> for PolicyProperties { let mut resource_tags: Option<::ValueList> = None; let mut resource_type: Option<::Value> = None; let mut resource_type_list: Option<::ValueList> = None; + let mut resources_clean_up: Option<::Value> = None; let mut security_service_policy_data: Option<::Value<::json::Value>> = None; let mut tags: Option<::ValueList> = None; @@ -236,6 +245,9 @@ impl<'de> ::serde::Deserialize<'de> for PolicyProperties { "ResourceTypeList" => { resource_type_list = ::serde::de::MapAccess::next_value(&mut map)?; } + "ResourcesCleanUp" => { + resources_clean_up = ::serde::de::MapAccess::next_value(&mut map)?; + } "SecurityServicePolicyData" => { security_service_policy_data = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -256,6 +268,7 @@ impl<'de> ::serde::Deserialize<'de> for PolicyProperties { resource_tags: resource_tags, resource_type: resource_type.ok_or(::serde::de::Error::missing_field("ResourceType"))?, resource_type_list: resource_type_list, + resources_clean_up: resources_clean_up, security_service_policy_data: security_service_policy_data.ok_or(::serde::de::Error::missing_field("SecurityServicePolicyData"))?, tags: tags, }) diff --git a/src/aws/forecast.rs b/src/aws/forecast.rs new file mode 100644 index 0000000..22ef716 --- /dev/null +++ b/src/aws/forecast.rs @@ -0,0 +1,262 @@ +//! Types for the `Forecast` service. + +/// The [`AWS::Forecast::Dataset`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-dataset.html) resource type. +#[derive(Debug, Default)] +pub struct Dataset { + properties: DatasetProperties +} + +/// Properties for the `Dataset` resource. +#[derive(Debug, Default)] +pub struct DatasetProperties { + /// Property [`DataFrequency`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-dataset.html#cfn-forecast-dataset-datafrequency). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub data_frequency: Option<::Value>, + /// Property [`DatasetName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-dataset.html#cfn-forecast-dataset-datasetname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub dataset_name: ::Value, + /// Property [`DatasetType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-dataset.html#cfn-forecast-dataset-datasettype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub dataset_type: ::Value, + /// Property [`Domain`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-dataset.html#cfn-forecast-dataset-domain). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub domain: ::Value, + /// Property [`EncryptionConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-dataset.html#cfn-forecast-dataset-encryptionconfig). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub encryption_config: Option<::Value<::json::Value>>, + /// Property [`Schema`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-dataset.html#cfn-forecast-dataset-schema). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub schema: ::Value<::json::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-dataset.html#cfn-forecast-dataset-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::json::Value>>, +} + +impl ::serde::Serialize for DatasetProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref data_frequency) = self.data_frequency { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataFrequency", data_frequency)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatasetName", &self.dataset_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatasetType", &self.dataset_type)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Domain", &self.domain)?; + if let Some(ref encryption_config) = self.encryption_config { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EncryptionConfig", encryption_config)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Schema", &self.schema)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for DatasetProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = DatasetProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type DatasetProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut data_frequency: Option<::Value> = None; + let mut dataset_name: Option<::Value> = None; + let mut dataset_type: Option<::Value> = None; + let mut domain: Option<::Value> = None; + let mut encryption_config: Option<::Value<::json::Value>> = None; + let mut schema: Option<::Value<::json::Value>> = None; + let mut tags: Option<::ValueList<::json::Value>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DataFrequency" => { + data_frequency = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DatasetName" => { + dataset_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DatasetType" => { + dataset_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Domain" => { + domain = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EncryptionConfig" => { + encryption_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Schema" => { + schema = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(DatasetProperties { + data_frequency: data_frequency, + dataset_name: dataset_name.ok_or(::serde::de::Error::missing_field("DatasetName"))?, + dataset_type: dataset_type.ok_or(::serde::de::Error::missing_field("DatasetType"))?, + domain: domain.ok_or(::serde::de::Error::missing_field("Domain"))?, + encryption_config: encryption_config, + schema: schema.ok_or(::serde::de::Error::missing_field("Schema"))?, + tags: tags, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for Dataset { + type Properties = DatasetProperties; + const TYPE: &'static str = "AWS::Forecast::Dataset"; + fn properties(&self) -> &DatasetProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut DatasetProperties { + &mut self.properties + } +} + +impl ::private::Sealed for Dataset {} + +impl From for Dataset { + fn from(properties: DatasetProperties) -> Dataset { + Dataset { properties } + } +} + +/// The [`AWS::Forecast::DatasetGroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-datasetgroup.html) resource type. +#[derive(Debug, Default)] +pub struct DatasetGroup { + properties: DatasetGroupProperties +} + +/// Properties for the `DatasetGroup` resource. +#[derive(Debug, Default)] +pub struct DatasetGroupProperties { + /// Property [`DatasetArns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-datasetgroup.html#cfn-forecast-datasetgroup-datasetarns). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub dataset_arns: Option<::ValueList>, + /// Property [`DatasetGroupName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-datasetgroup.html#cfn-forecast-datasetgroup-datasetgroupname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub dataset_group_name: ::Value, + /// Property [`Domain`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-datasetgroup.html#cfn-forecast-datasetgroup-domain). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub domain: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-forecast-datasetgroup.html#cfn-forecast-datasetgroup-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, +} + +impl ::serde::Serialize for DatasetGroupProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref dataset_arns) = self.dataset_arns { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatasetArns", dataset_arns)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatasetGroupName", &self.dataset_group_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Domain", &self.domain)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for DatasetGroupProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = DatasetGroupProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type DatasetGroupProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut dataset_arns: Option<::ValueList> = None; + let mut dataset_group_name: Option<::Value> = None; + let mut domain: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DatasetArns" => { + dataset_arns = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DatasetGroupName" => { + dataset_group_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Domain" => { + domain = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(DatasetGroupProperties { + dataset_arns: dataset_arns, + dataset_group_name: dataset_group_name.ok_or(::serde::de::Error::missing_field("DatasetGroupName"))?, + domain: domain.ok_or(::serde::de::Error::missing_field("Domain"))?, + tags: tags, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for DatasetGroup { + type Properties = DatasetGroupProperties; + const TYPE: &'static str = "AWS::Forecast::DatasetGroup"; + fn properties(&self) -> &DatasetGroupProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut DatasetGroupProperties { + &mut self.properties + } +} + +impl ::private::Sealed for DatasetGroup {} + +impl From for DatasetGroup { + fn from(properties: DatasetGroupProperties) -> DatasetGroup { + DatasetGroup { properties } + } +} diff --git a/src/aws/fsx.rs b/src/aws/fsx.rs index 910ae01..7ae822d 100644 --- a/src/aws/fsx.rs +++ b/src/aws/fsx.rs @@ -19,6 +19,11 @@ pub struct FileSystemProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub file_system_type: ::Value, + /// Property [`FileSystemTypeVersion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-filesystemtypeversion). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub file_system_type_version: Option<::Value>, /// Property [`KmsKeyId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-kmskeyid). /// /// Update type: _Immutable_. @@ -29,6 +34,16 @@ pub struct FileSystemProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub lustre_configuration: Option<::Value>, + /// Property [`OntapConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-ontapconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ontap_configuration: Option<::Value>, + /// Property [`OpenZFSConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-openzfsconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub open_zfs_configuration: Option<::Value>, /// Property [`SecurityGroupIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-filesystem.html#cfn-fsx-filesystem-securitygroupids). /// /// Update type: _Immutable_. @@ -68,12 +83,21 @@ impl ::serde::Serialize for FileSystemProperties { ::serde::ser::SerializeMap::serialize_entry(&mut map, "BackupId", backup_id)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "FileSystemType", &self.file_system_type)?; + if let Some(ref file_system_type_version) = self.file_system_type_version { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FileSystemTypeVersion", file_system_type_version)?; + } if let Some(ref kms_key_id) = self.kms_key_id { ::serde::ser::SerializeMap::serialize_entry(&mut map, "KmsKeyId", kms_key_id)?; } if let Some(ref lustre_configuration) = self.lustre_configuration { ::serde::ser::SerializeMap::serialize_entry(&mut map, "LustreConfiguration", lustre_configuration)?; } + if let Some(ref ontap_configuration) = self.ontap_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OntapConfiguration", ontap_configuration)?; + } + if let Some(ref open_zfs_configuration) = self.open_zfs_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OpenZFSConfiguration", open_zfs_configuration)?; + } if let Some(ref security_group_ids) = self.security_group_ids { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityGroupIds", security_group_ids)?; } @@ -108,8 +132,11 @@ impl<'de> ::serde::Deserialize<'de> for FileSystemProperties { fn visit_map>(self, mut map: A) -> Result { let mut backup_id: Option<::Value> = None; let mut file_system_type: Option<::Value> = None; + let mut file_system_type_version: Option<::Value> = None; let mut kms_key_id: Option<::Value> = None; let mut lustre_configuration: Option<::Value> = None; + let mut ontap_configuration: Option<::Value> = None; + let mut open_zfs_configuration: Option<::Value> = None; let mut security_group_ids: Option<::ValueList> = None; let mut storage_capacity: Option<::Value> = None; let mut storage_type: Option<::Value> = None; @@ -125,12 +152,21 @@ impl<'de> ::serde::Deserialize<'de> for FileSystemProperties { "FileSystemType" => { file_system_type = ::serde::de::MapAccess::next_value(&mut map)?; } + "FileSystemTypeVersion" => { + file_system_type_version = ::serde::de::MapAccess::next_value(&mut map)?; + } "KmsKeyId" => { kms_key_id = ::serde::de::MapAccess::next_value(&mut map)?; } "LustreConfiguration" => { lustre_configuration = ::serde::de::MapAccess::next_value(&mut map)?; } + "OntapConfiguration" => { + ontap_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OpenZFSConfiguration" => { + open_zfs_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } "SecurityGroupIds" => { security_group_ids = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -156,8 +192,11 @@ impl<'de> ::serde::Deserialize<'de> for FileSystemProperties { Ok(FileSystemProperties { backup_id: backup_id, file_system_type: file_system_type.ok_or(::serde::de::Error::missing_field("FileSystemType"))?, + file_system_type_version: file_system_type_version, kms_key_id: kms_key_id, lustre_configuration: lustre_configuration, + ontap_configuration: ontap_configuration, + open_zfs_configuration: open_zfs_configuration, security_group_ids: security_group_ids, storage_capacity: storage_capacity, storage_type: storage_type, @@ -191,315 +230,2265 @@ impl From for FileSystem { } } -pub mod file_system { - //! Property types for the `FileSystem` resource. +/// The [`AWS::FSx::Snapshot`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-snapshot.html) resource type. +#[derive(Debug, Default)] +pub struct Snapshot { + properties: SnapshotProperties +} - /// The [`AWS::FSx::FileSystem.LustreConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html) property type. - #[derive(Debug, Default)] - pub struct LustreConfiguration { - /// Property [`AutoImportPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-autoimportpolicy). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub auto_import_policy: Option<::Value>, - /// Property [`AutomaticBackupRetentionDays`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-automaticbackupretentiondays). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub automatic_backup_retention_days: Option<::Value>, - /// Property [`CopyTagsToBackups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-copytagstobackups). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub copy_tags_to_backups: Option<::Value>, - /// Property [`DailyAutomaticBackupStartTime`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-dailyautomaticbackupstarttime). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub daily_automatic_backup_start_time: Option<::Value>, - /// Property [`DataCompressionType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-datacompressiontype). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub data_compression_type: Option<::Value>, - /// Property [`DeploymentType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-deploymenttype). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub deployment_type: Option<::Value>, - /// Property [`DriveCacheType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-drivecachetype). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub drive_cache_type: Option<::Value>, - /// Property [`ExportPath`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-exportpath). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub export_path: Option<::Value>, - /// Property [`ImportPath`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-importpath). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub import_path: Option<::Value>, - /// Property [`ImportedFileChunkSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-importedfilechunksize). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub imported_file_chunk_size: Option<::Value>, - /// Property [`PerUnitStorageThroughput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-perunitstoragethroughput). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub per_unit_storage_throughput: Option<::Value>, - /// Property [`WeeklyMaintenanceStartTime`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-weeklymaintenancestarttime). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub weekly_maintenance_start_time: Option<::Value>, - } +/// Properties for the `Snapshot` resource. +#[derive(Debug, Default)] +pub struct SnapshotProperties { + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-snapshot.html#cfn-fsx-snapshot-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-snapshot.html#cfn-fsx-snapshot-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`VolumeId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-snapshot.html#cfn-fsx-snapshot-volumeid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub volume_id: ::Value, +} - impl ::codec::SerializeValue for LustreConfiguration { - fn serialize(&self, s: S) -> Result { - let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref auto_import_policy) = self.auto_import_policy { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AutoImportPolicy", auto_import_policy)?; - } - if let Some(ref automatic_backup_retention_days) = self.automatic_backup_retention_days { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AutomaticBackupRetentionDays", automatic_backup_retention_days)?; - } - if let Some(ref copy_tags_to_backups) = self.copy_tags_to_backups { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CopyTagsToBackups", copy_tags_to_backups)?; - } - if let Some(ref daily_automatic_backup_start_time) = self.daily_automatic_backup_start_time { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DailyAutomaticBackupStartTime", daily_automatic_backup_start_time)?; - } - if let Some(ref data_compression_type) = self.data_compression_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataCompressionType", data_compression_type)?; - } - if let Some(ref deployment_type) = self.deployment_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeploymentType", deployment_type)?; - } - if let Some(ref drive_cache_type) = self.drive_cache_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DriveCacheType", drive_cache_type)?; - } - if let Some(ref export_path) = self.export_path { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExportPath", export_path)?; - } - if let Some(ref import_path) = self.import_path { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ImportPath", import_path)?; - } - if let Some(ref imported_file_chunk_size) = self.imported_file_chunk_size { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ImportedFileChunkSize", imported_file_chunk_size)?; - } - if let Some(ref per_unit_storage_throughput) = self.per_unit_storage_throughput { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PerUnitStorageThroughput", per_unit_storage_throughput)?; - } - if let Some(ref weekly_maintenance_start_time) = self.weekly_maintenance_start_time { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "WeeklyMaintenanceStartTime", weekly_maintenance_start_time)?; - } - ::serde::ser::SerializeMap::end(map) +impl ::serde::Serialize for SnapshotProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VolumeId", &self.volume_id)?; + ::serde::ser::SerializeMap::end(map) } +} - impl ::codec::DeserializeValue for LustreConfiguration { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { - struct Visitor; +impl<'de> ::serde::Deserialize<'de> for SnapshotProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; - impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = LustreConfiguration; + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = SnapshotProperties; - fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type LustreConfiguration") - } + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type SnapshotProperties") + } - fn visit_map>(self, mut map: A) -> Result { - let mut auto_import_policy: Option<::Value> = None; - let mut automatic_backup_retention_days: Option<::Value> = None; - let mut copy_tags_to_backups: Option<::Value> = None; - let mut daily_automatic_backup_start_time: Option<::Value> = None; - let mut data_compression_type: Option<::Value> = None; - let mut deployment_type: Option<::Value> = None; - let mut drive_cache_type: Option<::Value> = None; - let mut export_path: Option<::Value> = None; - let mut import_path: Option<::Value> = None; - let mut imported_file_chunk_size: Option<::Value> = None; - let mut per_unit_storage_throughput: Option<::Value> = None; - let mut weekly_maintenance_start_time: Option<::Value> = None; + fn visit_map>(self, mut map: A) -> Result { + let mut name: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut volume_id: Option<::Value> = None; - while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { - match __cfn_key.as_ref() { - "AutoImportPolicy" => { - auto_import_policy = ::serde::de::MapAccess::next_value(&mut map)?; - } - "AutomaticBackupRetentionDays" => { - automatic_backup_retention_days = ::serde::de::MapAccess::next_value(&mut map)?; - } - "CopyTagsToBackups" => { - copy_tags_to_backups = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DailyAutomaticBackupStartTime" => { - daily_automatic_backup_start_time = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DataCompressionType" => { - data_compression_type = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DeploymentType" => { - deployment_type = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DriveCacheType" => { - drive_cache_type = ::serde::de::MapAccess::next_value(&mut map)?; - } - "ExportPath" => { - export_path = ::serde::de::MapAccess::next_value(&mut map)?; - } - "ImportPath" => { - import_path = ::serde::de::MapAccess::next_value(&mut map)?; - } - "ImportedFileChunkSize" => { - imported_file_chunk_size = ::serde::de::MapAccess::next_value(&mut map)?; - } - "PerUnitStorageThroughput" => { - per_unit_storage_throughput = ::serde::de::MapAccess::next_value(&mut map)?; - } - "WeeklyMaintenanceStartTime" => { - weekly_maintenance_start_time = ::serde::de::MapAccess::next_value(&mut map)?; - } - _ => {} + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; } + "VolumeId" => { + volume_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} } - - Ok(LustreConfiguration { - auto_import_policy: auto_import_policy, - automatic_backup_retention_days: automatic_backup_retention_days, - copy_tags_to_backups: copy_tags_to_backups, - daily_automatic_backup_start_time: daily_automatic_backup_start_time, - data_compression_type: data_compression_type, - deployment_type: deployment_type, - drive_cache_type: drive_cache_type, - export_path: export_path, - import_path: import_path, - imported_file_chunk_size: imported_file_chunk_size, - per_unit_storage_throughput: per_unit_storage_throughput, - weekly_maintenance_start_time: weekly_maintenance_start_time, - }) } - } - d.deserialize_map(Visitor) + Ok(SnapshotProperties { + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + tags: tags, + volume_id: volume_id.ok_or(::serde::de::Error::missing_field("VolumeId"))?, + }) + } } + + d.deserialize_map(Visitor) } +} - /// The [`AWS::FSx::FileSystem.SelfManagedActiveDirectoryConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration.html) property type. - #[derive(Debug, Default)] - pub struct SelfManagedActiveDirectoryConfiguration { - /// Property [`DnsIps`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration-dnsips). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub dns_ips: Option<::ValueList>, - /// Property [`DomainName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration-domainname). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub domain_name: Option<::Value>, - /// Property [`FileSystemAdministratorsGroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration-filesystemadministratorsgroup). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub file_system_administrators_group: Option<::Value>, - /// Property [`OrganizationalUnitDistinguishedName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration-organizationalunitdistinguishedname). +impl ::Resource for Snapshot { + type Properties = SnapshotProperties; + const TYPE: &'static str = "AWS::FSx::Snapshot"; + fn properties(&self) -> &SnapshotProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut SnapshotProperties { + &mut self.properties + } +} + +impl ::private::Sealed for Snapshot {} + +impl From for Snapshot { + fn from(properties: SnapshotProperties) -> Snapshot { + Snapshot { properties } + } +} + +/// The [`AWS::FSx::StorageVirtualMachine`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-storagevirtualmachine.html) resource type. +#[derive(Debug, Default)] +pub struct StorageVirtualMachine { + properties: StorageVirtualMachineProperties +} + +/// Properties for the `StorageVirtualMachine` resource. +#[derive(Debug, Default)] +pub struct StorageVirtualMachineProperties { + /// Property [`ActiveDirectoryConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-storagevirtualmachine.html#cfn-fsx-storagevirtualmachine-activedirectoryconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub active_directory_configuration: Option<::Value>, + /// Property [`FileSystemId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-storagevirtualmachine.html#cfn-fsx-storagevirtualmachine-filesystemid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub file_system_id: ::Value, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-storagevirtualmachine.html#cfn-fsx-storagevirtualmachine-name). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub name: ::Value, + /// Property [`RootVolumeSecurityStyle`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-storagevirtualmachine.html#cfn-fsx-storagevirtualmachine-rootvolumesecuritystyle). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub root_volume_security_style: Option<::Value>, + /// Property [`SvmAdminPassword`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-storagevirtualmachine.html#cfn-fsx-storagevirtualmachine-svmadminpassword). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub svm_admin_password: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-storagevirtualmachine.html#cfn-fsx-storagevirtualmachine-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, +} + +impl ::serde::Serialize for StorageVirtualMachineProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref active_directory_configuration) = self.active_directory_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ActiveDirectoryConfiguration", active_directory_configuration)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FileSystemId", &self.file_system_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + if let Some(ref root_volume_security_style) = self.root_volume_security_style { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RootVolumeSecurityStyle", root_volume_security_style)?; + } + if let Some(ref svm_admin_password) = self.svm_admin_password { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SvmAdminPassword", svm_admin_password)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for StorageVirtualMachineProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = StorageVirtualMachineProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type StorageVirtualMachineProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut active_directory_configuration: Option<::Value> = None; + let mut file_system_id: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut root_volume_security_style: Option<::Value> = None; + let mut svm_admin_password: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ActiveDirectoryConfiguration" => { + active_directory_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FileSystemId" => { + file_system_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RootVolumeSecurityStyle" => { + root_volume_security_style = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SvmAdminPassword" => { + svm_admin_password = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(StorageVirtualMachineProperties { + active_directory_configuration: active_directory_configuration, + file_system_id: file_system_id.ok_or(::serde::de::Error::missing_field("FileSystemId"))?, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + root_volume_security_style: root_volume_security_style, + svm_admin_password: svm_admin_password, + tags: tags, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for StorageVirtualMachine { + type Properties = StorageVirtualMachineProperties; + const TYPE: &'static str = "AWS::FSx::StorageVirtualMachine"; + fn properties(&self) -> &StorageVirtualMachineProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut StorageVirtualMachineProperties { + &mut self.properties + } +} + +impl ::private::Sealed for StorageVirtualMachine {} + +impl From for StorageVirtualMachine { + fn from(properties: StorageVirtualMachineProperties) -> StorageVirtualMachine { + StorageVirtualMachine { properties } + } +} + +/// The [`AWS::FSx::Volume`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-volume.html) resource type. +#[derive(Debug, Default)] +pub struct Volume { + properties: VolumeProperties +} + +/// Properties for the `Volume` resource. +#[derive(Debug, Default)] +pub struct VolumeProperties { + /// Property [`BackupId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-volume.html#cfn-fsx-volume-backupid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub backup_id: Option<::Value>, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-volume.html#cfn-fsx-volume-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: ::Value, + /// Property [`OntapConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-volume.html#cfn-fsx-volume-ontapconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ontap_configuration: Option<::Value>, + /// Property [`OpenZFSConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-volume.html#cfn-fsx-volume-openzfsconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub open_zfs_configuration: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-volume.html#cfn-fsx-volume-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`VolumeType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-fsx-volume.html#cfn-fsx-volume-volumetype). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub volume_type: Option<::Value>, +} + +impl ::serde::Serialize for VolumeProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref backup_id) = self.backup_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BackupId", backup_id)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + if let Some(ref ontap_configuration) = self.ontap_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OntapConfiguration", ontap_configuration)?; + } + if let Some(ref open_zfs_configuration) = self.open_zfs_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OpenZFSConfiguration", open_zfs_configuration)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + if let Some(ref volume_type) = self.volume_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VolumeType", volume_type)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for VolumeProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = VolumeProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type VolumeProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut backup_id: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut ontap_configuration: Option<::Value> = None; + let mut open_zfs_configuration: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut volume_type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "BackupId" => { + backup_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OntapConfiguration" => { + ontap_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OpenZFSConfiguration" => { + open_zfs_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VolumeType" => { + volume_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(VolumeProperties { + backup_id: backup_id, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + ontap_configuration: ontap_configuration, + open_zfs_configuration: open_zfs_configuration, + tags: tags, + volume_type: volume_type, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for Volume { + type Properties = VolumeProperties; + const TYPE: &'static str = "AWS::FSx::Volume"; + fn properties(&self) -> &VolumeProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut VolumeProperties { + &mut self.properties + } +} + +impl ::private::Sealed for Volume {} + +impl From for Volume { + fn from(properties: VolumeProperties) -> Volume { + Volume { properties } + } +} + +pub mod file_system { + //! Property types for the `FileSystem` resource. + + /// The [`AWS::FSx::FileSystem.AuditLogConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-auditlogconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct AuditLogConfiguration { + /// Property [`AuditLogDestination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-auditlogconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-auditlogconfiguration-auditlogdestination). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub audit_log_destination: Option<::Value>, + /// Property [`FileAccessAuditLogLevel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-auditlogconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-auditlogconfiguration-fileaccessauditloglevel). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub file_access_audit_log_level: ::Value, + /// Property [`FileShareAccessAuditLogLevel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-auditlogconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-auditlogconfiguration-fileshareaccessauditloglevel). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub file_share_access_audit_log_level: ::Value, + } + + impl ::codec::SerializeValue for AuditLogConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref audit_log_destination) = self.audit_log_destination { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AuditLogDestination", audit_log_destination)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FileAccessAuditLogLevel", &self.file_access_audit_log_level)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FileShareAccessAuditLogLevel", &self.file_share_access_audit_log_level)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AuditLogConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AuditLogConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AuditLogConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut audit_log_destination: Option<::Value> = None; + let mut file_access_audit_log_level: Option<::Value> = None; + let mut file_share_access_audit_log_level: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AuditLogDestination" => { + audit_log_destination = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FileAccessAuditLogLevel" => { + file_access_audit_log_level = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FileShareAccessAuditLogLevel" => { + file_share_access_audit_log_level = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AuditLogConfiguration { + audit_log_destination: audit_log_destination, + file_access_audit_log_level: file_access_audit_log_level.ok_or(::serde::de::Error::missing_field("FileAccessAuditLogLevel"))?, + file_share_access_audit_log_level: file_share_access_audit_log_level.ok_or(::serde::de::Error::missing_field("FileShareAccessAuditLogLevel"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::FSx::FileSystem.ClientConfigurations`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-nfsexports-clientconfigurations.html) property type. + #[derive(Debug, Default)] + pub struct ClientConfigurations { + /// Property [`Clients`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-nfsexports-clientconfigurations.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-nfsexports-clientconfigurations-clients). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub clients: Option<::Value>, + /// Property [`Options`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-nfsexports-clientconfigurations.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-nfsexports-clientconfigurations-options). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub options: Option<::ValueList>, + } + + impl ::codec::SerializeValue for ClientConfigurations { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref clients) = self.clients { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Clients", clients)?; + } + if let Some(ref options) = self.options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Options", options)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ClientConfigurations { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ClientConfigurations; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ClientConfigurations") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut clients: Option<::Value> = None; + let mut options: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Clients" => { + clients = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Options" => { + options = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ClientConfigurations { + clients: clients, + options: options, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::FSx::FileSystem.DiskIopsConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-diskiopsconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct DiskIopsConfiguration { + /// Property [`Iops`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-diskiopsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-diskiopsconfiguration-iops). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub iops: Option<::Value>, + /// Property [`Mode`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-diskiopsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-diskiopsconfiguration-mode). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub mode: Option<::Value>, + } + + impl ::codec::SerializeValue for DiskIopsConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref iops) = self.iops { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Iops", iops)?; + } + if let Some(ref mode) = self.mode { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Mode", mode)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for DiskIopsConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = DiskIopsConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type DiskIopsConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut iops: Option<::Value> = None; + let mut mode: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Iops" => { + iops = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Mode" => { + mode = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(DiskIopsConfiguration { + iops: iops, + mode: mode, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::FSx::FileSystem.LustreConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct LustreConfiguration { + /// Property [`AutoImportPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-autoimportpolicy). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub auto_import_policy: Option<::Value>, + /// Property [`AutomaticBackupRetentionDays`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-automaticbackupretentiondays). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub automatic_backup_retention_days: Option<::Value>, + /// Property [`CopyTagsToBackups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-copytagstobackups). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub copy_tags_to_backups: Option<::Value>, + /// Property [`DailyAutomaticBackupStartTime`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-dailyautomaticbackupstarttime). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub daily_automatic_backup_start_time: Option<::Value>, + /// Property [`DataCompressionType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-datacompressiontype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub data_compression_type: Option<::Value>, + /// Property [`DeploymentType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-deploymenttype). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub deployment_type: Option<::Value>, + /// Property [`DriveCacheType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-drivecachetype). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub drive_cache_type: Option<::Value>, + /// Property [`ExportPath`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-exportpath). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub export_path: Option<::Value>, + /// Property [`ImportPath`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-importpath). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub import_path: Option<::Value>, + /// Property [`ImportedFileChunkSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-importedfilechunksize). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub imported_file_chunk_size: Option<::Value>, + /// Property [`PerUnitStorageThroughput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-perunitstoragethroughput). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub per_unit_storage_throughput: Option<::Value>, + /// Property [`WeeklyMaintenanceStartTime`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-lustreconfiguration.html#cfn-fsx-filesystem-lustreconfiguration-weeklymaintenancestarttime). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub weekly_maintenance_start_time: Option<::Value>, + } + + impl ::codec::SerializeValue for LustreConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref auto_import_policy) = self.auto_import_policy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AutoImportPolicy", auto_import_policy)?; + } + if let Some(ref automatic_backup_retention_days) = self.automatic_backup_retention_days { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AutomaticBackupRetentionDays", automatic_backup_retention_days)?; + } + if let Some(ref copy_tags_to_backups) = self.copy_tags_to_backups { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CopyTagsToBackups", copy_tags_to_backups)?; + } + if let Some(ref daily_automatic_backup_start_time) = self.daily_automatic_backup_start_time { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DailyAutomaticBackupStartTime", daily_automatic_backup_start_time)?; + } + if let Some(ref data_compression_type) = self.data_compression_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataCompressionType", data_compression_type)?; + } + if let Some(ref deployment_type) = self.deployment_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeploymentType", deployment_type)?; + } + if let Some(ref drive_cache_type) = self.drive_cache_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DriveCacheType", drive_cache_type)?; + } + if let Some(ref export_path) = self.export_path { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExportPath", export_path)?; + } + if let Some(ref import_path) = self.import_path { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ImportPath", import_path)?; + } + if let Some(ref imported_file_chunk_size) = self.imported_file_chunk_size { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ImportedFileChunkSize", imported_file_chunk_size)?; + } + if let Some(ref per_unit_storage_throughput) = self.per_unit_storage_throughput { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PerUnitStorageThroughput", per_unit_storage_throughput)?; + } + if let Some(ref weekly_maintenance_start_time) = self.weekly_maintenance_start_time { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "WeeklyMaintenanceStartTime", weekly_maintenance_start_time)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for LustreConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = LustreConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type LustreConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut auto_import_policy: Option<::Value> = None; + let mut automatic_backup_retention_days: Option<::Value> = None; + let mut copy_tags_to_backups: Option<::Value> = None; + let mut daily_automatic_backup_start_time: Option<::Value> = None; + let mut data_compression_type: Option<::Value> = None; + let mut deployment_type: Option<::Value> = None; + let mut drive_cache_type: Option<::Value> = None; + let mut export_path: Option<::Value> = None; + let mut import_path: Option<::Value> = None; + let mut imported_file_chunk_size: Option<::Value> = None; + let mut per_unit_storage_throughput: Option<::Value> = None; + let mut weekly_maintenance_start_time: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AutoImportPolicy" => { + auto_import_policy = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AutomaticBackupRetentionDays" => { + automatic_backup_retention_days = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CopyTagsToBackups" => { + copy_tags_to_backups = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DailyAutomaticBackupStartTime" => { + daily_automatic_backup_start_time = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DataCompressionType" => { + data_compression_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DeploymentType" => { + deployment_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DriveCacheType" => { + drive_cache_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ExportPath" => { + export_path = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ImportPath" => { + import_path = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ImportedFileChunkSize" => { + imported_file_chunk_size = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PerUnitStorageThroughput" => { + per_unit_storage_throughput = ::serde::de::MapAccess::next_value(&mut map)?; + } + "WeeklyMaintenanceStartTime" => { + weekly_maintenance_start_time = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(LustreConfiguration { + auto_import_policy: auto_import_policy, + automatic_backup_retention_days: automatic_backup_retention_days, + copy_tags_to_backups: copy_tags_to_backups, + daily_automatic_backup_start_time: daily_automatic_backup_start_time, + data_compression_type: data_compression_type, + deployment_type: deployment_type, + drive_cache_type: drive_cache_type, + export_path: export_path, + import_path: import_path, + imported_file_chunk_size: imported_file_chunk_size, + per_unit_storage_throughput: per_unit_storage_throughput, + weekly_maintenance_start_time: weekly_maintenance_start_time, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::FSx::FileSystem.NfsExports`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-nfsexports.html) property type. + #[derive(Debug, Default)] + pub struct NfsExports { + /// Property [`ClientConfigurations`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-nfsexports.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-nfsexports-clientconfigurations). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub client_configurations: Option<::ValueList>, + } + + impl ::codec::SerializeValue for NfsExports { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref client_configurations) = self.client_configurations { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ClientConfigurations", client_configurations)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for NfsExports { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = NfsExports; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type NfsExports") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut client_configurations: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ClientConfigurations" => { + client_configurations = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(NfsExports { + client_configurations: client_configurations, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::FSx::FileSystem.OntapConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct OntapConfiguration { + /// Property [`AutomaticBackupRetentionDays`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html#cfn-fsx-filesystem-ontapconfiguration-automaticbackupretentiondays). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub automatic_backup_retention_days: Option<::Value>, + /// Property [`DailyAutomaticBackupStartTime`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html#cfn-fsx-filesystem-ontapconfiguration-dailyautomaticbackupstarttime). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub daily_automatic_backup_start_time: Option<::Value>, + /// Property [`DeploymentType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html#cfn-fsx-filesystem-ontapconfiguration-deploymenttype). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub deployment_type: ::Value, + /// Property [`DiskIopsConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html#cfn-fsx-filesystem-ontapconfiguration-diskiopsconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub disk_iops_configuration: Option<::Value>, + /// Property [`EndpointIpAddressRange`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html#cfn-fsx-filesystem-ontapconfiguration-endpointipaddressrange). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub endpoint_ip_address_range: Option<::Value>, + /// Property [`FsxAdminPassword`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html#cfn-fsx-filesystem-ontapconfiguration-fsxadminpassword). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub fsx_admin_password: Option<::Value>, + /// Property [`PreferredSubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html#cfn-fsx-filesystem-ontapconfiguration-preferredsubnetid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub preferred_subnet_id: Option<::Value>, + /// Property [`RouteTableIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html#cfn-fsx-filesystem-ontapconfiguration-routetableids). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub route_table_ids: Option<::ValueList>, + /// Property [`ThroughputCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html#cfn-fsx-filesystem-ontapconfiguration-throughputcapacity). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub throughput_capacity: Option<::Value>, + /// Property [`WeeklyMaintenanceStartTime`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-ontapconfiguration.html#cfn-fsx-filesystem-ontapconfiguration-weeklymaintenancestarttime). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub weekly_maintenance_start_time: Option<::Value>, + } + + impl ::codec::SerializeValue for OntapConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref automatic_backup_retention_days) = self.automatic_backup_retention_days { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AutomaticBackupRetentionDays", automatic_backup_retention_days)?; + } + if let Some(ref daily_automatic_backup_start_time) = self.daily_automatic_backup_start_time { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DailyAutomaticBackupStartTime", daily_automatic_backup_start_time)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeploymentType", &self.deployment_type)?; + if let Some(ref disk_iops_configuration) = self.disk_iops_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DiskIopsConfiguration", disk_iops_configuration)?; + } + if let Some(ref endpoint_ip_address_range) = self.endpoint_ip_address_range { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EndpointIpAddressRange", endpoint_ip_address_range)?; + } + if let Some(ref fsx_admin_password) = self.fsx_admin_password { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FsxAdminPassword", fsx_admin_password)?; + } + if let Some(ref preferred_subnet_id) = self.preferred_subnet_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PreferredSubnetId", preferred_subnet_id)?; + } + if let Some(ref route_table_ids) = self.route_table_ids { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RouteTableIds", route_table_ids)?; + } + if let Some(ref throughput_capacity) = self.throughput_capacity { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ThroughputCapacity", throughput_capacity)?; + } + if let Some(ref weekly_maintenance_start_time) = self.weekly_maintenance_start_time { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "WeeklyMaintenanceStartTime", weekly_maintenance_start_time)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for OntapConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = OntapConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type OntapConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut automatic_backup_retention_days: Option<::Value> = None; + let mut daily_automatic_backup_start_time: Option<::Value> = None; + let mut deployment_type: Option<::Value> = None; + let mut disk_iops_configuration: Option<::Value> = None; + let mut endpoint_ip_address_range: Option<::Value> = None; + let mut fsx_admin_password: Option<::Value> = None; + let mut preferred_subnet_id: Option<::Value> = None; + let mut route_table_ids: Option<::ValueList> = None; + let mut throughput_capacity: Option<::Value> = None; + let mut weekly_maintenance_start_time: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AutomaticBackupRetentionDays" => { + automatic_backup_retention_days = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DailyAutomaticBackupStartTime" => { + daily_automatic_backup_start_time = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DeploymentType" => { + deployment_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DiskIopsConfiguration" => { + disk_iops_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EndpointIpAddressRange" => { + endpoint_ip_address_range = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FsxAdminPassword" => { + fsx_admin_password = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PreferredSubnetId" => { + preferred_subnet_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RouteTableIds" => { + route_table_ids = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ThroughputCapacity" => { + throughput_capacity = ::serde::de::MapAccess::next_value(&mut map)?; + } + "WeeklyMaintenanceStartTime" => { + weekly_maintenance_start_time = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(OntapConfiguration { + automatic_backup_retention_days: automatic_backup_retention_days, + daily_automatic_backup_start_time: daily_automatic_backup_start_time, + deployment_type: deployment_type.ok_or(::serde::de::Error::missing_field("DeploymentType"))?, + disk_iops_configuration: disk_iops_configuration, + endpoint_ip_address_range: endpoint_ip_address_range, + fsx_admin_password: fsx_admin_password, + preferred_subnet_id: preferred_subnet_id, + route_table_ids: route_table_ids, + throughput_capacity: throughput_capacity, + weekly_maintenance_start_time: weekly_maintenance_start_time, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::FSx::FileSystem.OpenZFSConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct OpenZFSConfiguration { + /// Property [`AutomaticBackupRetentionDays`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-automaticbackupretentiondays). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub automatic_backup_retention_days: Option<::Value>, + /// Property [`CopyTagsToBackups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-copytagstobackups). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub copy_tags_to_backups: Option<::Value>, + /// Property [`CopyTagsToVolumes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-copytagstovolumes). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub copy_tags_to_volumes: Option<::Value>, + /// Property [`DailyAutomaticBackupStartTime`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-dailyautomaticbackupstarttime). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub daily_automatic_backup_start_time: Option<::Value>, + /// Property [`DeploymentType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-deploymenttype). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub deployment_type: ::Value, + /// Property [`DiskIopsConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-diskiopsconfiguration). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub disk_iops_configuration: Option<::Value>, + /// Property [`Options`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-options). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub options: Option<::ValueList>, + /// Property [`RootVolumeConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub root_volume_configuration: Option<::Value>, + /// Property [`ThroughputCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-throughputcapacity). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub throughput_capacity: Option<::Value>, + /// Property [`WeeklyMaintenanceStartTime`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-weeklymaintenancestarttime). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub weekly_maintenance_start_time: Option<::Value>, + } + + impl ::codec::SerializeValue for OpenZFSConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref automatic_backup_retention_days) = self.automatic_backup_retention_days { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AutomaticBackupRetentionDays", automatic_backup_retention_days)?; + } + if let Some(ref copy_tags_to_backups) = self.copy_tags_to_backups { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CopyTagsToBackups", copy_tags_to_backups)?; + } + if let Some(ref copy_tags_to_volumes) = self.copy_tags_to_volumes { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CopyTagsToVolumes", copy_tags_to_volumes)?; + } + if let Some(ref daily_automatic_backup_start_time) = self.daily_automatic_backup_start_time { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DailyAutomaticBackupStartTime", daily_automatic_backup_start_time)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeploymentType", &self.deployment_type)?; + if let Some(ref disk_iops_configuration) = self.disk_iops_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DiskIopsConfiguration", disk_iops_configuration)?; + } + if let Some(ref options) = self.options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Options", options)?; + } + if let Some(ref root_volume_configuration) = self.root_volume_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RootVolumeConfiguration", root_volume_configuration)?; + } + if let Some(ref throughput_capacity) = self.throughput_capacity { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ThroughputCapacity", throughput_capacity)?; + } + if let Some(ref weekly_maintenance_start_time) = self.weekly_maintenance_start_time { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "WeeklyMaintenanceStartTime", weekly_maintenance_start_time)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for OpenZFSConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = OpenZFSConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type OpenZFSConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut automatic_backup_retention_days: Option<::Value> = None; + let mut copy_tags_to_backups: Option<::Value> = None; + let mut copy_tags_to_volumes: Option<::Value> = None; + let mut daily_automatic_backup_start_time: Option<::Value> = None; + let mut deployment_type: Option<::Value> = None; + let mut disk_iops_configuration: Option<::Value> = None; + let mut options: Option<::ValueList> = None; + let mut root_volume_configuration: Option<::Value> = None; + let mut throughput_capacity: Option<::Value> = None; + let mut weekly_maintenance_start_time: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AutomaticBackupRetentionDays" => { + automatic_backup_retention_days = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CopyTagsToBackups" => { + copy_tags_to_backups = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CopyTagsToVolumes" => { + copy_tags_to_volumes = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DailyAutomaticBackupStartTime" => { + daily_automatic_backup_start_time = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DeploymentType" => { + deployment_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DiskIopsConfiguration" => { + disk_iops_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Options" => { + options = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RootVolumeConfiguration" => { + root_volume_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ThroughputCapacity" => { + throughput_capacity = ::serde::de::MapAccess::next_value(&mut map)?; + } + "WeeklyMaintenanceStartTime" => { + weekly_maintenance_start_time = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(OpenZFSConfiguration { + automatic_backup_retention_days: automatic_backup_retention_days, + copy_tags_to_backups: copy_tags_to_backups, + copy_tags_to_volumes: copy_tags_to_volumes, + daily_automatic_backup_start_time: daily_automatic_backup_start_time, + deployment_type: deployment_type.ok_or(::serde::de::Error::missing_field("DeploymentType"))?, + disk_iops_configuration: disk_iops_configuration, + options: options, + root_volume_configuration: root_volume_configuration, + throughput_capacity: throughput_capacity, + weekly_maintenance_start_time: weekly_maintenance_start_time, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::FSx::FileSystem.RootVolumeConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct RootVolumeConfiguration { + /// Property [`CopyTagsToSnapshots`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-copytagstosnapshots). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub copy_tags_to_snapshots: Option<::Value>, + /// Property [`DataCompressionType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-datacompressiontype). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub data_compression_type: Option<::Value>, + /// Property [`NfsExports`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-nfsexports). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub nfs_exports: Option<::ValueList>, + /// Property [`ReadOnly`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-readonly). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub read_only: Option<::Value>, + /// Property [`RecordSizeKiB`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-recordsizekib). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub record_size_ki_b: Option<::Value>, + /// Property [`UserAndGroupQuotas`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-userandgroupquotas). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub user_and_group_quotas: Option<::ValueList>, + } + + impl ::codec::SerializeValue for RootVolumeConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref copy_tags_to_snapshots) = self.copy_tags_to_snapshots { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CopyTagsToSnapshots", copy_tags_to_snapshots)?; + } + if let Some(ref data_compression_type) = self.data_compression_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataCompressionType", data_compression_type)?; + } + if let Some(ref nfs_exports) = self.nfs_exports { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NfsExports", nfs_exports)?; + } + if let Some(ref read_only) = self.read_only { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReadOnly", read_only)?; + } + if let Some(ref record_size_ki_b) = self.record_size_ki_b { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RecordSizeKiB", record_size_ki_b)?; + } + if let Some(ref user_and_group_quotas) = self.user_and_group_quotas { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UserAndGroupQuotas", user_and_group_quotas)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for RootVolumeConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = RootVolumeConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type RootVolumeConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut copy_tags_to_snapshots: Option<::Value> = None; + let mut data_compression_type: Option<::Value> = None; + let mut nfs_exports: Option<::ValueList> = None; + let mut read_only: Option<::Value> = None; + let mut record_size_ki_b: Option<::Value> = None; + let mut user_and_group_quotas: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CopyTagsToSnapshots" => { + copy_tags_to_snapshots = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DataCompressionType" => { + data_compression_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NfsExports" => { + nfs_exports = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ReadOnly" => { + read_only = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RecordSizeKiB" => { + record_size_ki_b = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UserAndGroupQuotas" => { + user_and_group_quotas = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(RootVolumeConfiguration { + copy_tags_to_snapshots: copy_tags_to_snapshots, + data_compression_type: data_compression_type, + nfs_exports: nfs_exports, + read_only: read_only, + record_size_ki_b: record_size_ki_b, + user_and_group_quotas: user_and_group_quotas, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::FSx::FileSystem.SelfManagedActiveDirectoryConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct SelfManagedActiveDirectoryConfiguration { + /// Property [`DnsIps`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration-dnsips). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub dns_ips: Option<::ValueList>, + /// Property [`DomainName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration-domainname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub domain_name: Option<::Value>, + /// Property [`FileSystemAdministratorsGroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration-filesystemadministratorsgroup). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub file_system_administrators_group: Option<::Value>, + /// Property [`OrganizationalUnitDistinguishedName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration-organizationalunitdistinguishedname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub organizational_unit_distinguished_name: Option<::Value>, + /// Property [`Password`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration-password). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub password: Option<::Value>, + /// Property [`UserName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration-username). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub user_name: Option<::Value>, + } + + impl ::codec::SerializeValue for SelfManagedActiveDirectoryConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref dns_ips) = self.dns_ips { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DnsIps", dns_ips)?; + } + if let Some(ref domain_name) = self.domain_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DomainName", domain_name)?; + } + if let Some(ref file_system_administrators_group) = self.file_system_administrators_group { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FileSystemAdministratorsGroup", file_system_administrators_group)?; + } + if let Some(ref organizational_unit_distinguished_name) = self.organizational_unit_distinguished_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OrganizationalUnitDistinguishedName", organizational_unit_distinguished_name)?; + } + if let Some(ref password) = self.password { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Password", password)?; + } + if let Some(ref user_name) = self.user_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UserName", user_name)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for SelfManagedActiveDirectoryConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = SelfManagedActiveDirectoryConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type SelfManagedActiveDirectoryConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut dns_ips: Option<::ValueList> = None; + let mut domain_name: Option<::Value> = None; + let mut file_system_administrators_group: Option<::Value> = None; + let mut organizational_unit_distinguished_name: Option<::Value> = None; + let mut password: Option<::Value> = None; + let mut user_name: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DnsIps" => { + dns_ips = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DomainName" => { + domain_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FileSystemAdministratorsGroup" => { + file_system_administrators_group = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OrganizationalUnitDistinguishedName" => { + organizational_unit_distinguished_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Password" => { + password = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UserName" => { + user_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(SelfManagedActiveDirectoryConfiguration { + dns_ips: dns_ips, + domain_name: domain_name, + file_system_administrators_group: file_system_administrators_group, + organizational_unit_distinguished_name: organizational_unit_distinguished_name, + password: password, + user_name: user_name, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::FSx::FileSystem.UserAndGroupQuotas`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-userandgroupquotas.html) property type. + #[derive(Debug, Default)] + pub struct UserAndGroupQuotas { + /// Property [`Id`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-userandgroupquotas.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-userandgroupquotas-id). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub id: Option<::Value>, + /// Property [`StorageCapacityQuotaGiB`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-userandgroupquotas.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-userandgroupquotas-storagecapacityquotagib). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub storage_capacity_quota_gi_b: Option<::Value>, + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-userandgroupquotas.html#cfn-fsx-filesystem-openzfsconfiguration-rootvolumeconfiguration-userandgroupquotas-type). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub r#type: Option<::Value>, + } + + impl ::codec::SerializeValue for UserAndGroupQuotas { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref id) = self.id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Id", id)?; + } + if let Some(ref storage_capacity_quota_gi_b) = self.storage_capacity_quota_gi_b { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "StorageCapacityQuotaGiB", storage_capacity_quota_gi_b)?; + } + if let Some(ref r#type) = self.r#type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", r#type)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for UserAndGroupQuotas { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = UserAndGroupQuotas; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type UserAndGroupQuotas") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut id: Option<::Value> = None; + let mut storage_capacity_quota_gi_b: Option<::Value> = None; + let mut r#type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Id" => { + id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "StorageCapacityQuotaGiB" => { + storage_capacity_quota_gi_b = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(UserAndGroupQuotas { + id: id, + storage_capacity_quota_gi_b: storage_capacity_quota_gi_b, + r#type: r#type, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::FSx::FileSystem.WindowsConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct WindowsConfiguration { + /// Property [`ActiveDirectoryId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-activedirectoryid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub active_directory_id: Option<::Value>, + /// Property [`Aliases`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-aliases). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub aliases: Option<::ValueList>, + /// Property [`AuditLogConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-auditlogconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub audit_log_configuration: Option<::Value>, + /// Property [`AutomaticBackupRetentionDays`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-automaticbackupretentiondays). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub automatic_backup_retention_days: Option<::Value>, + /// Property [`CopyTagsToBackups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-copytagstobackups). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub copy_tags_to_backups: Option<::Value>, + /// Property [`DailyAutomaticBackupStartTime`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-dailyautomaticbackupstarttime). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub daily_automatic_backup_start_time: Option<::Value>, + /// Property [`DeploymentType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-deploymenttype). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub deployment_type: Option<::Value>, + /// Property [`PreferredSubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-preferredsubnetid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub preferred_subnet_id: Option<::Value>, + /// Property [`SelfManagedActiveDirectoryConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub self_managed_active_directory_configuration: Option<::Value>, + /// Property [`ThroughputCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-throughputcapacity). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub throughput_capacity: ::Value, + /// Property [`WeeklyMaintenanceStartTime`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-weeklymaintenancestarttime). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub weekly_maintenance_start_time: Option<::Value>, + } + + impl ::codec::SerializeValue for WindowsConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref active_directory_id) = self.active_directory_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ActiveDirectoryId", active_directory_id)?; + } + if let Some(ref aliases) = self.aliases { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Aliases", aliases)?; + } + if let Some(ref audit_log_configuration) = self.audit_log_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AuditLogConfiguration", audit_log_configuration)?; + } + if let Some(ref automatic_backup_retention_days) = self.automatic_backup_retention_days { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AutomaticBackupRetentionDays", automatic_backup_retention_days)?; + } + if let Some(ref copy_tags_to_backups) = self.copy_tags_to_backups { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CopyTagsToBackups", copy_tags_to_backups)?; + } + if let Some(ref daily_automatic_backup_start_time) = self.daily_automatic_backup_start_time { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DailyAutomaticBackupStartTime", daily_automatic_backup_start_time)?; + } + if let Some(ref deployment_type) = self.deployment_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeploymentType", deployment_type)?; + } + if let Some(ref preferred_subnet_id) = self.preferred_subnet_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PreferredSubnetId", preferred_subnet_id)?; + } + if let Some(ref self_managed_active_directory_configuration) = self.self_managed_active_directory_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SelfManagedActiveDirectoryConfiguration", self_managed_active_directory_configuration)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ThroughputCapacity", &self.throughput_capacity)?; + if let Some(ref weekly_maintenance_start_time) = self.weekly_maintenance_start_time { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "WeeklyMaintenanceStartTime", weekly_maintenance_start_time)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for WindowsConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = WindowsConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type WindowsConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut active_directory_id: Option<::Value> = None; + let mut aliases: Option<::ValueList> = None; + let mut audit_log_configuration: Option<::Value> = None; + let mut automatic_backup_retention_days: Option<::Value> = None; + let mut copy_tags_to_backups: Option<::Value> = None; + let mut daily_automatic_backup_start_time: Option<::Value> = None; + let mut deployment_type: Option<::Value> = None; + let mut preferred_subnet_id: Option<::Value> = None; + let mut self_managed_active_directory_configuration: Option<::Value> = None; + let mut throughput_capacity: Option<::Value> = None; + let mut weekly_maintenance_start_time: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ActiveDirectoryId" => { + active_directory_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Aliases" => { + aliases = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AuditLogConfiguration" => { + audit_log_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AutomaticBackupRetentionDays" => { + automatic_backup_retention_days = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CopyTagsToBackups" => { + copy_tags_to_backups = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DailyAutomaticBackupStartTime" => { + daily_automatic_backup_start_time = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DeploymentType" => { + deployment_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PreferredSubnetId" => { + preferred_subnet_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SelfManagedActiveDirectoryConfiguration" => { + self_managed_active_directory_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ThroughputCapacity" => { + throughput_capacity = ::serde::de::MapAccess::next_value(&mut map)?; + } + "WeeklyMaintenanceStartTime" => { + weekly_maintenance_start_time = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(WindowsConfiguration { + active_directory_id: active_directory_id, + aliases: aliases, + audit_log_configuration: audit_log_configuration, + automatic_backup_retention_days: automatic_backup_retention_days, + copy_tags_to_backups: copy_tags_to_backups, + daily_automatic_backup_start_time: daily_automatic_backup_start_time, + deployment_type: deployment_type, + preferred_subnet_id: preferred_subnet_id, + self_managed_active_directory_configuration: self_managed_active_directory_configuration, + throughput_capacity: throughput_capacity.ok_or(::serde::de::Error::missing_field("ThroughputCapacity"))?, + weekly_maintenance_start_time: weekly_maintenance_start_time, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + +pub mod storage_virtual_machine { + //! Property types for the `StorageVirtualMachine` resource. + + /// The [`AWS::FSx::StorageVirtualMachine.ActiveDirectoryConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-storagevirtualmachine-activedirectoryconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct ActiveDirectoryConfiguration { + /// Property [`NetBiosName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-storagevirtualmachine-activedirectoryconfiguration.html#cfn-fsx-storagevirtualmachine-activedirectoryconfiguration-netbiosname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub net_bios_name: Option<::Value>, + /// Property [`SelfManagedActiveDirectoryConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-storagevirtualmachine-activedirectoryconfiguration.html#cfn-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub self_managed_active_directory_configuration: Option<::Value>, + } + + impl ::codec::SerializeValue for ActiveDirectoryConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref net_bios_name) = self.net_bios_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetBiosName", net_bios_name)?; + } + if let Some(ref self_managed_active_directory_configuration) = self.self_managed_active_directory_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SelfManagedActiveDirectoryConfiguration", self_managed_active_directory_configuration)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ActiveDirectoryConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ActiveDirectoryConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ActiveDirectoryConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut net_bios_name: Option<::Value> = None; + let mut self_managed_active_directory_configuration: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "NetBiosName" => { + net_bios_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SelfManagedActiveDirectoryConfiguration" => { + self_managed_active_directory_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ActiveDirectoryConfiguration { + net_bios_name: net_bios_name, + self_managed_active_directory_configuration: self_managed_active_directory_configuration, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::FSx::StorageVirtualMachine.SelfManagedActiveDirectoryConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct SelfManagedActiveDirectoryConfiguration { + /// Property [`DnsIps`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration-dnsips). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub dns_ips: Option<::ValueList>, + /// Property [`DomainName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration-domainname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub domain_name: Option<::Value>, + /// Property [`FileSystemAdministratorsGroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration-filesystemadministratorsgroup). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub file_system_administrators_group: Option<::Value>, + /// Property [`OrganizationalUnitDistinguishedName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration-organizationalunitdistinguishedname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub organizational_unit_distinguished_name: Option<::Value>, + /// Property [`Password`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration-password). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub password: Option<::Value>, + /// Property [`UserName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-storagevirtualmachine-activedirectoryconfiguration-selfmanagedactivedirectoryconfiguration-username). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub user_name: Option<::Value>, + } + + impl ::codec::SerializeValue for SelfManagedActiveDirectoryConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref dns_ips) = self.dns_ips { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DnsIps", dns_ips)?; + } + if let Some(ref domain_name) = self.domain_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DomainName", domain_name)?; + } + if let Some(ref file_system_administrators_group) = self.file_system_administrators_group { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FileSystemAdministratorsGroup", file_system_administrators_group)?; + } + if let Some(ref organizational_unit_distinguished_name) = self.organizational_unit_distinguished_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OrganizationalUnitDistinguishedName", organizational_unit_distinguished_name)?; + } + if let Some(ref password) = self.password { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Password", password)?; + } + if let Some(ref user_name) = self.user_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UserName", user_name)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for SelfManagedActiveDirectoryConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = SelfManagedActiveDirectoryConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type SelfManagedActiveDirectoryConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut dns_ips: Option<::ValueList> = None; + let mut domain_name: Option<::Value> = None; + let mut file_system_administrators_group: Option<::Value> = None; + let mut organizational_unit_distinguished_name: Option<::Value> = None; + let mut password: Option<::Value> = None; + let mut user_name: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DnsIps" => { + dns_ips = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DomainName" => { + domain_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FileSystemAdministratorsGroup" => { + file_system_administrators_group = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OrganizationalUnitDistinguishedName" => { + organizational_unit_distinguished_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Password" => { + password = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UserName" => { + user_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(SelfManagedActiveDirectoryConfiguration { + dns_ips: dns_ips, + domain_name: domain_name, + file_system_administrators_group: file_system_administrators_group, + organizational_unit_distinguished_name: organizational_unit_distinguished_name, + password: password, + user_name: user_name, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + +pub mod volume { + //! Property types for the `Volume` resource. + + /// The [`AWS::FSx::Volume.ClientConfigurations`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-nfsexports-clientconfigurations.html) property type. + #[derive(Debug, Default)] + pub struct ClientConfigurations { + /// Property [`Clients`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-nfsexports-clientconfigurations.html#cfn-fsx-volume-openzfsconfiguration-nfsexports-clientconfigurations-clients). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub clients: ::Value, + /// Property [`Options`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-nfsexports-clientconfigurations.html#cfn-fsx-volume-openzfsconfiguration-nfsexports-clientconfigurations-options). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub options: ::ValueList, + } + + impl ::codec::SerializeValue for ClientConfigurations { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Clients", &self.clients)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Options", &self.options)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ClientConfigurations { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ClientConfigurations; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ClientConfigurations") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut clients: Option<::Value> = None; + let mut options: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Clients" => { + clients = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Options" => { + options = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ClientConfigurations { + clients: clients.ok_or(::serde::de::Error::missing_field("Clients"))?, + options: options.ok_or(::serde::de::Error::missing_field("Options"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::FSx::Volume.NfsExports`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-nfsexports.html) property type. + #[derive(Debug, Default)] + pub struct NfsExports { + /// Property [`ClientConfigurations`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-nfsexports.html#cfn-fsx-volume-openzfsconfiguration-nfsexports-clientconfigurations). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub client_configurations: ::ValueList, + } + + impl ::codec::SerializeValue for NfsExports { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ClientConfigurations", &self.client_configurations)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for NfsExports { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = NfsExports; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type NfsExports") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut client_configurations: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ClientConfigurations" => { + client_configurations = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(NfsExports { + client_configurations: client_configurations.ok_or(::serde::de::Error::missing_field("ClientConfigurations"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::FSx::Volume.OntapConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct OntapConfiguration { + /// Property [`JunctionPath`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration.html#cfn-fsx-volume-ontapconfiguration-junctionpath). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub junction_path: ::Value, + /// Property [`SecurityStyle`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration.html#cfn-fsx-volume-ontapconfiguration-securitystyle). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub security_style: Option<::Value>, + /// Property [`SizeInMegabytes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration.html#cfn-fsx-volume-ontapconfiguration-sizeinmegabytes). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub size_in_megabytes: ::Value, + /// Property [`StorageEfficiencyEnabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration.html#cfn-fsx-volume-ontapconfiguration-storageefficiencyenabled). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub storage_efficiency_enabled: ::Value, + /// Property [`StorageVirtualMachineId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration.html#cfn-fsx-volume-ontapconfiguration-storagevirtualmachineid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub storage_virtual_machine_id: ::Value, + /// Property [`TieringPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration.html#cfn-fsx-volume-ontapconfiguration-tieringpolicy). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tiering_policy: Option<::Value>, + } + + impl ::codec::SerializeValue for OntapConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "JunctionPath", &self.junction_path)?; + if let Some(ref security_style) = self.security_style { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityStyle", security_style)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SizeInMegabytes", &self.size_in_megabytes)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "StorageEfficiencyEnabled", &self.storage_efficiency_enabled)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "StorageVirtualMachineId", &self.storage_virtual_machine_id)?; + if let Some(ref tiering_policy) = self.tiering_policy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TieringPolicy", tiering_policy)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for OntapConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = OntapConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type OntapConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut junction_path: Option<::Value> = None; + let mut security_style: Option<::Value> = None; + let mut size_in_megabytes: Option<::Value> = None; + let mut storage_efficiency_enabled: Option<::Value> = None; + let mut storage_virtual_machine_id: Option<::Value> = None; + let mut tiering_policy: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "JunctionPath" => { + junction_path = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SecurityStyle" => { + security_style = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SizeInMegabytes" => { + size_in_megabytes = ::serde::de::MapAccess::next_value(&mut map)?; + } + "StorageEfficiencyEnabled" => { + storage_efficiency_enabled = ::serde::de::MapAccess::next_value(&mut map)?; + } + "StorageVirtualMachineId" => { + storage_virtual_machine_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TieringPolicy" => { + tiering_policy = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(OntapConfiguration { + junction_path: junction_path.ok_or(::serde::de::Error::missing_field("JunctionPath"))?, + security_style: security_style, + size_in_megabytes: size_in_megabytes.ok_or(::serde::de::Error::missing_field("SizeInMegabytes"))?, + storage_efficiency_enabled: storage_efficiency_enabled.ok_or(::serde::de::Error::missing_field("StorageEfficiencyEnabled"))?, + storage_virtual_machine_id: storage_virtual_machine_id.ok_or(::serde::de::Error::missing_field("StorageVirtualMachineId"))?, + tiering_policy: tiering_policy, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::FSx::Volume.OpenZFSConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct OpenZFSConfiguration { + /// Property [`CopyTagsToSnapshots`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html#cfn-fsx-volume-openzfsconfiguration-copytagstosnapshots). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub copy_tags_to_snapshots: Option<::Value>, + /// Property [`DataCompressionType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html#cfn-fsx-volume-openzfsconfiguration-datacompressiontype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub data_compression_type: Option<::Value>, + /// Property [`NfsExports`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html#cfn-fsx-volume-openzfsconfiguration-nfsexports). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub nfs_exports: Option<::ValueList>, + /// Property [`Options`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html#cfn-fsx-volume-openzfsconfiguration-options). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub options: Option<::ValueList>, + /// Property [`OriginSnapshot`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html#cfn-fsx-volume-openzfsconfiguration-originsnapshot). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub origin_snapshot: Option<::Value>, + /// Property [`ParentVolumeId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html#cfn-fsx-volume-openzfsconfiguration-parentvolumeid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub parent_volume_id: ::Value, + /// Property [`ReadOnly`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html#cfn-fsx-volume-openzfsconfiguration-readonly). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub read_only: Option<::Value>, + /// Property [`RecordSizeKiB`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html#cfn-fsx-volume-openzfsconfiguration-recordsizekib). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub organizational_unit_distinguished_name: Option<::Value>, - /// Property [`Password`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration-password). + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub record_size_ki_b: Option<::Value>, + /// Property [`StorageCapacityQuotaGiB`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html#cfn-fsx-volume-openzfsconfiguration-storagecapacityquotagib). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub password: Option<::Value>, - /// Property [`UserName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration-username). + pub storage_capacity_quota_gi_b: Option<::Value>, + /// Property [`StorageCapacityReservationGiB`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html#cfn-fsx-volume-openzfsconfiguration-storagecapacityreservationgib). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub user_name: Option<::Value>, + pub storage_capacity_reservation_gi_b: Option<::Value>, + /// Property [`UserAndGroupQuotas`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration.html#cfn-fsx-volume-openzfsconfiguration-userandgroupquotas). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub user_and_group_quotas: Option<::ValueList>, } - impl ::codec::SerializeValue for SelfManagedActiveDirectoryConfiguration { + impl ::codec::SerializeValue for OpenZFSConfiguration { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref dns_ips) = self.dns_ips { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DnsIps", dns_ips)?; + if let Some(ref copy_tags_to_snapshots) = self.copy_tags_to_snapshots { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CopyTagsToSnapshots", copy_tags_to_snapshots)?; } - if let Some(ref domain_name) = self.domain_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DomainName", domain_name)?; + if let Some(ref data_compression_type) = self.data_compression_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataCompressionType", data_compression_type)?; } - if let Some(ref file_system_administrators_group) = self.file_system_administrators_group { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "FileSystemAdministratorsGroup", file_system_administrators_group)?; + if let Some(ref nfs_exports) = self.nfs_exports { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NfsExports", nfs_exports)?; } - if let Some(ref organizational_unit_distinguished_name) = self.organizational_unit_distinguished_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "OrganizationalUnitDistinguishedName", organizational_unit_distinguished_name)?; + if let Some(ref options) = self.options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Options", options)?; } - if let Some(ref password) = self.password { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Password", password)?; + if let Some(ref origin_snapshot) = self.origin_snapshot { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OriginSnapshot", origin_snapshot)?; } - if let Some(ref user_name) = self.user_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "UserName", user_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ParentVolumeId", &self.parent_volume_id)?; + if let Some(ref read_only) = self.read_only { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReadOnly", read_only)?; + } + if let Some(ref record_size_ki_b) = self.record_size_ki_b { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RecordSizeKiB", record_size_ki_b)?; + } + if let Some(ref storage_capacity_quota_gi_b) = self.storage_capacity_quota_gi_b { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "StorageCapacityQuotaGiB", storage_capacity_quota_gi_b)?; + } + if let Some(ref storage_capacity_reservation_gi_b) = self.storage_capacity_reservation_gi_b { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "StorageCapacityReservationGiB", storage_capacity_reservation_gi_b)?; + } + if let Some(ref user_and_group_quotas) = self.user_and_group_quotas { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UserAndGroupQuotas", user_and_group_quotas)?; } ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for SelfManagedActiveDirectoryConfiguration { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for OpenZFSConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = SelfManagedActiveDirectoryConfiguration; + type Value = OpenZFSConfiguration; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type SelfManagedActiveDirectoryConfiguration") + write!(f, "a struct of type OpenZFSConfiguration") } fn visit_map>(self, mut map: A) -> Result { - let mut dns_ips: Option<::ValueList> = None; - let mut domain_name: Option<::Value> = None; - let mut file_system_administrators_group: Option<::Value> = None; - let mut organizational_unit_distinguished_name: Option<::Value> = None; - let mut password: Option<::Value> = None; - let mut user_name: Option<::Value> = None; + let mut copy_tags_to_snapshots: Option<::Value> = None; + let mut data_compression_type: Option<::Value> = None; + let mut nfs_exports: Option<::ValueList> = None; + let mut options: Option<::ValueList> = None; + let mut origin_snapshot: Option<::Value> = None; + let mut parent_volume_id: Option<::Value> = None; + let mut read_only: Option<::Value> = None; + let mut record_size_ki_b: Option<::Value> = None; + let mut storage_capacity_quota_gi_b: Option<::Value> = None; + let mut storage_capacity_reservation_gi_b: Option<::Value> = None; + let mut user_and_group_quotas: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "DnsIps" => { - dns_ips = ::serde::de::MapAccess::next_value(&mut map)?; + "CopyTagsToSnapshots" => { + copy_tags_to_snapshots = ::serde::de::MapAccess::next_value(&mut map)?; } - "DomainName" => { - domain_name = ::serde::de::MapAccess::next_value(&mut map)?; + "DataCompressionType" => { + data_compression_type = ::serde::de::MapAccess::next_value(&mut map)?; } - "FileSystemAdministratorsGroup" => { - file_system_administrators_group = ::serde::de::MapAccess::next_value(&mut map)?; + "NfsExports" => { + nfs_exports = ::serde::de::MapAccess::next_value(&mut map)?; } - "OrganizationalUnitDistinguishedName" => { - organizational_unit_distinguished_name = ::serde::de::MapAccess::next_value(&mut map)?; + "Options" => { + options = ::serde::de::MapAccess::next_value(&mut map)?; } - "Password" => { - password = ::serde::de::MapAccess::next_value(&mut map)?; + "OriginSnapshot" => { + origin_snapshot = ::serde::de::MapAccess::next_value(&mut map)?; } - "UserName" => { - user_name = ::serde::de::MapAccess::next_value(&mut map)?; + "ParentVolumeId" => { + parent_volume_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ReadOnly" => { + read_only = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RecordSizeKiB" => { + record_size_ki_b = ::serde::de::MapAccess::next_value(&mut map)?; + } + "StorageCapacityQuotaGiB" => { + storage_capacity_quota_gi_b = ::serde::de::MapAccess::next_value(&mut map)?; + } + "StorageCapacityReservationGiB" => { + storage_capacity_reservation_gi_b = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UserAndGroupQuotas" => { + user_and_group_quotas = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(SelfManagedActiveDirectoryConfiguration { - dns_ips: dns_ips, - domain_name: domain_name, - file_system_administrators_group: file_system_administrators_group, - organizational_unit_distinguished_name: organizational_unit_distinguished_name, - password: password, - user_name: user_name, + Ok(OpenZFSConfiguration { + copy_tags_to_snapshots: copy_tags_to_snapshots, + data_compression_type: data_compression_type, + nfs_exports: nfs_exports, + options: options, + origin_snapshot: origin_snapshot, + parent_volume_id: parent_volume_id.ok_or(::serde::de::Error::missing_field("ParentVolumeId"))?, + read_only: read_only, + record_size_ki_b: record_size_ki_b, + storage_capacity_quota_gi_b: storage_capacity_quota_gi_b, + storage_capacity_reservation_gi_b: storage_capacity_reservation_gi_b, + user_and_group_quotas: user_and_group_quotas, }) } } @@ -508,166 +2497,199 @@ pub mod file_system { } } - /// The [`AWS::FSx::FileSystem.WindowsConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html) property type. + /// The [`AWS::FSx::Volume.OriginSnapshot`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-originsnapshot.html) property type. #[derive(Debug, Default)] - pub struct WindowsConfiguration { - /// Property [`ActiveDirectoryId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-activedirectoryid). + pub struct OriginSnapshot { + /// Property [`CopyStrategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-originsnapshot.html#cfn-fsx-volume-openzfsconfiguration-originsnapshot-copystrategy). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub active_directory_id: Option<::Value>, - /// Property [`Aliases`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-aliases). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub aliases: Option<::ValueList>, - /// Property [`AutomaticBackupRetentionDays`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-automaticbackupretentiondays). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub automatic_backup_retention_days: Option<::Value>, - /// Property [`CopyTagsToBackups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-copytagstobackups). + pub copy_strategy: ::Value, + /// Property [`SnapshotARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-originsnapshot.html#cfn-fsx-volume-openzfsconfiguration-originsnapshot-snapshotarn). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub copy_tags_to_backups: Option<::Value>, - /// Property [`DailyAutomaticBackupStartTime`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-dailyautomaticbackupstarttime). + pub snapshot_arn: ::Value, + } + + impl ::codec::SerializeValue for OriginSnapshot { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CopyStrategy", &self.copy_strategy)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SnapshotARN", &self.snapshot_arn)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for OriginSnapshot { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = OriginSnapshot; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type OriginSnapshot") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut copy_strategy: Option<::Value> = None; + let mut snapshot_arn: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CopyStrategy" => { + copy_strategy = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SnapshotARN" => { + snapshot_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(OriginSnapshot { + copy_strategy: copy_strategy.ok_or(::serde::de::Error::missing_field("CopyStrategy"))?, + snapshot_arn: snapshot_arn.ok_or(::serde::de::Error::missing_field("SnapshotARN"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::FSx::Volume.TieringPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration-tieringpolicy.html) property type. + #[derive(Debug, Default)] + pub struct TieringPolicy { + /// Property [`CoolingPeriod`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration-tieringpolicy.html#cfn-fsx-volume-ontapconfiguration-tieringpolicy-coolingperiod). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub daily_automatic_backup_start_time: Option<::Value>, - /// Property [`DeploymentType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-deploymenttype). - /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub deployment_type: Option<::Value>, - /// Property [`PreferredSubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-preferredsubnetid). + pub cooling_period: Option<::Value>, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-ontapconfiguration-tieringpolicy.html#cfn-fsx-volume-ontapconfiguration-tieringpolicy-name). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. - pub preferred_subnet_id: Option<::Value>, - /// Property [`SelfManagedActiveDirectoryConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-selfmanagedactivedirectoryconfiguration). + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: Option<::Value>, + } + + impl ::codec::SerializeValue for TieringPolicy { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref cooling_period) = self.cooling_period { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CoolingPeriod", cooling_period)?; + } + if let Some(ref name) = self.name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for TieringPolicy { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = TieringPolicy; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type TieringPolicy") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut cooling_period: Option<::Value> = None; + let mut name: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CoolingPeriod" => { + cooling_period = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(TieringPolicy { + cooling_period: cooling_period, + name: name, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::FSx::Volume.UserAndGroupQuotas`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-userandgroupquotas.html) property type. + #[derive(Debug, Default)] + pub struct UserAndGroupQuotas { + /// Property [`Id`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-userandgroupquotas.html#cfn-fsx-volume-openzfsconfiguration-userandgroupquotas-id). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub self_managed_active_directory_configuration: Option<::Value>, - /// Property [`ThroughputCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-throughputcapacity). + pub id: ::Value, + /// Property [`StorageCapacityQuotaGiB`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-userandgroupquotas.html#cfn-fsx-volume-openzfsconfiguration-userandgroupquotas-storagecapacityquotagib). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub throughput_capacity: ::Value, - /// Property [`WeeklyMaintenanceStartTime`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-filesystem-windowsconfiguration.html#cfn-fsx-filesystem-windowsconfiguration-weeklymaintenancestarttime). + pub storage_capacity_quota_gi_b: ::Value, + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-fsx-volume-openzfsconfiguration-userandgroupquotas.html#cfn-fsx-volume-openzfsconfiguration-userandgroupquotas-type). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub weekly_maintenance_start_time: Option<::Value>, + pub r#type: ::Value, } - impl ::codec::SerializeValue for WindowsConfiguration { + impl ::codec::SerializeValue for UserAndGroupQuotas { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref active_directory_id) = self.active_directory_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ActiveDirectoryId", active_directory_id)?; - } - if let Some(ref aliases) = self.aliases { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Aliases", aliases)?; - } - if let Some(ref automatic_backup_retention_days) = self.automatic_backup_retention_days { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "AutomaticBackupRetentionDays", automatic_backup_retention_days)?; - } - if let Some(ref copy_tags_to_backups) = self.copy_tags_to_backups { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "CopyTagsToBackups", copy_tags_to_backups)?; - } - if let Some(ref daily_automatic_backup_start_time) = self.daily_automatic_backup_start_time { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DailyAutomaticBackupStartTime", daily_automatic_backup_start_time)?; - } - if let Some(ref deployment_type) = self.deployment_type { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeploymentType", deployment_type)?; - } - if let Some(ref preferred_subnet_id) = self.preferred_subnet_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "PreferredSubnetId", preferred_subnet_id)?; - } - if let Some(ref self_managed_active_directory_configuration) = self.self_managed_active_directory_configuration { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SelfManagedActiveDirectoryConfiguration", self_managed_active_directory_configuration)?; - } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ThroughputCapacity", &self.throughput_capacity)?; - if let Some(ref weekly_maintenance_start_time) = self.weekly_maintenance_start_time { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "WeeklyMaintenanceStartTime", weekly_maintenance_start_time)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Id", &self.id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "StorageCapacityQuotaGiB", &self.storage_capacity_quota_gi_b)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for WindowsConfiguration { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for UserAndGroupQuotas { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = WindowsConfiguration; + type Value = UserAndGroupQuotas; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type WindowsConfiguration") + write!(f, "a struct of type UserAndGroupQuotas") } fn visit_map>(self, mut map: A) -> Result { - let mut active_directory_id: Option<::Value> = None; - let mut aliases: Option<::ValueList> = None; - let mut automatic_backup_retention_days: Option<::Value> = None; - let mut copy_tags_to_backups: Option<::Value> = None; - let mut daily_automatic_backup_start_time: Option<::Value> = None; - let mut deployment_type: Option<::Value> = None; - let mut preferred_subnet_id: Option<::Value> = None; - let mut self_managed_active_directory_configuration: Option<::Value> = None; - let mut throughput_capacity: Option<::Value> = None; - let mut weekly_maintenance_start_time: Option<::Value> = None; + let mut id: Option<::Value> = None; + let mut storage_capacity_quota_gi_b: Option<::Value> = None; + let mut r#type: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "ActiveDirectoryId" => { - active_directory_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "Aliases" => { - aliases = ::serde::de::MapAccess::next_value(&mut map)?; - } - "AutomaticBackupRetentionDays" => { - automatic_backup_retention_days = ::serde::de::MapAccess::next_value(&mut map)?; - } - "CopyTagsToBackups" => { - copy_tags_to_backups = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DailyAutomaticBackupStartTime" => { - daily_automatic_backup_start_time = ::serde::de::MapAccess::next_value(&mut map)?; - } - "DeploymentType" => { - deployment_type = ::serde::de::MapAccess::next_value(&mut map)?; - } - "PreferredSubnetId" => { - preferred_subnet_id = ::serde::de::MapAccess::next_value(&mut map)?; - } - "SelfManagedActiveDirectoryConfiguration" => { - self_managed_active_directory_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + "Id" => { + id = ::serde::de::MapAccess::next_value(&mut map)?; } - "ThroughputCapacity" => { - throughput_capacity = ::serde::de::MapAccess::next_value(&mut map)?; + "StorageCapacityQuotaGiB" => { + storage_capacity_quota_gi_b = ::serde::de::MapAccess::next_value(&mut map)?; } - "WeeklyMaintenanceStartTime" => { - weekly_maintenance_start_time = ::serde::de::MapAccess::next_value(&mut map)?; + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; } _ => {} } } - Ok(WindowsConfiguration { - active_directory_id: active_directory_id, - aliases: aliases, - automatic_backup_retention_days: automatic_backup_retention_days, - copy_tags_to_backups: copy_tags_to_backups, - daily_automatic_backup_start_time: daily_automatic_backup_start_time, - deployment_type: deployment_type, - preferred_subnet_id: preferred_subnet_id, - self_managed_active_directory_configuration: self_managed_active_directory_configuration, - throughput_capacity: throughput_capacity.ok_or(::serde::de::Error::missing_field("ThroughputCapacity"))?, - weekly_maintenance_start_time: weekly_maintenance_start_time, + Ok(UserAndGroupQuotas { + id: id.ok_or(::serde::de::Error::missing_field("Id"))?, + storage_capacity_quota_gi_b: storage_capacity_quota_gi_b.ok_or(::serde::de::Error::missing_field("StorageCapacityQuotaGiB"))?, + r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?, }) } } diff --git a/src/aws/gamelift.rs b/src/aws/gamelift.rs index f6001cf..255b76b 100644 --- a/src/aws/gamelift.rs +++ b/src/aws/gamelift.rs @@ -786,6 +786,11 @@ pub struct GameSessionQueueProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub priority_configuration: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gamesessionqueue.html#cfn-gamelift-gamesessionqueue-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, /// Property [`TimeoutInSeconds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-gamesessionqueue.html#cfn-gamelift-gamesessionqueue-timeoutinseconds). /// /// Update type: _Mutable_. @@ -815,6 +820,9 @@ impl ::serde::Serialize for GameSessionQueueProperties { if let Some(ref priority_configuration) = self.priority_configuration { ::serde::ser::SerializeMap::serialize_entry(&mut map, "PriorityConfiguration", priority_configuration)?; } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } if let Some(ref timeout_in_seconds) = self.timeout_in_seconds { ::serde::ser::SerializeMap::serialize_entry(&mut map, "TimeoutInSeconds", timeout_in_seconds)?; } @@ -841,6 +849,7 @@ impl<'de> ::serde::Deserialize<'de> for GameSessionQueueProperties { let mut notification_target: Option<::Value> = None; let mut player_latency_policies: Option<::ValueList> = None; let mut priority_configuration: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; let mut timeout_in_seconds: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { @@ -866,6 +875,9 @@ impl<'de> ::serde::Deserialize<'de> for GameSessionQueueProperties { "PriorityConfiguration" => { priority_configuration = ::serde::de::MapAccess::next_value(&mut map)?; } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } "TimeoutInSeconds" => { timeout_in_seconds = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -881,6 +893,7 @@ impl<'de> ::serde::Deserialize<'de> for GameSessionQueueProperties { notification_target: notification_target, player_latency_policies: player_latency_policies, priority_configuration: priority_configuration, + tags: tags, timeout_in_seconds: timeout_in_seconds, }) } @@ -988,6 +1001,11 @@ pub struct MatchmakingConfigurationProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub rule_set_name: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingconfiguration.html#cfn-gamelift-matchmakingconfiguration-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, } impl ::serde::Serialize for MatchmakingConfigurationProperties { @@ -1027,6 +1045,9 @@ impl ::serde::Serialize for MatchmakingConfigurationProperties { } ::serde::ser::SerializeMap::serialize_entry(&mut map, "RequestTimeoutSeconds", &self.request_timeout_seconds)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "RuleSetName", &self.rule_set_name)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -1057,6 +1078,7 @@ impl<'de> ::serde::Deserialize<'de> for MatchmakingConfigurationProperties { let mut notification_target: Option<::Value> = None; let mut request_timeout_seconds: Option<::Value> = None; let mut rule_set_name: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { @@ -1102,6 +1124,9 @@ impl<'de> ::serde::Deserialize<'de> for MatchmakingConfigurationProperties { "RuleSetName" => { rule_set_name = ::serde::de::MapAccess::next_value(&mut map)?; } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } @@ -1121,6 +1146,7 @@ impl<'de> ::serde::Deserialize<'de> for MatchmakingConfigurationProperties { notification_target: notification_target, request_timeout_seconds: request_timeout_seconds.ok_or(::serde::de::Error::missing_field("RequestTimeoutSeconds"))?, rule_set_name: rule_set_name.ok_or(::serde::de::Error::missing_field("RuleSetName"))?, + tags: tags, }) } } @@ -1167,6 +1193,11 @@ pub struct MatchmakingRuleSetProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub rule_set_body: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-matchmakingruleset.html#cfn-gamelift-matchmakingruleset-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, } impl ::serde::Serialize for MatchmakingRuleSetProperties { @@ -1174,6 +1205,9 @@ impl ::serde::Serialize for MatchmakingRuleSetProperties { let mut map = ::serde::Serializer::serialize_map(s, None)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "RuleSetBody", &self.rule_set_body)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -1192,6 +1226,7 @@ impl<'de> ::serde::Deserialize<'de> for MatchmakingRuleSetProperties { fn visit_map>(self, mut map: A) -> Result { let mut name: Option<::Value> = None; let mut rule_set_body: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { @@ -1201,6 +1236,9 @@ impl<'de> ::serde::Deserialize<'de> for MatchmakingRuleSetProperties { "RuleSetBody" => { rule_set_body = ::serde::de::MapAccess::next_value(&mut map)?; } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } @@ -1208,6 +1246,7 @@ impl<'de> ::serde::Deserialize<'de> for MatchmakingRuleSetProperties { Ok(MatchmakingRuleSetProperties { name: name.ok_or(::serde::de::Error::missing_field("Name"))?, rule_set_body: rule_set_body.ok_or(::serde::de::Error::missing_field("RuleSetBody"))?, + tags: tags, }) } } @@ -1254,6 +1293,11 @@ pub struct ScriptProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub storage_location: ::Value, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-script.html#cfn-gamelift-script-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, /// Property [`Version`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-gamelift-script.html#cfn-gamelift-script-version). /// /// Update type: _Mutable_. @@ -1268,6 +1312,9 @@ impl ::serde::Serialize for ScriptProperties { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "StorageLocation", &self.storage_location)?; + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } if let Some(ref version) = self.version { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Version", version)?; } @@ -1289,6 +1336,7 @@ impl<'de> ::serde::Deserialize<'de> for ScriptProperties { fn visit_map>(self, mut map: A) -> Result { let mut name: Option<::Value> = None; let mut storage_location: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; let mut version: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { @@ -1299,6 +1347,9 @@ impl<'de> ::serde::Deserialize<'de> for ScriptProperties { "StorageLocation" => { storage_location = ::serde::de::MapAccess::next_value(&mut map)?; } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } "Version" => { version = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1309,6 +1360,7 @@ impl<'de> ::serde::Deserialize<'de> for ScriptProperties { Ok(ScriptProperties { name: name, storage_location: storage_location.ok_or(::serde::de::Error::missing_field("StorageLocation"))?, + tags: tags, version: version, }) } diff --git a/src/aws/glue.rs b/src/aws/glue.rs index 8130804..5b388fe 100644 --- a/src/aws/glue.rs +++ b/src/aws/glue.rs @@ -243,6 +243,11 @@ pub struct CrawlerProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub name: Option<::Value>, + /// Property [`RecrawlPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-recrawlpolicy). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub recrawl_policy: Option<::Value>, /// Property [`Role`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-crawler.html#cfn-glue-crawler-role). /// /// Update type: _Mutable_. @@ -296,6 +301,9 @@ impl ::serde::Serialize for CrawlerProperties { if let Some(ref name) = self.name { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; } + if let Some(ref recrawl_policy) = self.recrawl_policy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RecrawlPolicy", recrawl_policy)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "Role", &self.role)?; if let Some(ref schedule) = self.schedule { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Schedule", schedule)?; @@ -332,6 +340,7 @@ impl<'de> ::serde::Deserialize<'de> for CrawlerProperties { let mut database_name: Option<::Value> = None; let mut description: Option<::Value> = None; let mut name: Option<::Value> = None; + let mut recrawl_policy: Option<::Value> = None; let mut role: Option<::Value> = None; let mut schedule: Option<::Value> = None; let mut schema_change_policy: Option<::Value> = None; @@ -359,6 +368,9 @@ impl<'de> ::serde::Deserialize<'de> for CrawlerProperties { "Name" => { name = ::serde::de::MapAccess::next_value(&mut map)?; } + "RecrawlPolicy" => { + recrawl_policy = ::serde::de::MapAccess::next_value(&mut map)?; + } "Role" => { role = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -388,6 +400,7 @@ impl<'de> ::serde::Deserialize<'de> for CrawlerProperties { database_name: database_name, description: description, name: name, + recrawl_policy: recrawl_policy, role: role.ok_or(::serde::de::Error::missing_field("Role"))?, schedule: schedule, schema_change_policy: schema_change_policy, @@ -1506,8 +1519,8 @@ pub struct RegistryProperties { pub name: ::Value, /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-registry.html#cfn-glue-registry-tags). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub tags: Option<::ValueList<::Tag>>, } @@ -1633,8 +1646,8 @@ pub struct SchemaProperties { pub schema_definition: ::Value, /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-schema.html#cfn-glue-schema-tags). /// - /// Update type: _Immutable_. - /// AWS CloudFormation replaces the resource when you change this property. + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. pub tags: Option<::ValueList<::Tag>>, } @@ -3175,6 +3188,125 @@ pub mod crawler { } } + /// The [`AWS::Glue::Crawler.MongoDBTarget`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-mongodbtarget.html) property type. + #[derive(Debug, Default)] + pub struct MongoDBTarget { + /// Property [`ConnectionName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-mongodbtarget.html#cfn-glue-crawler-mongodbtarget-connectionname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub connection_name: Option<::Value>, + /// Property [`Path`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-mongodbtarget.html#cfn-glue-crawler-mongodbtarget-path). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub path: Option<::Value>, + } + + impl ::codec::SerializeValue for MongoDBTarget { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref connection_name) = self.connection_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConnectionName", connection_name)?; + } + if let Some(ref path) = self.path { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Path", path)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for MongoDBTarget { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MongoDBTarget; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MongoDBTarget") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut connection_name: Option<::Value> = None; + let mut path: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ConnectionName" => { + connection_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Path" => { + path = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(MongoDBTarget { + connection_name: connection_name, + path: path, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Glue::Crawler.RecrawlPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-recrawlpolicy.html) property type. + #[derive(Debug, Default)] + pub struct RecrawlPolicy { + /// Property [`RecrawlBehavior`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-recrawlpolicy.html#cfn-glue-crawler-recrawlpolicy-recrawlbehavior). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub recrawl_behavior: Option<::Value>, + } + + impl ::codec::SerializeValue for RecrawlPolicy { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref recrawl_behavior) = self.recrawl_behavior { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RecrawlBehavior", recrawl_behavior)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for RecrawlPolicy { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = RecrawlPolicy; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type RecrawlPolicy") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut recrawl_behavior: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "RecrawlBehavior" => { + recrawl_behavior = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(RecrawlPolicy { + recrawl_behavior: recrawl_behavior, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::Glue::Crawler.S3Target`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-s3target.html) property type. #[derive(Debug, Default)] pub struct S3Target { @@ -3183,6 +3315,16 @@ pub mod crawler { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub connection_name: Option<::Value>, + /// Property [`DlqEventQueueArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-s3target.html#cfn-glue-crawler-s3target-dlqeventqueuearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub dlq_event_queue_arn: Option<::Value>, + /// Property [`EventQueueArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-s3target.html#cfn-glue-crawler-s3target-eventqueuearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub event_queue_arn: Option<::Value>, /// Property [`Exclusions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-s3target.html#cfn-glue-crawler-s3target-exclusions). /// /// Update type: _Mutable_. @@ -3193,6 +3335,11 @@ pub mod crawler { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub path: Option<::Value>, + /// Property [`SampleSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-s3target.html#cfn-glue-crawler-s3target-samplesize). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub sample_size: Option<::Value>, } impl ::codec::SerializeValue for S3Target { @@ -3201,12 +3348,21 @@ pub mod crawler { if let Some(ref connection_name) = self.connection_name { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConnectionName", connection_name)?; } + if let Some(ref dlq_event_queue_arn) = self.dlq_event_queue_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DlqEventQueueArn", dlq_event_queue_arn)?; + } + if let Some(ref event_queue_arn) = self.event_queue_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EventQueueArn", event_queue_arn)?; + } if let Some(ref exclusions) = self.exclusions { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Exclusions", exclusions)?; } if let Some(ref path) = self.path { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Path", path)?; } + if let Some(ref sample_size) = self.sample_size { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SampleSize", sample_size)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -3224,28 +3380,43 @@ pub mod crawler { fn visit_map>(self, mut map: A) -> Result { let mut connection_name: Option<::Value> = None; + let mut dlq_event_queue_arn: Option<::Value> = None; + let mut event_queue_arn: Option<::Value> = None; let mut exclusions: Option<::ValueList> = None; let mut path: Option<::Value> = None; + let mut sample_size: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { "ConnectionName" => { connection_name = ::serde::de::MapAccess::next_value(&mut map)?; } + "DlqEventQueueArn" => { + dlq_event_queue_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EventQueueArn" => { + event_queue_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } "Exclusions" => { exclusions = ::serde::de::MapAccess::next_value(&mut map)?; } "Path" => { path = ::serde::de::MapAccess::next_value(&mut map)?; } + "SampleSize" => { + sample_size = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } Ok(S3Target { connection_name: connection_name, + dlq_event_queue_arn: dlq_event_queue_arn, + event_queue_arn: event_queue_arn, exclusions: exclusions, path: path, + sample_size: sample_size, }) } } @@ -3391,6 +3562,11 @@ pub mod crawler { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub jdbc_targets: Option<::ValueList>, + /// Property [`MongoDBTargets`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-targets.html#cfn-glue-crawler-targets-mongodbtargets). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub mongo_db_targets: Option<::ValueList>, /// Property [`S3Targets`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-crawler-targets.html#cfn-glue-crawler-targets-s3targets). /// /// Update type: _Mutable_. @@ -3410,6 +3586,9 @@ pub mod crawler { if let Some(ref jdbc_targets) = self.jdbc_targets { ::serde::ser::SerializeMap::serialize_entry(&mut map, "JdbcTargets", jdbc_targets)?; } + if let Some(ref mongo_db_targets) = self.mongo_db_targets { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MongoDBTargets", mongo_db_targets)?; + } if let Some(ref s3_targets) = self.s3_targets { ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3Targets", s3_targets)?; } @@ -3432,6 +3611,7 @@ pub mod crawler { let mut catalog_targets: Option<::ValueList> = None; let mut dynamo_db_targets: Option<::ValueList> = None; let mut jdbc_targets: Option<::ValueList> = None; + let mut mongo_db_targets: Option<::ValueList> = None; let mut s3_targets: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { @@ -3445,6 +3625,9 @@ pub mod crawler { "JdbcTargets" => { jdbc_targets = ::serde::de::MapAccess::next_value(&mut map)?; } + "MongoDBTargets" => { + mongo_db_targets = ::serde::de::MapAccess::next_value(&mut map)?; + } "S3Targets" => { s3_targets = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -3456,6 +3639,7 @@ pub mod crawler { catalog_targets: catalog_targets, dynamo_db_targets: dynamo_db_targets, jdbc_targets: jdbc_targets, + mongo_db_targets: mongo_db_targets, s3_targets: s3_targets, }) } @@ -3671,6 +3855,59 @@ pub mod data_catalog_encryption_settings { pub mod database { //! Property types for the `Database` resource. + /// The [`AWS::Glue::Database.DataLakePrincipal`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-datalakeprincipal.html) property type. + #[derive(Debug, Default)] + pub struct DataLakePrincipal { + /// Property [`DataLakePrincipalIdentifier`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-datalakeprincipal.html#cfn-glue-database-datalakeprincipal-datalakeprincipalidentifier). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub data_lake_principal_identifier: Option<::Value>, + } + + impl ::codec::SerializeValue for DataLakePrincipal { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref data_lake_principal_identifier) = self.data_lake_principal_identifier { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataLakePrincipalIdentifier", data_lake_principal_identifier)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for DataLakePrincipal { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = DataLakePrincipal; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type DataLakePrincipal") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut data_lake_principal_identifier: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DataLakePrincipalIdentifier" => { + data_lake_principal_identifier = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(DataLakePrincipal { + data_lake_principal_identifier: data_lake_principal_identifier, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::Glue::Database.DatabaseIdentifier`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-databaseidentifier.html) property type. #[derive(Debug, Default)] pub struct DatabaseIdentifier { @@ -3740,6 +3977,11 @@ pub mod database { /// The [`AWS::Glue::Database.DatabaseInput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-databaseinput.html) property type. #[derive(Debug, Default)] pub struct DatabaseInput { + /// Property [`CreateTableDefaultPermissions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-databaseinput.html#cfn-glue-database-databaseinput-createtabledefaultpermissions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub create_table_default_permissions: Option<::ValueList>, /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-databaseinput.html#cfn-glue-database-databaseinput-description). /// /// Update type: _Mutable_. @@ -3770,6 +4012,9 @@ pub mod database { impl ::codec::SerializeValue for DatabaseInput { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref create_table_default_permissions) = self.create_table_default_permissions { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CreateTableDefaultPermissions", create_table_default_permissions)?; + } if let Some(ref description) = self.description { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; } @@ -3801,6 +4046,7 @@ pub mod database { } fn visit_map>(self, mut map: A) -> Result { + let mut create_table_default_permissions: Option<::ValueList> = None; let mut description: Option<::Value> = None; let mut location_uri: Option<::Value> = None; let mut name: Option<::Value> = None; @@ -3809,6 +4055,9 @@ pub mod database { while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "CreateTableDefaultPermissions" => { + create_table_default_permissions = ::serde::de::MapAccess::next_value(&mut map)?; + } "Description" => { description = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -3829,6 +4078,7 @@ pub mod database { } Ok(DatabaseInput { + create_table_default_permissions: create_table_default_permissions, description: description, location_uri: location_uri, name: name, @@ -3841,6 +4091,72 @@ pub mod database { d.deserialize_map(Visitor) } } + + /// The [`AWS::Glue::Database.PrincipalPrivileges`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-principalprivileges.html) property type. + #[derive(Debug, Default)] + pub struct PrincipalPrivileges { + /// Property [`Permissions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-principalprivileges.html#cfn-glue-database-principalprivileges-permissions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub permissions: Option<::ValueList>, + /// Property [`Principal`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-database-principalprivileges.html#cfn-glue-database-principalprivileges-principal). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub principal: Option<::Value>, + } + + impl ::codec::SerializeValue for PrincipalPrivileges { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref permissions) = self.permissions { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Permissions", permissions)?; + } + if let Some(ref principal) = self.principal { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Principal", principal)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for PrincipalPrivileges { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = PrincipalPrivileges; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type PrincipalPrivileges") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut permissions: Option<::ValueList> = None; + let mut principal: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Permissions" => { + permissions = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Principal" => { + principal = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(PrincipalPrivileges { + permissions: permissions, + principal: principal, + }) + } + } + + d.deserialize_map(Visitor) + } + } } pub mod job { @@ -4817,16 +5133,16 @@ pub mod partition { /// The [`AWS::Glue::Partition.SchemaReference`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-schemareference.html) property type. #[derive(Debug, Default)] pub struct SchemaReference { - /// Property [`SchameVersionId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-schemareference.html#cfn-glue-partition-schemareference-schameversionid). + /// Property [`SchemaId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-schemareference.html#cfn-glue-partition-schemareference-schemaid). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub schame_version_id: Option<::Value>, - /// Property [`SchemaId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-schemareference.html#cfn-glue-partition-schemareference-schemaid). + pub schema_id: Option<::Value>, + /// Property [`SchemaVersionId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-schemareference.html#cfn-glue-partition-schemareference-schemaversionid). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub schema_id: Option<::Value>, + pub schema_version_id: Option<::Value>, /// Property [`SchemaVersionNumber`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-partition-schemareference.html#cfn-glue-partition-schemareference-schemaversionnumber). /// /// Update type: _Mutable_. @@ -4837,12 +5153,12 @@ pub mod partition { impl ::codec::SerializeValue for SchemaReference { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref schame_version_id) = self.schame_version_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SchameVersionId", schame_version_id)?; - } if let Some(ref schema_id) = self.schema_id { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SchemaId", schema_id)?; } + if let Some(ref schema_version_id) = self.schema_version_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SchemaVersionId", schema_version_id)?; + } if let Some(ref schema_version_number) = self.schema_version_number { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SchemaVersionNumber", schema_version_number)?; } @@ -4862,18 +5178,18 @@ pub mod partition { } fn visit_map>(self, mut map: A) -> Result { - let mut schame_version_id: Option<::Value> = None; let mut schema_id: Option<::Value> = None; + let mut schema_version_id: Option<::Value> = None; let mut schema_version_number: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "SchameVersionId" => { - schame_version_id = ::serde::de::MapAccess::next_value(&mut map)?; - } "SchemaId" => { schema_id = ::serde::de::MapAccess::next_value(&mut map)?; } + "SchemaVersionId" => { + schema_version_id = ::serde::de::MapAccess::next_value(&mut map)?; + } "SchemaVersionNumber" => { schema_version_number = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -4882,8 +5198,8 @@ pub mod partition { } Ok(SchemaReference { - schame_version_id: schame_version_id, schema_id: schema_id, + schema_version_id: schema_version_id, schema_version_number: schema_version_number, }) } @@ -6017,16 +6333,16 @@ pub mod table { /// The [`AWS::Glue::Table.SchemaReference`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-schemareference.html) property type. #[derive(Debug, Default)] pub struct SchemaReference { - /// Property [`SchameVersionId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-schemareference.html#cfn-glue-table-schemareference-schameversionid). + /// Property [`SchemaId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-schemareference.html#cfn-glue-table-schemareference-schemaid). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub schame_version_id: Option<::Value>, - /// Property [`SchemaId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-schemareference.html#cfn-glue-table-schemareference-schemaid). + pub schema_id: Option<::Value>, + /// Property [`SchemaVersionId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-schemareference.html#cfn-glue-table-schemareference-schemaversionid). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub schema_id: Option<::Value>, + pub schema_version_id: Option<::Value>, /// Property [`SchemaVersionNumber`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-schemareference.html#cfn-glue-table-schemareference-schemaversionnumber). /// /// Update type: _Mutable_. @@ -6037,12 +6353,12 @@ pub mod table { impl ::codec::SerializeValue for SchemaReference { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref schame_version_id) = self.schame_version_id { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SchameVersionId", schame_version_id)?; - } if let Some(ref schema_id) = self.schema_id { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SchemaId", schema_id)?; } + if let Some(ref schema_version_id) = self.schema_version_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SchemaVersionId", schema_version_id)?; + } if let Some(ref schema_version_number) = self.schema_version_number { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SchemaVersionNumber", schema_version_number)?; } @@ -6062,18 +6378,18 @@ pub mod table { } fn visit_map>(self, mut map: A) -> Result { - let mut schame_version_id: Option<::Value> = None; let mut schema_id: Option<::Value> = None; + let mut schema_version_id: Option<::Value> = None; let mut schema_version_number: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { - "SchameVersionId" => { - schame_version_id = ::serde::de::MapAccess::next_value(&mut map)?; - } "SchemaId" => { schema_id = ::serde::de::MapAccess::next_value(&mut map)?; } + "SchemaVersionId" => { + schema_version_id = ::serde::de::MapAccess::next_value(&mut map)?; + } "SchemaVersionNumber" => { schema_version_number = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -6082,8 +6398,8 @@ pub mod table { } Ok(SchemaReference { - schame_version_id: schame_version_id, schema_id: schema_id, + schema_version_id: schema_version_id, schema_version_number: schema_version_number, }) } diff --git a/src/aws/guardduty.rs b/src/aws/guardduty.rs index d9867d6..5fcbd0d 100644 --- a/src/aws/guardduty.rs +++ b/src/aws/guardduty.rs @@ -720,6 +720,11 @@ pub mod detector { /// The [`AWS::GuardDuty::Detector.CFNDataSourceConfigurations`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-cfndatasourceconfigurations.html) property type. #[derive(Debug, Default)] pub struct CFNDataSourceConfigurations { + /// Property [`Kubernetes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-cfndatasourceconfigurations.html#cfn-guardduty-detector-cfndatasourceconfigurations-kubernetes). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub kubernetes: Option<::Value>, /// Property [`S3Logs`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-cfndatasourceconfigurations.html#cfn-guardduty-detector-cfndatasourceconfigurations-s3logs). /// /// Update type: _Mutable_. @@ -730,6 +735,9 @@ pub mod detector { impl ::codec::SerializeValue for CFNDataSourceConfigurations { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref kubernetes) = self.kubernetes { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Kubernetes", kubernetes)?; + } if let Some(ref s3_logs) = self.s3_logs { ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3Logs", s3_logs)?; } @@ -749,10 +757,14 @@ pub mod detector { } fn visit_map>(self, mut map: A) -> Result { + let mut kubernetes: Option<::Value> = None; let mut s3_logs: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "Kubernetes" => { + kubernetes = ::serde::de::MapAccess::next_value(&mut map)?; + } "S3Logs" => { s3_logs = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -761,6 +773,7 @@ pub mod detector { } Ok(CFNDataSourceConfigurations { + kubernetes: kubernetes, s3_logs: s3_logs, }) } @@ -770,6 +783,112 @@ pub mod detector { } } + /// The [`AWS::GuardDuty::Detector.CFNKubernetesAuditLogsConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-cfnkubernetesauditlogsconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct CFNKubernetesAuditLogsConfiguration { + /// Property [`Enable`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-cfnkubernetesauditlogsconfiguration.html#cfn-guardduty-detector-cfnkubernetesauditlogsconfiguration-enable). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enable: Option<::Value>, + } + + impl ::codec::SerializeValue for CFNKubernetesAuditLogsConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref enable) = self.enable { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Enable", enable)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CFNKubernetesAuditLogsConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CFNKubernetesAuditLogsConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CFNKubernetesAuditLogsConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut enable: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Enable" => { + enable = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CFNKubernetesAuditLogsConfiguration { + enable: enable, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::GuardDuty::Detector.CFNKubernetesConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-cfnkubernetesconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct CFNKubernetesConfiguration { + /// Property [`AuditLogs`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-cfnkubernetesconfiguration.html#cfn-guardduty-detector-cfnkubernetesconfiguration-auditlogs). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub audit_logs: Option<::Value>, + } + + impl ::codec::SerializeValue for CFNKubernetesConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref audit_logs) = self.audit_logs { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AuditLogs", audit_logs)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CFNKubernetesConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CFNKubernetesConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CFNKubernetesConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut audit_logs: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AuditLogs" => { + audit_logs = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CFNKubernetesConfiguration { + audit_logs: audit_logs, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::GuardDuty::Detector.CFNS3LogsConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-guardduty-detector-cfns3logsconfiguration.html) property type. #[derive(Debug, Default)] pub struct CFNS3LogsConfiguration { diff --git a/src/aws/healthlake.rs b/src/aws/healthlake.rs new file mode 100644 index 0000000..2826c9a --- /dev/null +++ b/src/aws/healthlake.rs @@ -0,0 +1,299 @@ +//! Types for the `HealthLake` service. + +/// The [`AWS::HealthLake::FHIRDatastore`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-healthlake-fhirdatastore.html) resource type. +#[derive(Debug, Default)] +pub struct FHIRDatastore { + properties: FHIRDatastoreProperties +} + +/// Properties for the `FHIRDatastore` resource. +#[derive(Debug, Default)] +pub struct FHIRDatastoreProperties { + /// Property [`DatastoreName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-healthlake-fhirdatastore.html#cfn-healthlake-fhirdatastore-datastorename). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub datastore_name: Option<::Value>, + /// Property [`DatastoreTypeVersion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-healthlake-fhirdatastore.html#cfn-healthlake-fhirdatastore-datastoretypeversion). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub datastore_type_version: ::Value, + /// Property [`PreloadDataConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-healthlake-fhirdatastore.html#cfn-healthlake-fhirdatastore-preloaddataconfig). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub preload_data_config: Option<::Value>, + /// Property [`SseConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-healthlake-fhirdatastore.html#cfn-healthlake-fhirdatastore-sseconfiguration). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub sse_configuration: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-healthlake-fhirdatastore.html#cfn-healthlake-fhirdatastore-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, +} + +impl ::serde::Serialize for FHIRDatastoreProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref datastore_name) = self.datastore_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatastoreName", datastore_name)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatastoreTypeVersion", &self.datastore_type_version)?; + if let Some(ref preload_data_config) = self.preload_data_config { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PreloadDataConfig", preload_data_config)?; + } + if let Some(ref sse_configuration) = self.sse_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SseConfiguration", sse_configuration)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for FHIRDatastoreProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = FHIRDatastoreProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type FHIRDatastoreProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut datastore_name: Option<::Value> = None; + let mut datastore_type_version: Option<::Value> = None; + let mut preload_data_config: Option<::Value> = None; + let mut sse_configuration: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DatastoreName" => { + datastore_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DatastoreTypeVersion" => { + datastore_type_version = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PreloadDataConfig" => { + preload_data_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SseConfiguration" => { + sse_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(FHIRDatastoreProperties { + datastore_name: datastore_name, + datastore_type_version: datastore_type_version.ok_or(::serde::de::Error::missing_field("DatastoreTypeVersion"))?, + preload_data_config: preload_data_config, + sse_configuration: sse_configuration, + tags: tags, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for FHIRDatastore { + type Properties = FHIRDatastoreProperties; + const TYPE: &'static str = "AWS::HealthLake::FHIRDatastore"; + fn properties(&self) -> &FHIRDatastoreProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut FHIRDatastoreProperties { + &mut self.properties + } +} + +impl ::private::Sealed for FHIRDatastore {} + +impl From for FHIRDatastore { + fn from(properties: FHIRDatastoreProperties) -> FHIRDatastore { + FHIRDatastore { properties } + } +} + +pub mod fhir_datastore { + //! Property types for the `FHIRDatastore` resource. + + /// The [`AWS::HealthLake::FHIRDatastore.KmsEncryptionConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-healthlake-fhirdatastore-kmsencryptionconfig.html) property type. + #[derive(Debug, Default)] + pub struct KmsEncryptionConfig { + /// Property [`CmkType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-healthlake-fhirdatastore-kmsencryptionconfig.html#cfn-healthlake-fhirdatastore-kmsencryptionconfig-cmktype). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub cmk_type: ::Value, + /// Property [`KmsKeyId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-healthlake-fhirdatastore-kmsencryptionconfig.html#cfn-healthlake-fhirdatastore-kmsencryptionconfig-kmskeyid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub kms_key_id: Option<::Value>, + } + + impl ::codec::SerializeValue for KmsEncryptionConfig { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CmkType", &self.cmk_type)?; + if let Some(ref kms_key_id) = self.kms_key_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "KmsKeyId", kms_key_id)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for KmsEncryptionConfig { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = KmsEncryptionConfig; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type KmsEncryptionConfig") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut cmk_type: Option<::Value> = None; + let mut kms_key_id: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CmkType" => { + cmk_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "KmsKeyId" => { + kms_key_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(KmsEncryptionConfig { + cmk_type: cmk_type.ok_or(::serde::de::Error::missing_field("CmkType"))?, + kms_key_id: kms_key_id, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::HealthLake::FHIRDatastore.PreloadDataConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-healthlake-fhirdatastore-preloaddataconfig.html) property type. + #[derive(Debug, Default)] + pub struct PreloadDataConfig { + /// Property [`PreloadDataType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-healthlake-fhirdatastore-preloaddataconfig.html#cfn-healthlake-fhirdatastore-preloaddataconfig-preloaddatatype). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub preload_data_type: ::Value, + } + + impl ::codec::SerializeValue for PreloadDataConfig { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PreloadDataType", &self.preload_data_type)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for PreloadDataConfig { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = PreloadDataConfig; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type PreloadDataConfig") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut preload_data_type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "PreloadDataType" => { + preload_data_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(PreloadDataConfig { + preload_data_type: preload_data_type.ok_or(::serde::de::Error::missing_field("PreloadDataType"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::HealthLake::FHIRDatastore.SseConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-healthlake-fhirdatastore-sseconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct SseConfiguration { + /// Property [`KmsEncryptionConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-healthlake-fhirdatastore-sseconfiguration.html#cfn-healthlake-fhirdatastore-sseconfiguration-kmsencryptionconfig). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub kms_encryption_config: ::Value, + } + + impl ::codec::SerializeValue for SseConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "KmsEncryptionConfig", &self.kms_encryption_config)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for SseConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = SseConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type SseConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut kms_encryption_config: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "KmsEncryptionConfig" => { + kms_encryption_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(SseConfiguration { + kms_encryption_config: kms_encryption_config.ok_or(::serde::de::Error::missing_field("KmsEncryptionConfig"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} diff --git a/src/aws/imagebuilder.rs b/src/aws/imagebuilder.rs index b9be674..3097a81 100644 --- a/src/aws/imagebuilder.rs +++ b/src/aws/imagebuilder.rs @@ -561,8 +561,8 @@ pub struct Image { pub struct ImageProperties { /// Property [`ContainerRecipeArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-image.html#cfn-imagebuilder-image-containerrecipearn). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. pub container_recipe_arn: Option<::Value>, /// Property [`DistributionConfigurationArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-image.html#cfn-imagebuilder-image-distributionconfigurationarn). /// @@ -917,6 +917,11 @@ pub struct ImageRecipe { /// Properties for the `ImageRecipe` resource. #[derive(Debug, Default)] pub struct ImageRecipeProperties { + /// Property [`AdditionalInstanceConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagerecipe.html#cfn-imagebuilder-imagerecipe-additionalinstanceconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub additional_instance_configuration: Option<::Value>, /// Property [`BlockDeviceMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-imagerecipe.html#cfn-imagebuilder-imagerecipe-blockdevicemappings). /// /// Update type: _Immutable_. @@ -962,6 +967,9 @@ pub struct ImageRecipeProperties { impl ::serde::Serialize for ImageRecipeProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref additional_instance_configuration) = self.additional_instance_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AdditionalInstanceConfiguration", additional_instance_configuration)?; + } if let Some(ref block_device_mappings) = self.block_device_mappings { ::serde::ser::SerializeMap::serialize_entry(&mut map, "BlockDeviceMappings", block_device_mappings)?; } @@ -994,6 +1002,7 @@ impl<'de> ::serde::Deserialize<'de> for ImageRecipeProperties { } fn visit_map>(self, mut map: A) -> Result { + let mut additional_instance_configuration: Option<::Value> = None; let mut block_device_mappings: Option<::ValueList> = None; let mut components: Option<::ValueList> = None; let mut description: Option<::Value> = None; @@ -1005,6 +1014,9 @@ impl<'de> ::serde::Deserialize<'de> for ImageRecipeProperties { while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "AdditionalInstanceConfiguration" => { + additional_instance_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } "BlockDeviceMappings" => { block_device_mappings = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1034,6 +1046,7 @@ impl<'de> ::serde::Deserialize<'de> for ImageRecipeProperties { } Ok(ImageRecipeProperties { + additional_instance_configuration: additional_instance_configuration, block_device_mappings: block_device_mappings, components: components.ok_or(::serde::de::Error::missing_field("Components"))?, description: description, @@ -1083,6 +1096,11 @@ pub struct InfrastructureConfigurationProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub description: Option<::Value>, + /// Property [`InstanceMetadataOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-infrastructureconfiguration.html#cfn-imagebuilder-infrastructureconfiguration-instancemetadataoptions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub instance_metadata_options: Option<::Value>, /// Property [`InstanceProfileName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-imagebuilder-infrastructureconfiguration.html#cfn-imagebuilder-infrastructureconfiguration-instanceprofilename). /// /// Update type: _Mutable_. @@ -1146,6 +1164,9 @@ impl ::serde::Serialize for InfrastructureConfigurationProperties { if let Some(ref description) = self.description { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; } + if let Some(ref instance_metadata_options) = self.instance_metadata_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceMetadataOptions", instance_metadata_options)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceProfileName", &self.instance_profile_name)?; if let Some(ref instance_types) = self.instance_types { ::serde::ser::SerializeMap::serialize_entry(&mut map, "InstanceTypes", instance_types)?; @@ -1192,6 +1213,7 @@ impl<'de> ::serde::Deserialize<'de> for InfrastructureConfigurationProperties { fn visit_map>(self, mut map: A) -> Result { let mut description: Option<::Value> = None; + let mut instance_metadata_options: Option<::Value> = None; let mut instance_profile_name: Option<::Value> = None; let mut instance_types: Option<::ValueList> = None; let mut key_pair: Option<::Value> = None; @@ -1209,6 +1231,9 @@ impl<'de> ::serde::Deserialize<'de> for InfrastructureConfigurationProperties { "Description" => { description = ::serde::de::MapAccess::next_value(&mut map)?; } + "InstanceMetadataOptions" => { + instance_metadata_options = ::serde::de::MapAccess::next_value(&mut map)?; + } "InstanceProfileName" => { instance_profile_name = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1248,6 +1273,7 @@ impl<'de> ::serde::Deserialize<'de> for InfrastructureConfigurationProperties { Ok(InfrastructureConfigurationProperties { description: description, + instance_metadata_options: instance_metadata_options, instance_profile_name: instance_profile_name.ok_or(::serde::de::Error::missing_field("InstanceProfileName"))?, instance_types: instance_types, key_pair: key_pair, @@ -1370,6 +1396,11 @@ pub mod container_recipe { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub snapshot_id: Option<::Value>, + /// Property [`Throughput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-ebsinstanceblockdevicespecification.html#cfn-imagebuilder-containerrecipe-ebsinstanceblockdevicespecification-throughput). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub throughput: Option<::Value>, /// Property [`VolumeSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-containerrecipe-ebsinstanceblockdevicespecification.html#cfn-imagebuilder-containerrecipe-ebsinstanceblockdevicespecification-volumesize). /// /// Update type: _Immutable_. @@ -1400,6 +1431,9 @@ pub mod container_recipe { if let Some(ref snapshot_id) = self.snapshot_id { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SnapshotId", snapshot_id)?; } + if let Some(ref throughput) = self.throughput { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Throughput", throughput)?; + } if let Some(ref volume_size) = self.volume_size { ::serde::ser::SerializeMap::serialize_entry(&mut map, "VolumeSize", volume_size)?; } @@ -1427,6 +1461,7 @@ pub mod container_recipe { let mut iops: Option<::Value> = None; let mut kms_key_id: Option<::Value> = None; let mut snapshot_id: Option<::Value> = None; + let mut throughput: Option<::Value> = None; let mut volume_size: Option<::Value> = None; let mut volume_type: Option<::Value> = None; @@ -1447,6 +1482,9 @@ pub mod container_recipe { "SnapshotId" => { snapshot_id = ::serde::de::MapAccess::next_value(&mut map)?; } + "Throughput" => { + throughput = ::serde::de::MapAccess::next_value(&mut map)?; + } "VolumeSize" => { volume_size = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1463,6 +1501,7 @@ pub mod container_recipe { iops: iops, kms_key_id: kms_key_id, snapshot_id: snapshot_id, + throughput: throughput, volume_size: volume_size, volume_type: volume_type, }) @@ -2093,6 +2132,72 @@ pub mod image_pipeline { pub mod image_recipe { //! Property types for the `ImageRecipe` resource. + /// The [`AWS::ImageBuilder::ImageRecipe.AdditionalInstanceConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-additionalinstanceconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct AdditionalInstanceConfiguration { + /// Property [`SystemsManagerAgent`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-additionalinstanceconfiguration.html#cfn-imagebuilder-imagerecipe-additionalinstanceconfiguration-systemsmanageragent). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub systems_manager_agent: Option<::Value>, + /// Property [`UserDataOverride`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-additionalinstanceconfiguration.html#cfn-imagebuilder-imagerecipe-additionalinstanceconfiguration-userdataoverride). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub user_data_override: Option<::Value>, + } + + impl ::codec::SerializeValue for AdditionalInstanceConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref systems_manager_agent) = self.systems_manager_agent { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SystemsManagerAgent", systems_manager_agent)?; + } + if let Some(ref user_data_override) = self.user_data_override { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UserDataOverride", user_data_override)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AdditionalInstanceConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AdditionalInstanceConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AdditionalInstanceConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut systems_manager_agent: Option<::Value> = None; + let mut user_data_override: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "SystemsManagerAgent" => { + systems_manager_agent = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UserDataOverride" => { + user_data_override = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AdditionalInstanceConfiguration { + systems_manager_agent: systems_manager_agent, + user_data_override: user_data_override, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::ImageBuilder::ImageRecipe.ComponentConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-componentconfiguration.html) property type. #[derive(Debug, Default)] pub struct ComponentConfiguration { @@ -2101,6 +2206,11 @@ pub mod image_recipe { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub component_arn: Option<::Value>, + /// Property [`Parameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-componentconfiguration.html#cfn-imagebuilder-imagerecipe-componentconfiguration-parameters). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub parameters: Option<::ValueList>, } impl ::codec::SerializeValue for ComponentConfiguration { @@ -2109,6 +2219,9 @@ pub mod image_recipe { if let Some(ref component_arn) = self.component_arn { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ComponentArn", component_arn)?; } + if let Some(ref parameters) = self.parameters { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Parameters", parameters)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -2126,18 +2239,85 @@ pub mod image_recipe { fn visit_map>(self, mut map: A) -> Result { let mut component_arn: Option<::Value> = None; + let mut parameters: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { "ComponentArn" => { component_arn = ::serde::de::MapAccess::next_value(&mut map)?; } + "Parameters" => { + parameters = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } Ok(ComponentConfiguration { component_arn: component_arn, + parameters: parameters, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::ImageBuilder::ImageRecipe.ComponentParameter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-componentparameter.html) property type. + #[derive(Debug, Default)] + pub struct ComponentParameter { + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-componentparameter.html#cfn-imagebuilder-imagerecipe-componentparameter-name). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub name: ::Value, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-componentparameter.html#cfn-imagebuilder-imagerecipe-componentparameter-value). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub value: ::ValueList, + } + + impl ::codec::SerializeValue for ComponentParameter { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", &self.value)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ComponentParameter { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ComponentParameter; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ComponentParameter") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut name: Option<::Value> = None; + let mut value: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ComponentParameter { + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + value: value.ok_or(::serde::de::Error::missing_field("Value"))?, }) } } @@ -2174,6 +2354,11 @@ pub mod image_recipe { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub snapshot_id: Option<::Value>, + /// Property [`Throughput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-ebsinstanceblockdevicespecification.html#cfn-imagebuilder-imagerecipe-ebsinstanceblockdevicespecification-throughput). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub throughput: Option<::Value>, /// Property [`VolumeSize`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-ebsinstanceblockdevicespecification.html#cfn-imagebuilder-imagerecipe-ebsinstanceblockdevicespecification-volumesize). /// /// Update type: _Immutable_. @@ -2204,6 +2389,9 @@ pub mod image_recipe { if let Some(ref snapshot_id) = self.snapshot_id { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SnapshotId", snapshot_id)?; } + if let Some(ref throughput) = self.throughput { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Throughput", throughput)?; + } if let Some(ref volume_size) = self.volume_size { ::serde::ser::SerializeMap::serialize_entry(&mut map, "VolumeSize", volume_size)?; } @@ -2231,6 +2419,7 @@ pub mod image_recipe { let mut iops: Option<::Value> = None; let mut kms_key_id: Option<::Value> = None; let mut snapshot_id: Option<::Value> = None; + let mut throughput: Option<::Value> = None; let mut volume_size: Option<::Value> = None; let mut volume_type: Option<::Value> = None; @@ -2251,6 +2440,9 @@ pub mod image_recipe { "SnapshotId" => { snapshot_id = ::serde::de::MapAccess::next_value(&mut map)?; } + "Throughput" => { + throughput = ::serde::de::MapAccess::next_value(&mut map)?; + } "VolumeSize" => { volume_size = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -2267,6 +2459,7 @@ pub mod image_recipe { iops: iops, kms_key_id: kms_key_id, snapshot_id: snapshot_id, + throughput: throughput, volume_size: volume_size, volume_type: volume_type, }) @@ -2368,11 +2561,130 @@ pub mod image_recipe { d.deserialize_map(Visitor) } } + + /// The [`AWS::ImageBuilder::ImageRecipe.SystemsManagerAgent`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-systemsmanageragent.html) property type. + #[derive(Debug, Default)] + pub struct SystemsManagerAgent { + /// Property [`UninstallAfterBuild`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-imagerecipe-systemsmanageragent.html#cfn-imagebuilder-imagerecipe-systemsmanageragent-uninstallafterbuild). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub uninstall_after_build: Option<::Value>, + } + + impl ::codec::SerializeValue for SystemsManagerAgent { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref uninstall_after_build) = self.uninstall_after_build { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UninstallAfterBuild", uninstall_after_build)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for SystemsManagerAgent { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = SystemsManagerAgent; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type SystemsManagerAgent") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut uninstall_after_build: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "UninstallAfterBuild" => { + uninstall_after_build = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(SystemsManagerAgent { + uninstall_after_build: uninstall_after_build, + }) + } + } + + d.deserialize_map(Visitor) + } + } } pub mod infrastructure_configuration { //! Property types for the `InfrastructureConfiguration` resource. + /// The [`AWS::ImageBuilder::InfrastructureConfiguration.InstanceMetadataOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-infrastructureconfiguration-instancemetadataoptions.html) property type. + #[derive(Debug, Default)] + pub struct InstanceMetadataOptions { + /// Property [`HttpPutResponseHopLimit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-infrastructureconfiguration-instancemetadataoptions.html#cfn-imagebuilder-infrastructureconfiguration-instancemetadataoptions-httpputresponsehoplimit). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub http_put_response_hop_limit: Option<::Value>, + /// Property [`HttpTokens`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-infrastructureconfiguration-instancemetadataoptions.html#cfn-imagebuilder-infrastructureconfiguration-instancemetadataoptions-httptokens). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub http_tokens: Option<::Value>, + } + + impl ::codec::SerializeValue for InstanceMetadataOptions { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref http_put_response_hop_limit) = self.http_put_response_hop_limit { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HttpPutResponseHopLimit", http_put_response_hop_limit)?; + } + if let Some(ref http_tokens) = self.http_tokens { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HttpTokens", http_tokens)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for InstanceMetadataOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = InstanceMetadataOptions; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type InstanceMetadataOptions") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut http_put_response_hop_limit: Option<::Value> = None; + let mut http_tokens: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "HttpPutResponseHopLimit" => { + http_put_response_hop_limit = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HttpTokens" => { + http_tokens = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(InstanceMetadataOptions { + http_put_response_hop_limit: http_put_response_hop_limit, + http_tokens: http_tokens, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::ImageBuilder::InfrastructureConfiguration.Logging`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-imagebuilder-infrastructureconfiguration-logging.html) property type. #[derive(Debug, Default)] pub struct Logging { diff --git a/src/aws/inspectorv2.rs b/src/aws/inspectorv2.rs new file mode 100644 index 0000000..842877d --- /dev/null +++ b/src/aws/inspectorv2.rs @@ -0,0 +1,1014 @@ +//! Types for the `InspectorV2` service. + +/// The [`AWS::InspectorV2::Filter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-inspectorv2-filter.html) resource type. +#[derive(Debug, Default)] +pub struct Filter { + properties: FilterProperties +} + +/// Properties for the `Filter` resource. +#[derive(Debug, Default)] +pub struct FilterProperties { + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-inspectorv2-filter.html#cfn-inspectorv2-filter-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`FilterAction`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-inspectorv2-filter.html#cfn-inspectorv2-filter-filteraction). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub filter_action: ::Value, + /// Property [`FilterCriteria`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-inspectorv2-filter.html#cfn-inspectorv2-filter-filtercriteria). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub filter_criteria: ::Value, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-inspectorv2-filter.html#cfn-inspectorv2-filter-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: ::Value, +} + +impl ::serde::Serialize for FilterProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FilterAction", &self.filter_action)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FilterCriteria", &self.filter_criteria)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for FilterProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = FilterProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type FilterProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut description: Option<::Value> = None; + let mut filter_action: Option<::Value> = None; + let mut filter_criteria: Option<::Value> = None; + let mut name: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FilterAction" => { + filter_action = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FilterCriteria" => { + filter_criteria = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(FilterProperties { + description: description, + filter_action: filter_action.ok_or(::serde::de::Error::missing_field("FilterAction"))?, + filter_criteria: filter_criteria.ok_or(::serde::de::Error::missing_field("FilterCriteria"))?, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for Filter { + type Properties = FilterProperties; + const TYPE: &'static str = "AWS::InspectorV2::Filter"; + fn properties(&self) -> &FilterProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut FilterProperties { + &mut self.properties + } +} + +impl ::private::Sealed for Filter {} + +impl From for Filter { + fn from(properties: FilterProperties) -> Filter { + Filter { properties } + } +} + +pub mod filter { + //! Property types for the `Filter` resource. + + /// The [`AWS::InspectorV2::Filter.DateFilter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-datefilter.html) property type. + #[derive(Debug, Default)] + pub struct DateFilter { + /// Property [`EndInclusive`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-datefilter.html#cfn-inspectorv2-filter-datefilter-endinclusive). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub end_inclusive: Option<::Value>, + /// Property [`StartInclusive`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-datefilter.html#cfn-inspectorv2-filter-datefilter-startinclusive). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub start_inclusive: Option<::Value>, + } + + impl ::codec::SerializeValue for DateFilter { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref end_inclusive) = self.end_inclusive { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EndInclusive", end_inclusive)?; + } + if let Some(ref start_inclusive) = self.start_inclusive { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "StartInclusive", start_inclusive)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for DateFilter { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = DateFilter; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type DateFilter") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut end_inclusive: Option<::Value> = None; + let mut start_inclusive: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "EndInclusive" => { + end_inclusive = ::serde::de::MapAccess::next_value(&mut map)?; + } + "StartInclusive" => { + start_inclusive = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(DateFilter { + end_inclusive: end_inclusive, + start_inclusive: start_inclusive, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::InspectorV2::Filter.FilterCriteria`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html) property type. + #[derive(Debug, Default)] + pub struct FilterCriteria { + /// Property [`AwsAccountId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-awsaccountid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub aws_account_id: Option<::ValueList>, + /// Property [`ComponentId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-componentid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub component_id: Option<::ValueList>, + /// Property [`ComponentType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-componenttype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub component_type: Option<::ValueList>, + /// Property [`Ec2InstanceImageId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-ec2instanceimageid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ec2_instance_image_id: Option<::ValueList>, + /// Property [`Ec2InstanceSubnetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-ec2instancesubnetid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ec2_instance_subnet_id: Option<::ValueList>, + /// Property [`Ec2InstanceVpcId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-ec2instancevpcid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ec2_instance_vpc_id: Option<::ValueList>, + /// Property [`EcrImageArchitecture`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-ecrimagearchitecture). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ecr_image_architecture: Option<::ValueList>, + /// Property [`EcrImageHash`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-ecrimagehash). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ecr_image_hash: Option<::ValueList>, + /// Property [`EcrImagePushedAt`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-ecrimagepushedat). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ecr_image_pushed_at: Option<::ValueList>, + /// Property [`EcrImageRegistry`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-ecrimageregistry). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ecr_image_registry: Option<::ValueList>, + /// Property [`EcrImageRepositoryName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-ecrimagerepositoryname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ecr_image_repository_name: Option<::ValueList>, + /// Property [`EcrImageTags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-ecrimagetags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ecr_image_tags: Option<::ValueList>, + /// Property [`FindingArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-findingarn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub finding_arn: Option<::ValueList>, + /// Property [`FindingStatus`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-findingstatus). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub finding_status: Option<::ValueList>, + /// Property [`FindingType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-findingtype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub finding_type: Option<::ValueList>, + /// Property [`FirstObservedAt`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-firstobservedat). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub first_observed_at: Option<::ValueList>, + /// Property [`InspectorScore`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-inspectorscore). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub inspector_score: Option<::ValueList>, + /// Property [`LastObservedAt`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-lastobservedat). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub last_observed_at: Option<::ValueList>, + /// Property [`NetworkProtocol`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-networkprotocol). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub network_protocol: Option<::ValueList>, + /// Property [`PortRange`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-portrange). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub port_range: Option<::ValueList>, + /// Property [`RelatedVulnerabilities`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-relatedvulnerabilities). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub related_vulnerabilities: Option<::ValueList>, + /// Property [`ResourceId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-resourceid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub resource_id: Option<::ValueList>, + /// Property [`ResourceTags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-resourcetags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub resource_tags: Option<::ValueList>, + /// Property [`ResourceType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-resourcetype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub resource_type: Option<::ValueList>, + /// Property [`Severity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-severity). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub severity: Option<::ValueList>, + /// Property [`Title`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-title). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub title: Option<::ValueList>, + /// Property [`UpdatedAt`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-updatedat). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub updated_at: Option<::ValueList>, + /// Property [`VendorSeverity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-vendorseverity). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub vendor_severity: Option<::ValueList>, + /// Property [`VulnerabilityId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-vulnerabilityid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub vulnerability_id: Option<::ValueList>, + /// Property [`VulnerabilitySource`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-vulnerabilitysource). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub vulnerability_source: Option<::ValueList>, + /// Property [`VulnerablePackages`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-filtercriteria.html#cfn-inspectorv2-filter-filtercriteria-vulnerablepackages). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub vulnerable_packages: Option<::ValueList>, + } + + impl ::codec::SerializeValue for FilterCriteria { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref aws_account_id) = self.aws_account_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AwsAccountId", aws_account_id)?; + } + if let Some(ref component_id) = self.component_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ComponentId", component_id)?; + } + if let Some(ref component_type) = self.component_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ComponentType", component_type)?; + } + if let Some(ref ec2_instance_image_id) = self.ec2_instance_image_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ec2InstanceImageId", ec2_instance_image_id)?; + } + if let Some(ref ec2_instance_subnet_id) = self.ec2_instance_subnet_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ec2InstanceSubnetId", ec2_instance_subnet_id)?; + } + if let Some(ref ec2_instance_vpc_id) = self.ec2_instance_vpc_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Ec2InstanceVpcId", ec2_instance_vpc_id)?; + } + if let Some(ref ecr_image_architecture) = self.ecr_image_architecture { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EcrImageArchitecture", ecr_image_architecture)?; + } + if let Some(ref ecr_image_hash) = self.ecr_image_hash { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EcrImageHash", ecr_image_hash)?; + } + if let Some(ref ecr_image_pushed_at) = self.ecr_image_pushed_at { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EcrImagePushedAt", ecr_image_pushed_at)?; + } + if let Some(ref ecr_image_registry) = self.ecr_image_registry { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EcrImageRegistry", ecr_image_registry)?; + } + if let Some(ref ecr_image_repository_name) = self.ecr_image_repository_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EcrImageRepositoryName", ecr_image_repository_name)?; + } + if let Some(ref ecr_image_tags) = self.ecr_image_tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EcrImageTags", ecr_image_tags)?; + } + if let Some(ref finding_arn) = self.finding_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FindingArn", finding_arn)?; + } + if let Some(ref finding_status) = self.finding_status { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FindingStatus", finding_status)?; + } + if let Some(ref finding_type) = self.finding_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FindingType", finding_type)?; + } + if let Some(ref first_observed_at) = self.first_observed_at { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FirstObservedAt", first_observed_at)?; + } + if let Some(ref inspector_score) = self.inspector_score { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InspectorScore", inspector_score)?; + } + if let Some(ref last_observed_at) = self.last_observed_at { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LastObservedAt", last_observed_at)?; + } + if let Some(ref network_protocol) = self.network_protocol { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NetworkProtocol", network_protocol)?; + } + if let Some(ref port_range) = self.port_range { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PortRange", port_range)?; + } + if let Some(ref related_vulnerabilities) = self.related_vulnerabilities { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RelatedVulnerabilities", related_vulnerabilities)?; + } + if let Some(ref resource_id) = self.resource_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceId", resource_id)?; + } + if let Some(ref resource_tags) = self.resource_tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceTags", resource_tags)?; + } + if let Some(ref resource_type) = self.resource_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceType", resource_type)?; + } + if let Some(ref severity) = self.severity { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Severity", severity)?; + } + if let Some(ref title) = self.title { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Title", title)?; + } + if let Some(ref updated_at) = self.updated_at { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UpdatedAt", updated_at)?; + } + if let Some(ref vendor_severity) = self.vendor_severity { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VendorSeverity", vendor_severity)?; + } + if let Some(ref vulnerability_id) = self.vulnerability_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VulnerabilityId", vulnerability_id)?; + } + if let Some(ref vulnerability_source) = self.vulnerability_source { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VulnerabilitySource", vulnerability_source)?; + } + if let Some(ref vulnerable_packages) = self.vulnerable_packages { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VulnerablePackages", vulnerable_packages)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for FilterCriteria { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = FilterCriteria; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type FilterCriteria") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut aws_account_id: Option<::ValueList> = None; + let mut component_id: Option<::ValueList> = None; + let mut component_type: Option<::ValueList> = None; + let mut ec2_instance_image_id: Option<::ValueList> = None; + let mut ec2_instance_subnet_id: Option<::ValueList> = None; + let mut ec2_instance_vpc_id: Option<::ValueList> = None; + let mut ecr_image_architecture: Option<::ValueList> = None; + let mut ecr_image_hash: Option<::ValueList> = None; + let mut ecr_image_pushed_at: Option<::ValueList> = None; + let mut ecr_image_registry: Option<::ValueList> = None; + let mut ecr_image_repository_name: Option<::ValueList> = None; + let mut ecr_image_tags: Option<::ValueList> = None; + let mut finding_arn: Option<::ValueList> = None; + let mut finding_status: Option<::ValueList> = None; + let mut finding_type: Option<::ValueList> = None; + let mut first_observed_at: Option<::ValueList> = None; + let mut inspector_score: Option<::ValueList> = None; + let mut last_observed_at: Option<::ValueList> = None; + let mut network_protocol: Option<::ValueList> = None; + let mut port_range: Option<::ValueList> = None; + let mut related_vulnerabilities: Option<::ValueList> = None; + let mut resource_id: Option<::ValueList> = None; + let mut resource_tags: Option<::ValueList> = None; + let mut resource_type: Option<::ValueList> = None; + let mut severity: Option<::ValueList> = None; + let mut title: Option<::ValueList> = None; + let mut updated_at: Option<::ValueList> = None; + let mut vendor_severity: Option<::ValueList> = None; + let mut vulnerability_id: Option<::ValueList> = None; + let mut vulnerability_source: Option<::ValueList> = None; + let mut vulnerable_packages: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AwsAccountId" => { + aws_account_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ComponentId" => { + component_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ComponentType" => { + component_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Ec2InstanceImageId" => { + ec2_instance_image_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Ec2InstanceSubnetId" => { + ec2_instance_subnet_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Ec2InstanceVpcId" => { + ec2_instance_vpc_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EcrImageArchitecture" => { + ecr_image_architecture = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EcrImageHash" => { + ecr_image_hash = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EcrImagePushedAt" => { + ecr_image_pushed_at = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EcrImageRegistry" => { + ecr_image_registry = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EcrImageRepositoryName" => { + ecr_image_repository_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EcrImageTags" => { + ecr_image_tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FindingArn" => { + finding_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FindingStatus" => { + finding_status = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FindingType" => { + finding_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FirstObservedAt" => { + first_observed_at = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InspectorScore" => { + inspector_score = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LastObservedAt" => { + last_observed_at = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NetworkProtocol" => { + network_protocol = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PortRange" => { + port_range = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RelatedVulnerabilities" => { + related_vulnerabilities = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ResourceId" => { + resource_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ResourceTags" => { + resource_tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ResourceType" => { + resource_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Severity" => { + severity = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Title" => { + title = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UpdatedAt" => { + updated_at = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VendorSeverity" => { + vendor_severity = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VulnerabilityId" => { + vulnerability_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VulnerabilitySource" => { + vulnerability_source = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VulnerablePackages" => { + vulnerable_packages = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(FilterCriteria { + aws_account_id: aws_account_id, + component_id: component_id, + component_type: component_type, + ec2_instance_image_id: ec2_instance_image_id, + ec2_instance_subnet_id: ec2_instance_subnet_id, + ec2_instance_vpc_id: ec2_instance_vpc_id, + ecr_image_architecture: ecr_image_architecture, + ecr_image_hash: ecr_image_hash, + ecr_image_pushed_at: ecr_image_pushed_at, + ecr_image_registry: ecr_image_registry, + ecr_image_repository_name: ecr_image_repository_name, + ecr_image_tags: ecr_image_tags, + finding_arn: finding_arn, + finding_status: finding_status, + finding_type: finding_type, + first_observed_at: first_observed_at, + inspector_score: inspector_score, + last_observed_at: last_observed_at, + network_protocol: network_protocol, + port_range: port_range, + related_vulnerabilities: related_vulnerabilities, + resource_id: resource_id, + resource_tags: resource_tags, + resource_type: resource_type, + severity: severity, + title: title, + updated_at: updated_at, + vendor_severity: vendor_severity, + vulnerability_id: vulnerability_id, + vulnerability_source: vulnerability_source, + vulnerable_packages: vulnerable_packages, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::InspectorV2::Filter.MapFilter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-mapfilter.html) property type. + #[derive(Debug, Default)] + pub struct MapFilter { + /// Property [`Comparison`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-mapfilter.html#cfn-inspectorv2-filter-mapfilter-comparison). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub comparison: ::Value, + /// Property [`Key`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-mapfilter.html#cfn-inspectorv2-filter-mapfilter-key). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub key: Option<::Value>, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-mapfilter.html#cfn-inspectorv2-filter-mapfilter-value). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub value: Option<::Value>, + } + + impl ::codec::SerializeValue for MapFilter { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Comparison", &self.comparison)?; + if let Some(ref key) = self.key { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Key", key)?; + } + if let Some(ref value) = self.value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", value)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for MapFilter { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MapFilter; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MapFilter") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut comparison: Option<::Value> = None; + let mut key: Option<::Value> = None; + let mut value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Comparison" => { + comparison = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Key" => { + key = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(MapFilter { + comparison: comparison.ok_or(::serde::de::Error::missing_field("Comparison"))?, + key: key, + value: value, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::InspectorV2::Filter.NumberFilter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-numberfilter.html) property type. + #[derive(Debug, Default)] + pub struct NumberFilter { + /// Property [`LowerInclusive`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-numberfilter.html#cfn-inspectorv2-filter-numberfilter-lowerinclusive). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub lower_inclusive: Option<::Value>, + /// Property [`UpperInclusive`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-numberfilter.html#cfn-inspectorv2-filter-numberfilter-upperinclusive). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub upper_inclusive: Option<::Value>, + } + + impl ::codec::SerializeValue for NumberFilter { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref lower_inclusive) = self.lower_inclusive { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LowerInclusive", lower_inclusive)?; + } + if let Some(ref upper_inclusive) = self.upper_inclusive { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UpperInclusive", upper_inclusive)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for NumberFilter { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = NumberFilter; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type NumberFilter") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut lower_inclusive: Option<::Value> = None; + let mut upper_inclusive: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "LowerInclusive" => { + lower_inclusive = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UpperInclusive" => { + upper_inclusive = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(NumberFilter { + lower_inclusive: lower_inclusive, + upper_inclusive: upper_inclusive, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::InspectorV2::Filter.PackageFilter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-packagefilter.html) property type. + #[derive(Debug, Default)] + pub struct PackageFilter { + /// Property [`Architecture`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-packagefilter.html#cfn-inspectorv2-filter-packagefilter-architecture). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub architecture: Option<::Value>, + /// Property [`Epoch`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-packagefilter.html#cfn-inspectorv2-filter-packagefilter-epoch). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub epoch: Option<::Value>, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-packagefilter.html#cfn-inspectorv2-filter-packagefilter-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: Option<::Value>, + /// Property [`Release`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-packagefilter.html#cfn-inspectorv2-filter-packagefilter-release). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub release: Option<::Value>, + /// Property [`SourceLayerHash`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-packagefilter.html#cfn-inspectorv2-filter-packagefilter-sourcelayerhash). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub source_layer_hash: Option<::Value>, + /// Property [`Version`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-packagefilter.html#cfn-inspectorv2-filter-packagefilter-version). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub version: Option<::Value>, + } + + impl ::codec::SerializeValue for PackageFilter { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref architecture) = self.architecture { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Architecture", architecture)?; + } + if let Some(ref epoch) = self.epoch { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Epoch", epoch)?; + } + if let Some(ref name) = self.name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; + } + if let Some(ref release) = self.release { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Release", release)?; + } + if let Some(ref source_layer_hash) = self.source_layer_hash { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourceLayerHash", source_layer_hash)?; + } + if let Some(ref version) = self.version { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Version", version)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for PackageFilter { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = PackageFilter; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type PackageFilter") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut architecture: Option<::Value> = None; + let mut epoch: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut release: Option<::Value> = None; + let mut source_layer_hash: Option<::Value> = None; + let mut version: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Architecture" => { + architecture = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Epoch" => { + epoch = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Release" => { + release = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SourceLayerHash" => { + source_layer_hash = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Version" => { + version = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(PackageFilter { + architecture: architecture, + epoch: epoch, + name: name, + release: release, + source_layer_hash: source_layer_hash, + version: version, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::InspectorV2::Filter.PortRangeFilter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-portrangefilter.html) property type. + #[derive(Debug, Default)] + pub struct PortRangeFilter { + /// Property [`BeginInclusive`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-portrangefilter.html#cfn-inspectorv2-filter-portrangefilter-begininclusive). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub begin_inclusive: Option<::Value>, + /// Property [`EndInclusive`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-portrangefilter.html#cfn-inspectorv2-filter-portrangefilter-endinclusive). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub end_inclusive: Option<::Value>, + } + + impl ::codec::SerializeValue for PortRangeFilter { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref begin_inclusive) = self.begin_inclusive { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BeginInclusive", begin_inclusive)?; + } + if let Some(ref end_inclusive) = self.end_inclusive { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EndInclusive", end_inclusive)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for PortRangeFilter { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = PortRangeFilter; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type PortRangeFilter") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut begin_inclusive: Option<::Value> = None; + let mut end_inclusive: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "BeginInclusive" => { + begin_inclusive = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EndInclusive" => { + end_inclusive = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(PortRangeFilter { + begin_inclusive: begin_inclusive, + end_inclusive: end_inclusive, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::InspectorV2::Filter.StringFilter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-stringfilter.html) property type. + #[derive(Debug, Default)] + pub struct StringFilter { + /// Property [`Comparison`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-stringfilter.html#cfn-inspectorv2-filter-stringfilter-comparison). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub comparison: ::Value, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-inspectorv2-filter-stringfilter.html#cfn-inspectorv2-filter-stringfilter-value). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub value: ::Value, + } + + impl ::codec::SerializeValue for StringFilter { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Comparison", &self.comparison)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", &self.value)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for StringFilter { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = StringFilter; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type StringFilter") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut comparison: Option<::Value> = None; + let mut value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Comparison" => { + comparison = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(StringFilter { + comparison: comparison.ok_or(::serde::de::Error::missing_field("Comparison"))?, + value: value.ok_or(::serde::de::Error::missing_field("Value"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} diff --git a/src/aws/iot.rs b/src/aws/iot.rs index 0523dff..aa71359 100644 --- a/src/aws/iot.rs +++ b/src/aws/iot.rs @@ -130,6 +130,11 @@ pub struct AuthorizerProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub authorizer_name: Option<::Value>, + /// Property [`EnableCachingForHttp`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-authorizer.html#cfn-iot-authorizer-enablecachingforhttp). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enable_caching_for_http: Option<::Value>, /// Property [`SigningDisabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-authorizer.html#cfn-iot-authorizer-signingdisabled). /// /// Update type: _Immutable_. @@ -164,6 +169,9 @@ impl ::serde::Serialize for AuthorizerProperties { if let Some(ref authorizer_name) = self.authorizer_name { ::serde::ser::SerializeMap::serialize_entry(&mut map, "AuthorizerName", authorizer_name)?; } + if let Some(ref enable_caching_for_http) = self.enable_caching_for_http { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EnableCachingForHttp", enable_caching_for_http)?; + } if let Some(ref signing_disabled) = self.signing_disabled { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SigningDisabled", signing_disabled)?; } @@ -197,6 +205,7 @@ impl<'de> ::serde::Deserialize<'de> for AuthorizerProperties { fn visit_map>(self, mut map: A) -> Result { let mut authorizer_function_arn: Option<::Value> = None; let mut authorizer_name: Option<::Value> = None; + let mut enable_caching_for_http: Option<::Value> = None; let mut signing_disabled: Option<::Value> = None; let mut status: Option<::Value> = None; let mut tags: Option<::ValueList<::Tag>> = None; @@ -211,6 +220,9 @@ impl<'de> ::serde::Deserialize<'de> for AuthorizerProperties { "AuthorizerName" => { authorizer_name = ::serde::de::MapAccess::next_value(&mut map)?; } + "EnableCachingForHttp" => { + enable_caching_for_http = ::serde::de::MapAccess::next_value(&mut map)?; + } "SigningDisabled" => { signing_disabled = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -233,6 +245,7 @@ impl<'de> ::serde::Deserialize<'de> for AuthorizerProperties { Ok(AuthorizerProperties { authorizer_function_arn: authorizer_function_arn.ok_or(::serde::de::Error::missing_field("AuthorizerFunctionArn"))?, authorizer_name: authorizer_name, + enable_caching_for_http: enable_caching_for_http, signing_disabled: signing_disabled, status: status, tags: tags, @@ -790,6 +803,501 @@ impl From for DomainConfiguration { } } +/// The [`AWS::IoT::FleetMetric`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-fleetmetric.html) resource type. +#[derive(Debug, Default)] +pub struct FleetMetric { + properties: FleetMetricProperties +} + +/// Properties for the `FleetMetric` resource. +#[derive(Debug, Default)] +pub struct FleetMetricProperties { + /// Property [`AggregationField`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-fleetmetric.html#cfn-iot-fleetmetric-aggregationfield). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub aggregation_field: Option<::Value>, + /// Property [`AggregationType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-fleetmetric.html#cfn-iot-fleetmetric-aggregationtype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub aggregation_type: Option<::Value>, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-fleetmetric.html#cfn-iot-fleetmetric-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`IndexName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-fleetmetric.html#cfn-iot-fleetmetric-indexname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub index_name: Option<::Value>, + /// Property [`MetricName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-fleetmetric.html#cfn-iot-fleetmetric-metricname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub metric_name: ::Value, + /// Property [`Period`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-fleetmetric.html#cfn-iot-fleetmetric-period). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub period: Option<::Value>, + /// Property [`QueryString`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-fleetmetric.html#cfn-iot-fleetmetric-querystring). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub query_string: Option<::Value>, + /// Property [`QueryVersion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-fleetmetric.html#cfn-iot-fleetmetric-queryversion). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub query_version: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-fleetmetric.html#cfn-iot-fleetmetric-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`Unit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-fleetmetric.html#cfn-iot-fleetmetric-unit). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub unit: Option<::Value>, +} + +impl ::serde::Serialize for FleetMetricProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref aggregation_field) = self.aggregation_field { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AggregationField", aggregation_field)?; + } + if let Some(ref aggregation_type) = self.aggregation_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AggregationType", aggregation_type)?; + } + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + if let Some(ref index_name) = self.index_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IndexName", index_name)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MetricName", &self.metric_name)?; + if let Some(ref period) = self.period { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Period", period)?; + } + if let Some(ref query_string) = self.query_string { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "QueryString", query_string)?; + } + if let Some(ref query_version) = self.query_version { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "QueryVersion", query_version)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + if let Some(ref unit) = self.unit { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Unit", unit)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for FleetMetricProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = FleetMetricProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type FleetMetricProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut aggregation_field: Option<::Value> = None; + let mut aggregation_type: Option<::Value> = None; + let mut description: Option<::Value> = None; + let mut index_name: Option<::Value> = None; + let mut metric_name: Option<::Value> = None; + let mut period: Option<::Value> = None; + let mut query_string: Option<::Value> = None; + let mut query_version: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut unit: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AggregationField" => { + aggregation_field = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AggregationType" => { + aggregation_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IndexName" => { + index_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MetricName" => { + metric_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Period" => { + period = ::serde::de::MapAccess::next_value(&mut map)?; + } + "QueryString" => { + query_string = ::serde::de::MapAccess::next_value(&mut map)?; + } + "QueryVersion" => { + query_version = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Unit" => { + unit = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(FleetMetricProperties { + aggregation_field: aggregation_field, + aggregation_type: aggregation_type, + description: description, + index_name: index_name, + metric_name: metric_name.ok_or(::serde::de::Error::missing_field("MetricName"))?, + period: period, + query_string: query_string, + query_version: query_version, + tags: tags, + unit: unit, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for FleetMetric { + type Properties = FleetMetricProperties; + const TYPE: &'static str = "AWS::IoT::FleetMetric"; + fn properties(&self) -> &FleetMetricProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut FleetMetricProperties { + &mut self.properties + } +} + +impl ::private::Sealed for FleetMetric {} + +impl From for FleetMetric { + fn from(properties: FleetMetricProperties) -> FleetMetric { + FleetMetric { properties } + } +} + +/// The [`AWS::IoT::JobTemplate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html) resource type. +#[derive(Debug, Default)] +pub struct JobTemplate { + properties: JobTemplateProperties +} + +/// Properties for the `JobTemplate` resource. +#[derive(Debug, Default)] +pub struct JobTemplateProperties { + /// Property [`AbortConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html#cfn-iot-jobtemplate-abortconfig). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub abort_config: Option<::Value<::json::Value>>, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html#cfn-iot-jobtemplate-description). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub description: ::Value, + /// Property [`Document`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html#cfn-iot-jobtemplate-document). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub document: Option<::Value>, + /// Property [`DocumentSource`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html#cfn-iot-jobtemplate-documentsource). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub document_source: Option<::Value>, + /// Property [`JobArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html#cfn-iot-jobtemplate-jobarn). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub job_arn: Option<::Value>, + /// Property [`JobExecutionsRetryConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html#cfn-iot-jobtemplate-jobexecutionsretryconfig). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub job_executions_retry_config: Option<::Value<::json::Value>>, + /// Property [`JobExecutionsRolloutConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html#cfn-iot-jobtemplate-jobexecutionsrolloutconfig). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub job_executions_rollout_config: Option<::Value<::json::Value>>, + /// Property [`JobTemplateId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html#cfn-iot-jobtemplate-jobtemplateid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub job_template_id: ::Value, + /// Property [`PresignedUrlConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html#cfn-iot-jobtemplate-presignedurlconfig). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub presigned_url_config: Option<::Value<::json::Value>>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html#cfn-iot-jobtemplate-tags). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`TimeoutConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-jobtemplate.html#cfn-iot-jobtemplate-timeoutconfig). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub timeout_config: Option<::Value<::json::Value>>, +} + +impl ::serde::Serialize for JobTemplateProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref abort_config) = self.abort_config { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AbortConfig", abort_config)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", &self.description)?; + if let Some(ref document) = self.document { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Document", document)?; + } + if let Some(ref document_source) = self.document_source { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentSource", document_source)?; + } + if let Some(ref job_arn) = self.job_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "JobArn", job_arn)?; + } + if let Some(ref job_executions_retry_config) = self.job_executions_retry_config { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "JobExecutionsRetryConfig", job_executions_retry_config)?; + } + if let Some(ref job_executions_rollout_config) = self.job_executions_rollout_config { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "JobExecutionsRolloutConfig", job_executions_rollout_config)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "JobTemplateId", &self.job_template_id)?; + if let Some(ref presigned_url_config) = self.presigned_url_config { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PresignedUrlConfig", presigned_url_config)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + if let Some(ref timeout_config) = self.timeout_config { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TimeoutConfig", timeout_config)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for JobTemplateProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = JobTemplateProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type JobTemplateProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut abort_config: Option<::Value<::json::Value>> = None; + let mut description: Option<::Value> = None; + let mut document: Option<::Value> = None; + let mut document_source: Option<::Value> = None; + let mut job_arn: Option<::Value> = None; + let mut job_executions_retry_config: Option<::Value<::json::Value>> = None; + let mut job_executions_rollout_config: Option<::Value<::json::Value>> = None; + let mut job_template_id: Option<::Value> = None; + let mut presigned_url_config: Option<::Value<::json::Value>> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut timeout_config: Option<::Value<::json::Value>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AbortConfig" => { + abort_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Document" => { + document = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DocumentSource" => { + document_source = ::serde::de::MapAccess::next_value(&mut map)?; + } + "JobArn" => { + job_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "JobExecutionsRetryConfig" => { + job_executions_retry_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + "JobExecutionsRolloutConfig" => { + job_executions_rollout_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + "JobTemplateId" => { + job_template_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PresignedUrlConfig" => { + presigned_url_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TimeoutConfig" => { + timeout_config = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(JobTemplateProperties { + abort_config: abort_config, + description: description.ok_or(::serde::de::Error::missing_field("Description"))?, + document: document, + document_source: document_source, + job_arn: job_arn, + job_executions_retry_config: job_executions_retry_config, + job_executions_rollout_config: job_executions_rollout_config, + job_template_id: job_template_id.ok_or(::serde::de::Error::missing_field("JobTemplateId"))?, + presigned_url_config: presigned_url_config, + tags: tags, + timeout_config: timeout_config, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for JobTemplate { + type Properties = JobTemplateProperties; + const TYPE: &'static str = "AWS::IoT::JobTemplate"; + fn properties(&self) -> &JobTemplateProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut JobTemplateProperties { + &mut self.properties + } +} + +impl ::private::Sealed for JobTemplate {} + +impl From for JobTemplate { + fn from(properties: JobTemplateProperties) -> JobTemplate { + JobTemplate { properties } + } +} + +/// The [`AWS::IoT::Logging`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-logging.html) resource type. +#[derive(Debug, Default)] +pub struct Logging { + properties: LoggingProperties +} + +/// Properties for the `Logging` resource. +#[derive(Debug, Default)] +pub struct LoggingProperties { + /// Property [`AccountId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-logging.html#cfn-iot-logging-accountid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub account_id: ::Value, + /// Property [`DefaultLogLevel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-logging.html#cfn-iot-logging-defaultloglevel). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub default_log_level: ::Value, + /// Property [`RoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-logging.html#cfn-iot-logging-rolearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub role_arn: ::Value, +} + +impl ::serde::Serialize for LoggingProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AccountId", &self.account_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DefaultLogLevel", &self.default_log_level)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RoleArn", &self.role_arn)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for LoggingProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = LoggingProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type LoggingProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut account_id: Option<::Value> = None; + let mut default_log_level: Option<::Value> = None; + let mut role_arn: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AccountId" => { + account_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DefaultLogLevel" => { + default_log_level = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RoleArn" => { + role_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(LoggingProperties { + account_id: account_id.ok_or(::serde::de::Error::missing_field("AccountId"))?, + default_log_level: default_log_level.ok_or(::serde::de::Error::missing_field("DefaultLogLevel"))?, + role_arn: role_arn.ok_or(::serde::de::Error::missing_field("RoleArn"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for Logging { + type Properties = LoggingProperties; + const TYPE: &'static str = "AWS::IoT::Logging"; + fn properties(&self) -> &LoggingProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut LoggingProperties { + &mut self.properties + } +} + +impl ::private::Sealed for Logging {} + +impl From for Logging { + fn from(properties: LoggingProperties) -> Logging { + Logging { properties } + } +} + /// The [`AWS::IoT::MitigationAction`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-mitigationaction.html) resource type. #[derive(Debug, Default)] pub struct MitigationAction { @@ -1231,6 +1739,104 @@ impl From for ProvisioningTemplate { } } +/// The [`AWS::IoT::ResourceSpecificLogging`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-resourcespecificlogging.html) resource type. +#[derive(Debug, Default)] +pub struct ResourceSpecificLogging { + properties: ResourceSpecificLoggingProperties +} + +/// Properties for the `ResourceSpecificLogging` resource. +#[derive(Debug, Default)] +pub struct ResourceSpecificLoggingProperties { + /// Property [`LogLevel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-resourcespecificlogging.html#cfn-iot-resourcespecificlogging-loglevel). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub log_level: ::Value, + /// Property [`TargetName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-resourcespecificlogging.html#cfn-iot-resourcespecificlogging-targetname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub target_name: ::Value, + /// Property [`TargetType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-resourcespecificlogging.html#cfn-iot-resourcespecificlogging-targettype). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub target_type: ::Value, +} + +impl ::serde::Serialize for ResourceSpecificLoggingProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogLevel", &self.log_level)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetName", &self.target_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetType", &self.target_type)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for ResourceSpecificLoggingProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ResourceSpecificLoggingProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ResourceSpecificLoggingProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut log_level: Option<::Value> = None; + let mut target_name: Option<::Value> = None; + let mut target_type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "LogLevel" => { + log_level = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TargetName" => { + target_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TargetType" => { + target_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ResourceSpecificLoggingProperties { + log_level: log_level.ok_or(::serde::de::Error::missing_field("LogLevel"))?, + target_name: target_name.ok_or(::serde::de::Error::missing_field("TargetName"))?, + target_type: target_type.ok_or(::serde::de::Error::missing_field("TargetType"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for ResourceSpecificLogging { + type Properties = ResourceSpecificLoggingProperties; + const TYPE: &'static str = "AWS::IoT::ResourceSpecificLogging"; + fn properties(&self) -> &ResourceSpecificLoggingProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut ResourceSpecificLoggingProperties { + &mut self.properties + } +} + +impl ::private::Sealed for ResourceSpecificLogging {} + +impl From for ResourceSpecificLogging { + fn from(properties: ResourceSpecificLoggingProperties) -> ResourceSpecificLogging { + ResourceSpecificLogging { properties } + } +} + /// The [`AWS::IoT::ScheduledAudit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iot-scheduledaudit.html) resource type. #[derive(Debug, Default)] pub struct ScheduledAudit { @@ -2470,6 +3076,72 @@ pub mod domain_configuration { } } +pub mod fleet_metric { + //! Property types for the `FleetMetric` resource. + + /// The [`AWS::IoT::FleetMetric.AggregationType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-fleetmetric-aggregationtype.html) property type. + #[derive(Debug, Default)] + pub struct AggregationType { + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-fleetmetric-aggregationtype.html#cfn-iot-fleetmetric-aggregationtype-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: ::Value, + /// Property [`Values`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-fleetmetric-aggregationtype.html#cfn-iot-fleetmetric-aggregationtype-values). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub values: ::ValueList, + } + + impl ::codec::SerializeValue for AggregationType { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Values", &self.values)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AggregationType { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AggregationType; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AggregationType") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut name: Option<::Value> = None; + let mut values: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Values" => { + values = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AggregationType { + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + values: values.ok_or(::serde::de::Error::missing_field("Values"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + pub mod mitigation_action { //! Property types for the `MitigationAction` resource. @@ -3777,6 +4449,11 @@ pub mod topic_rule { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub lambda: Option<::Value>, + /// Property [`OpenSearch`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-opensearch). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub open_search: Option<::Value>, /// Property [`Republish`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-action.html#cfn-iot-topicrule-action-republish). /// /// Update type: _Mutable_. @@ -3854,6 +4531,9 @@ pub mod topic_rule { if let Some(ref lambda) = self.lambda { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Lambda", lambda)?; } + if let Some(ref open_search) = self.open_search { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OpenSearch", open_search)?; + } if let Some(ref republish) = self.republish { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Republish", republish)?; } @@ -3902,6 +4582,7 @@ pub mod topic_rule { let mut kafka: Option<::Value> = None; let mut kinesis: Option<::Value> = None; let mut lambda: Option<::Value> = None; + let mut open_search: Option<::Value> = None; let mut republish: Option<::Value> = None; let mut s3: Option<::Value> = None; let mut sns: Option<::Value> = None; @@ -3953,6 +4634,9 @@ pub mod topic_rule { "Lambda" => { lambda = ::serde::de::MapAccess::next_value(&mut map)?; } + "OpenSearch" => { + open_search = ::serde::de::MapAccess::next_value(&mut map)?; + } "Republish" => { republish = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -3990,6 +4674,7 @@ pub mod topic_rule { kafka: kafka, kinesis: kinesis, lambda: lambda, + open_search: open_search, republish: republish, s3: s3, sns: sns, @@ -5544,6 +6229,101 @@ pub mod topic_rule { } } + /// The [`AWS::IoT::TopicRule.OpenSearchAction`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-opensearchaction.html) property type. + #[derive(Debug, Default)] + pub struct OpenSearchAction { + /// Property [`Endpoint`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-opensearchaction.html#cfn-iot-topicrule-opensearchaction-endpoint). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub endpoint: ::Value, + /// Property [`Id`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-opensearchaction.html#cfn-iot-topicrule-opensearchaction-id). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub id: ::Value, + /// Property [`Index`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-opensearchaction.html#cfn-iot-topicrule-opensearchaction-index). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub index: ::Value, + /// Property [`RoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-opensearchaction.html#cfn-iot-topicrule-opensearchaction-rolearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub role_arn: ::Value, + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-opensearchaction.html#cfn-iot-topicrule-opensearchaction-type). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#type: ::Value, + } + + impl ::codec::SerializeValue for OpenSearchAction { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Endpoint", &self.endpoint)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Id", &self.id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Index", &self.index)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RoleArn", &self.role_arn)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for OpenSearchAction { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = OpenSearchAction; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type OpenSearchAction") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut endpoint: Option<::Value> = None; + let mut id: Option<::Value> = None; + let mut index: Option<::Value> = None; + let mut role_arn: Option<::Value> = None; + let mut r#type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Endpoint" => { + endpoint = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Id" => { + id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Index" => { + index = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RoleArn" => { + role_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(OpenSearchAction { + endpoint: endpoint.ok_or(::serde::de::Error::missing_field("Endpoint"))?, + id: id.ok_or(::serde::de::Error::missing_field("Id"))?, + index: index.ok_or(::serde::de::Error::missing_field("Index"))?, + role_arn: role_arn.ok_or(::serde::de::Error::missing_field("RoleArn"))?, + r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::IoT::TopicRule.PutAssetPropertyValueEntry`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iot-topicrule-putassetpropertyvalueentry.html) property type. #[derive(Debug, Default)] pub struct PutAssetPropertyValueEntry { diff --git a/src/aws/iotanalytics.rs b/src/aws/iotanalytics.rs index b0ab6b3..325a388 100644 --- a/src/aws/iotanalytics.rs +++ b/src/aws/iotanalytics.rs @@ -1068,22 +1068,20 @@ pub mod dataset { } } - /// The [`AWS::IoTAnalytics::Dataset.DatasetContentVersionValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-variable-datasetcontentversionvalue.html) property type. + /// The [`AWS::IoTAnalytics::Dataset.DatasetContentVersionValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-datasetcontentversionvalue.html) property type. #[derive(Debug, Default)] pub struct DatasetContentVersionValue { - /// Property [`DatasetName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-variable-datasetcontentversionvalue.html#cfn-iotanalytics-dataset-variable-datasetcontentversionvalue-datasetname). + /// Property [`DatasetName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-datasetcontentversionvalue.html#cfn-iotanalytics-dataset-datasetcontentversionvalue-datasetname). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub dataset_name: Option<::Value>, + pub dataset_name: ::Value, } impl ::codec::SerializeValue for DatasetContentVersionValue { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref dataset_name) = self.dataset_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatasetName", dataset_name)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatasetName", &self.dataset_name)?; ::serde::ser::SerializeMap::end(map) } } @@ -1112,7 +1110,7 @@ pub mod dataset { } Ok(DatasetContentVersionValue { - dataset_name: dataset_name, + dataset_name: dataset_name.ok_or(::serde::de::Error::missing_field("DatasetName"))?, }) } } @@ -1528,22 +1526,20 @@ pub mod dataset { } } - /// The [`AWS::IoTAnalytics::Dataset.OutputFileUriValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-variable-outputfileurivalue.html) property type. + /// The [`AWS::IoTAnalytics::Dataset.OutputFileUriValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-outputfileurivalue.html) property type. #[derive(Debug, Default)] pub struct OutputFileUriValue { - /// Property [`FileName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-variable-outputfileurivalue.html#cfn-iotanalytics-dataset-variable-outputfileurivalue-filename). + /// Property [`FileName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-outputfileurivalue.html#cfn-iotanalytics-dataset-outputfileurivalue-filename). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub file_name: Option<::Value>, + pub file_name: ::Value, } impl ::codec::SerializeValue for OutputFileUriValue { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref file_name) = self.file_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "FileName", file_name)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FileName", &self.file_name)?; ::serde::ser::SerializeMap::end(map) } } @@ -1572,7 +1568,7 @@ pub mod dataset { } Ok(OutputFileUriValue { - file_name: file_name, + file_name: file_name.ok_or(::serde::de::Error::missing_field("FileName"))?, }) } } @@ -1714,19 +1710,23 @@ pub mod dataset { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub number_of_days: ::Value, + pub number_of_days: Option<::Value>, /// Property [`Unlimited`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-retentionperiod.html#cfn-iotanalytics-dataset-retentionperiod-unlimited). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub unlimited: ::Value, + pub unlimited: Option<::Value>, } impl ::codec::SerializeValue for RetentionPeriod { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "NumberOfDays", &self.number_of_days)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Unlimited", &self.unlimited)?; + if let Some(ref number_of_days) = self.number_of_days { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NumberOfDays", number_of_days)?; + } + if let Some(ref unlimited) = self.unlimited { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Unlimited", unlimited)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -1759,8 +1759,8 @@ pub mod dataset { } Ok(RetentionPeriod { - number_of_days: number_of_days.ok_or(::serde::de::Error::missing_field("NumberOfDays"))?, - unlimited: unlimited.ok_or(::serde::de::Error::missing_field("Unlimited"))?, + number_of_days: number_of_days, + unlimited: unlimited, }) } } @@ -1855,10 +1855,10 @@ pub mod dataset { } } - /// The [`AWS::IoTAnalytics::Dataset.Schedule`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-trigger-schedule.html) property type. + /// The [`AWS::IoTAnalytics::Dataset.Schedule`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-schedule.html) property type. #[derive(Debug, Default)] pub struct Schedule { - /// Property [`ScheduleExpression`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-trigger-schedule.html#cfn-iotanalytics-dataset-trigger-schedule-scheduleexpression). + /// Property [`ScheduleExpression`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-dataset-schedule.html#cfn-iotanalytics-dataset-schedule-scheduleexpression). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. @@ -2333,6 +2333,70 @@ pub mod datastore { } } + /// The [`AWS::IoTAnalytics::Datastore.CustomerManagedS3Storage`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-customermanageds3storage.html) property type. + #[derive(Debug, Default)] + pub struct CustomerManagedS3Storage { + /// Property [`Bucket`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-customermanageds3storage.html#cfn-iotanalytics-datastore-customermanageds3storage-bucket). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub bucket: ::Value, + /// Property [`KeyPrefix`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-customermanageds3storage.html#cfn-iotanalytics-datastore-customermanageds3storage-keyprefix). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub key_prefix: Option<::Value>, + } + + impl ::codec::SerializeValue for CustomerManagedS3Storage { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Bucket", &self.bucket)?; + if let Some(ref key_prefix) = self.key_prefix { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "KeyPrefix", key_prefix)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CustomerManagedS3Storage { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CustomerManagedS3Storage; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CustomerManagedS3Storage") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut bucket: Option<::Value> = None; + let mut key_prefix: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Bucket" => { + bucket = ::serde::de::MapAccess::next_value(&mut map)?; + } + "KeyPrefix" => { + key_prefix = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CustomerManagedS3Storage { + bucket: bucket.ok_or(::serde::de::Error::missing_field("Bucket"))?, + key_prefix: key_prefix, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::IoTAnalytics::Datastore.DatastorePartition`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-datastorepartition.html) property type. #[derive(Debug, Default)] pub struct DatastorePartition { @@ -2460,6 +2524,11 @@ pub mod datastore { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub customer_managed_s3: Option<::Value>, + /// Property [`IotSiteWiseMultiLayerStorage`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-datastorestorage.html#cfn-iotanalytics-datastore-datastorestorage-iotsitewisemultilayerstorage). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub iot_site_wise_multi_layer_storage: Option<::Value>, /// Property [`ServiceManagedS3`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-datastorestorage.html#cfn-iotanalytics-datastore-datastorestorage-servicemanageds3). /// /// Update type: _Mutable_. @@ -2473,6 +2542,9 @@ pub mod datastore { if let Some(ref customer_managed_s3) = self.customer_managed_s3 { ::serde::ser::SerializeMap::serialize_entry(&mut map, "CustomerManagedS3", customer_managed_s3)?; } + if let Some(ref iot_site_wise_multi_layer_storage) = self.iot_site_wise_multi_layer_storage { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IotSiteWiseMultiLayerStorage", iot_site_wise_multi_layer_storage)?; + } if let Some(ref service_managed_s3) = self.service_managed_s3 { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServiceManagedS3", service_managed_s3)?; } @@ -2493,6 +2565,7 @@ pub mod datastore { fn visit_map>(self, mut map: A) -> Result { let mut customer_managed_s3: Option<::Value> = None; + let mut iot_site_wise_multi_layer_storage: Option<::Value> = None; let mut service_managed_s3: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { @@ -2500,6 +2573,9 @@ pub mod datastore { "CustomerManagedS3" => { customer_managed_s3 = ::serde::de::MapAccess::next_value(&mut map)?; } + "IotSiteWiseMultiLayerStorage" => { + iot_site_wise_multi_layer_storage = ::serde::de::MapAccess::next_value(&mut map)?; + } "ServiceManagedS3" => { service_managed_s3 = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -2509,6 +2585,7 @@ pub mod datastore { Ok(DatastoreStorage { customer_managed_s3: customer_managed_s3, + iot_site_wise_multi_layer_storage: iot_site_wise_multi_layer_storage, service_managed_s3: service_managed_s3, }) } @@ -2584,6 +2661,59 @@ pub mod datastore { } } + /// The [`AWS::IoTAnalytics::Datastore.IotSiteWiseMultiLayerStorage`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-iotsitewisemultilayerstorage.html) property type. + #[derive(Debug, Default)] + pub struct IotSiteWiseMultiLayerStorage { + /// Property [`CustomerManagedS3Storage`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-iotsitewisemultilayerstorage.html#cfn-iotanalytics-datastore-iotsitewisemultilayerstorage-customermanageds3storage). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub customer_managed_s3_storage: Option<::Value>, + } + + impl ::codec::SerializeValue for IotSiteWiseMultiLayerStorage { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref customer_managed_s3_storage) = self.customer_managed_s3_storage { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CustomerManagedS3Storage", customer_managed_s3_storage)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for IotSiteWiseMultiLayerStorage { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = IotSiteWiseMultiLayerStorage; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type IotSiteWiseMultiLayerStorage") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut customer_managed_s3_storage: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CustomerManagedS3Storage" => { + customer_managed_s3_storage = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(IotSiteWiseMultiLayerStorage { + customer_managed_s3_storage: customer_managed_s3_storage, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::IoTAnalytics::Datastore.JsonConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-datastore-jsonconfiguration.html) property type. #[derive(Debug, Default)] pub struct JsonConfiguration { @@ -3116,12 +3246,12 @@ pub mod pipeline { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub attributes: Option<::Value<::json::Value>>, + pub attributes: ::ValueMap, /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-addattributes.html#cfn-iotanalytics-pipeline-addattributes-name). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub name: Option<::Value>, + pub name: ::Value, /// Property [`Next`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-addattributes.html#cfn-iotanalytics-pipeline-addattributes-next). /// /// Update type: _Mutable_. @@ -3132,12 +3262,8 @@ pub mod pipeline { impl ::codec::SerializeValue for AddAttributes { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref attributes) = self.attributes { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Attributes", attributes)?; - } - if let Some(ref name) = self.name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Attributes", &self.attributes)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; if let Some(ref next) = self.next { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Next", next)?; } @@ -3157,7 +3283,7 @@ pub mod pipeline { } fn visit_map>(self, mut map: A) -> Result { - let mut attributes: Option<::Value<::json::Value>> = None; + let mut attributes: Option<::ValueMap> = None; let mut name: Option<::Value> = None; let mut next: Option<::Value> = None; @@ -3177,8 +3303,8 @@ pub mod pipeline { } Ok(AddAttributes { - attributes: attributes, - name: name, + attributes: attributes.ok_or(::serde::de::Error::missing_field("Attributes"))?, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, next: next, }) } @@ -3195,12 +3321,12 @@ pub mod pipeline { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub channel_name: Option<::Value>, + pub channel_name: ::Value, /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-channel.html#cfn-iotanalytics-pipeline-channel-name). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub name: Option<::Value>, + pub name: ::Value, /// Property [`Next`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-channel.html#cfn-iotanalytics-pipeline-channel-next). /// /// Update type: _Mutable_. @@ -3211,12 +3337,8 @@ pub mod pipeline { impl ::codec::SerializeValue for Channel { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref channel_name) = self.channel_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ChannelName", channel_name)?; - } - if let Some(ref name) = self.name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ChannelName", &self.channel_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; if let Some(ref next) = self.next { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Next", next)?; } @@ -3256,8 +3378,8 @@ pub mod pipeline { } Ok(Channel { - channel_name: channel_name, - name: name, + channel_name: channel_name.ok_or(::serde::de::Error::missing_field("ChannelName"))?, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, next: next, }) } @@ -3274,23 +3396,19 @@ pub mod pipeline { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub datastore_name: Option<::Value>, + pub datastore_name: ::Value, /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-datastore.html#cfn-iotanalytics-pipeline-datastore-name). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub name: Option<::Value>, + pub name: ::Value, } impl ::codec::SerializeValue for Datastore { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref datastore_name) = self.datastore_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatastoreName", datastore_name)?; - } - if let Some(ref name) = self.name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatastoreName", &self.datastore_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; ::serde::ser::SerializeMap::end(map) } } @@ -3323,8 +3441,8 @@ pub mod pipeline { } Ok(Datastore { - datastore_name: datastore_name, - name: name, + datastore_name: datastore_name.ok_or(::serde::de::Error::missing_field("DatastoreName"))?, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, }) } } @@ -3340,12 +3458,12 @@ pub mod pipeline { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub attribute: Option<::Value>, + pub attribute: ::Value, /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-deviceregistryenrich.html#cfn-iotanalytics-pipeline-deviceregistryenrich-name). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub name: Option<::Value>, + pub name: ::Value, /// Property [`Next`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-deviceregistryenrich.html#cfn-iotanalytics-pipeline-deviceregistryenrich-next). /// /// Update type: _Mutable_. @@ -3355,32 +3473,24 @@ pub mod pipeline { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub role_arn: Option<::Value>, + pub role_arn: ::Value, /// Property [`ThingName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-deviceregistryenrich.html#cfn-iotanalytics-pipeline-deviceregistryenrich-thingname). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub thing_name: Option<::Value>, + pub thing_name: ::Value, } impl ::codec::SerializeValue for DeviceRegistryEnrich { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref attribute) = self.attribute { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Attribute", attribute)?; - } - if let Some(ref name) = self.name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Attribute", &self.attribute)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; if let Some(ref next) = self.next { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Next", next)?; } - if let Some(ref role_arn) = self.role_arn { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "RoleArn", role_arn)?; - } - if let Some(ref thing_name) = self.thing_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ThingName", thing_name)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RoleArn", &self.role_arn)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ThingName", &self.thing_name)?; ::serde::ser::SerializeMap::end(map) } } @@ -3425,11 +3535,11 @@ pub mod pipeline { } Ok(DeviceRegistryEnrich { - attribute: attribute, - name: name, + attribute: attribute.ok_or(::serde::de::Error::missing_field("Attribute"))?, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, next: next, - role_arn: role_arn, - thing_name: thing_name, + role_arn: role_arn.ok_or(::serde::de::Error::missing_field("RoleArn"))?, + thing_name: thing_name.ok_or(::serde::de::Error::missing_field("ThingName"))?, }) } } @@ -3445,12 +3555,12 @@ pub mod pipeline { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub attribute: Option<::Value>, + pub attribute: ::Value, /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-deviceshadowenrich.html#cfn-iotanalytics-pipeline-deviceshadowenrich-name). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub name: Option<::Value>, + pub name: ::Value, /// Property [`Next`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-deviceshadowenrich.html#cfn-iotanalytics-pipeline-deviceshadowenrich-next). /// /// Update type: _Mutable_. @@ -3460,32 +3570,24 @@ pub mod pipeline { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub role_arn: Option<::Value>, + pub role_arn: ::Value, /// Property [`ThingName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-deviceshadowenrich.html#cfn-iotanalytics-pipeline-deviceshadowenrich-thingname). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub thing_name: Option<::Value>, + pub thing_name: ::Value, } impl ::codec::SerializeValue for DeviceShadowEnrich { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref attribute) = self.attribute { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Attribute", attribute)?; - } - if let Some(ref name) = self.name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Attribute", &self.attribute)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; if let Some(ref next) = self.next { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Next", next)?; } - if let Some(ref role_arn) = self.role_arn { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "RoleArn", role_arn)?; - } - if let Some(ref thing_name) = self.thing_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ThingName", thing_name)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RoleArn", &self.role_arn)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ThingName", &self.thing_name)?; ::serde::ser::SerializeMap::end(map) } } @@ -3530,11 +3632,11 @@ pub mod pipeline { } Ok(DeviceShadowEnrich { - attribute: attribute, - name: name, + attribute: attribute.ok_or(::serde::de::Error::missing_field("Attribute"))?, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, next: next, - role_arn: role_arn, - thing_name: thing_name, + role_arn: role_arn.ok_or(::serde::de::Error::missing_field("RoleArn"))?, + thing_name: thing_name.ok_or(::serde::de::Error::missing_field("ThingName"))?, }) } } @@ -3550,12 +3652,12 @@ pub mod pipeline { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub filter: Option<::Value>, + pub filter: ::Value, /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-filter.html#cfn-iotanalytics-pipeline-filter-name). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub name: Option<::Value>, + pub name: ::Value, /// Property [`Next`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-filter.html#cfn-iotanalytics-pipeline-filter-next). /// /// Update type: _Mutable_. @@ -3566,12 +3668,8 @@ pub mod pipeline { impl ::codec::SerializeValue for Filter { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref filter) = self.filter { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Filter", filter)?; - } - if let Some(ref name) = self.name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Filter", &self.filter)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; if let Some(ref next) = self.next { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Next", next)?; } @@ -3611,8 +3709,8 @@ pub mod pipeline { } Ok(Filter { - filter: filter, - name: name, + filter: filter.ok_or(::serde::de::Error::missing_field("Filter"))?, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, next: next, }) } @@ -3629,17 +3727,17 @@ pub mod pipeline { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub batch_size: Option<::Value>, + pub batch_size: ::Value, /// Property [`LambdaName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-lambda.html#cfn-iotanalytics-pipeline-lambda-lambdaname). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub lambda_name: Option<::Value>, + pub lambda_name: ::Value, /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-lambda.html#cfn-iotanalytics-pipeline-lambda-name). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub name: Option<::Value>, + pub name: ::Value, /// Property [`Next`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-lambda.html#cfn-iotanalytics-pipeline-lambda-next). /// /// Update type: _Mutable_. @@ -3650,15 +3748,9 @@ pub mod pipeline { impl ::codec::SerializeValue for Lambda { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref batch_size) = self.batch_size { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "BatchSize", batch_size)?; - } - if let Some(ref lambda_name) = self.lambda_name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "LambdaName", lambda_name)?; - } - if let Some(ref name) = self.name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BatchSize", &self.batch_size)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LambdaName", &self.lambda_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; if let Some(ref next) = self.next { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Next", next)?; } @@ -3702,9 +3794,9 @@ pub mod pipeline { } Ok(Lambda { - batch_size: batch_size, - lambda_name: lambda_name, - name: name, + batch_size: batch_size.ok_or(::serde::de::Error::missing_field("BatchSize"))?, + lambda_name: lambda_name.ok_or(::serde::de::Error::missing_field("LambdaName"))?, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, next: next, }) } @@ -3721,17 +3813,17 @@ pub mod pipeline { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub attribute: Option<::Value>, + pub attribute: ::Value, /// Property [`Math`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-math.html#cfn-iotanalytics-pipeline-math-math). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub math: Option<::Value>, + pub math: ::Value, /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-math.html#cfn-iotanalytics-pipeline-math-name). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub name: Option<::Value>, + pub name: ::Value, /// Property [`Next`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-math.html#cfn-iotanalytics-pipeline-math-next). /// /// Update type: _Mutable_. @@ -3742,15 +3834,9 @@ pub mod pipeline { impl ::codec::SerializeValue for Math { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref attribute) = self.attribute { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Attribute", attribute)?; - } - if let Some(ref math) = self.math { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Math", math)?; - } - if let Some(ref name) = self.name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Attribute", &self.attribute)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Math", &self.math)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; if let Some(ref next) = self.next { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Next", next)?; } @@ -3794,9 +3880,9 @@ pub mod pipeline { } Ok(Math { - attribute: attribute, - math: math, - name: name, + attribute: attribute.ok_or(::serde::de::Error::missing_field("Attribute"))?, + math: math.ok_or(::serde::de::Error::missing_field("Math"))?, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, next: next, }) } @@ -3813,12 +3899,12 @@ pub mod pipeline { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub attributes: Option<::ValueList>, + pub attributes: ::ValueList, /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-removeattributes.html#cfn-iotanalytics-pipeline-removeattributes-name). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub name: Option<::Value>, + pub name: ::Value, /// Property [`Next`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-removeattributes.html#cfn-iotanalytics-pipeline-removeattributes-next). /// /// Update type: _Mutable_. @@ -3829,12 +3915,8 @@ pub mod pipeline { impl ::codec::SerializeValue for RemoveAttributes { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref attributes) = self.attributes { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Attributes", attributes)?; - } - if let Some(ref name) = self.name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Attributes", &self.attributes)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; if let Some(ref next) = self.next { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Next", next)?; } @@ -3874,8 +3956,8 @@ pub mod pipeline { } Ok(RemoveAttributes { - attributes: attributes, - name: name, + attributes: attributes.ok_or(::serde::de::Error::missing_field("Attributes"))?, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, next: next, }) } @@ -3892,12 +3974,12 @@ pub mod pipeline { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub attributes: Option<::ValueList>, + pub attributes: ::ValueList, /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-selectattributes.html#cfn-iotanalytics-pipeline-selectattributes-name). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub name: Option<::Value>, + pub name: ::Value, /// Property [`Next`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotanalytics-pipeline-selectattributes.html#cfn-iotanalytics-pipeline-selectattributes-next). /// /// Update type: _Mutable_. @@ -3908,12 +3990,8 @@ pub mod pipeline { impl ::codec::SerializeValue for SelectAttributes { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref attributes) = self.attributes { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Attributes", attributes)?; - } - if let Some(ref name) = self.name { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; - } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Attributes", &self.attributes)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; if let Some(ref next) = self.next { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Next", next)?; } @@ -3953,8 +4031,8 @@ pub mod pipeline { } Ok(SelectAttributes { - attributes: attributes, - name: name, + attributes: attributes.ok_or(::serde::de::Error::missing_field("Attributes"))?, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, next: next, }) } diff --git a/src/aws/iotevents.rs b/src/aws/iotevents.rs index 2c294ec..440a182 100644 --- a/src/aws/iotevents.rs +++ b/src/aws/iotevents.rs @@ -1,5 +1,183 @@ //! Types for the `IoTEvents` service. +/// The [`AWS::IoTEvents::AlarmModel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-alarmmodel.html) resource type. +#[derive(Debug, Default)] +pub struct AlarmModel { + properties: AlarmModelProperties +} + +/// Properties for the `AlarmModel` resource. +#[derive(Debug, Default)] +pub struct AlarmModelProperties { + /// Property [`AlarmCapabilities`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-alarmmodel.html#cfn-iotevents-alarmmodel-alarmcapabilities). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub alarm_capabilities: Option<::Value>, + /// Property [`AlarmEventActions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-alarmmodel.html#cfn-iotevents-alarmmodel-alarmeventactions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub alarm_event_actions: Option<::Value>, + /// Property [`AlarmModelDescription`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-alarmmodel.html#cfn-iotevents-alarmmodel-alarmmodeldescription). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub alarm_model_description: Option<::Value>, + /// Property [`AlarmModelName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-alarmmodel.html#cfn-iotevents-alarmmodel-alarmmodelname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub alarm_model_name: Option<::Value>, + /// Property [`AlarmRule`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-alarmmodel.html#cfn-iotevents-alarmmodel-alarmrule). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub alarm_rule: ::Value, + /// Property [`Key`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-alarmmodel.html#cfn-iotevents-alarmmodel-key). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub key: Option<::Value>, + /// Property [`RoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-alarmmodel.html#cfn-iotevents-alarmmodel-rolearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub role_arn: ::Value, + /// Property [`Severity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-alarmmodel.html#cfn-iotevents-alarmmodel-severity). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub severity: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-alarmmodel.html#cfn-iotevents-alarmmodel-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, +} + +impl ::serde::Serialize for AlarmModelProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref alarm_capabilities) = self.alarm_capabilities { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AlarmCapabilities", alarm_capabilities)?; + } + if let Some(ref alarm_event_actions) = self.alarm_event_actions { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AlarmEventActions", alarm_event_actions)?; + } + if let Some(ref alarm_model_description) = self.alarm_model_description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AlarmModelDescription", alarm_model_description)?; + } + if let Some(ref alarm_model_name) = self.alarm_model_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AlarmModelName", alarm_model_name)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AlarmRule", &self.alarm_rule)?; + if let Some(ref key) = self.key { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Key", key)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RoleArn", &self.role_arn)?; + if let Some(ref severity) = self.severity { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Severity", severity)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for AlarmModelProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AlarmModelProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AlarmModelProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut alarm_capabilities: Option<::Value> = None; + let mut alarm_event_actions: Option<::Value> = None; + let mut alarm_model_description: Option<::Value> = None; + let mut alarm_model_name: Option<::Value> = None; + let mut alarm_rule: Option<::Value> = None; + let mut key: Option<::Value> = None; + let mut role_arn: Option<::Value> = None; + let mut severity: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AlarmCapabilities" => { + alarm_capabilities = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AlarmEventActions" => { + alarm_event_actions = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AlarmModelDescription" => { + alarm_model_description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AlarmModelName" => { + alarm_model_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AlarmRule" => { + alarm_rule = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Key" => { + key = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RoleArn" => { + role_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Severity" => { + severity = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AlarmModelProperties { + alarm_capabilities: alarm_capabilities, + alarm_event_actions: alarm_event_actions, + alarm_model_description: alarm_model_description, + alarm_model_name: alarm_model_name, + alarm_rule: alarm_rule.ok_or(::serde::de::Error::missing_field("AlarmRule"))?, + key: key, + role_arn: role_arn.ok_or(::serde::de::Error::missing_field("RoleArn"))?, + severity: severity, + tags: tags, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for AlarmModel { + type Properties = AlarmModelProperties; + const TYPE: &'static str = "AWS::IoTEvents::AlarmModel"; + fn properties(&self) -> &AlarmModelProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut AlarmModelProperties { + &mut self.properties + } +} + +impl ::private::Sealed for AlarmModel {} + +impl From for AlarmModel { + fn from(properties: AlarmModelProperties) -> AlarmModel { + AlarmModel { properties } + } +} + /// The [`AWS::IoTEvents::DetectorModel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotevents-detectormodel.html) resource type. #[derive(Debug, Default)] pub struct DetectorModel { @@ -267,6 +445,1552 @@ impl From for Input { } } +pub mod alarm_model { + //! Property types for the `AlarmModel` resource. + + /// The [`AWS::IoTEvents::AlarmModel.AcknowledgeFlow`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-acknowledgeflow.html) property type. + #[derive(Debug, Default)] + pub struct AcknowledgeFlow { + /// Property [`Enabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-acknowledgeflow.html#cfn-iotevents-alarmmodel-acknowledgeflow-enabled). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enabled: Option<::Value>, + } + + impl ::codec::SerializeValue for AcknowledgeFlow { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref enabled) = self.enabled { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Enabled", enabled)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AcknowledgeFlow { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AcknowledgeFlow; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AcknowledgeFlow") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut enabled: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Enabled" => { + enabled = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AcknowledgeFlow { + enabled: enabled, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::IoTEvents::AlarmModel.AlarmAction`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmaction.html) property type. + #[derive(Debug, Default)] + pub struct AlarmAction { + /// Property [`DynamoDB`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmaction.html#cfn-iotevents-alarmmodel-alarmaction-dynamodb). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub dynamo_db: Option<::Value>, + /// Property [`DynamoDBv2`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmaction.html#cfn-iotevents-alarmmodel-alarmaction-dynamodbv2). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub dynamo_d_bv2: Option<::Value>, + /// Property [`Firehose`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmaction.html#cfn-iotevents-alarmmodel-alarmaction-firehose). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub firehose: Option<::Value>, + /// Property [`IotEvents`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmaction.html#cfn-iotevents-alarmmodel-alarmaction-iotevents). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub iot_events: Option<::Value>, + /// Property [`IotSiteWise`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmaction.html#cfn-iotevents-alarmmodel-alarmaction-iotsitewise). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub iot_site_wise: Option<::Value>, + /// Property [`IotTopicPublish`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmaction.html#cfn-iotevents-alarmmodel-alarmaction-iottopicpublish). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub iot_topic_publish: Option<::Value>, + /// Property [`Lambda`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmaction.html#cfn-iotevents-alarmmodel-alarmaction-lambda). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub lambda: Option<::Value>, + /// Property [`Sns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmaction.html#cfn-iotevents-alarmmodel-alarmaction-sns). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub sns: Option<::Value>, + /// Property [`Sqs`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmaction.html#cfn-iotevents-alarmmodel-alarmaction-sqs). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub sqs: Option<::Value>, + } + + impl ::codec::SerializeValue for AlarmAction { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref dynamo_db) = self.dynamo_db { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DynamoDB", dynamo_db)?; + } + if let Some(ref dynamo_d_bv2) = self.dynamo_d_bv2 { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DynamoDBv2", dynamo_d_bv2)?; + } + if let Some(ref firehose) = self.firehose { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Firehose", firehose)?; + } + if let Some(ref iot_events) = self.iot_events { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IotEvents", iot_events)?; + } + if let Some(ref iot_site_wise) = self.iot_site_wise { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IotSiteWise", iot_site_wise)?; + } + if let Some(ref iot_topic_publish) = self.iot_topic_publish { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IotTopicPublish", iot_topic_publish)?; + } + if let Some(ref lambda) = self.lambda { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Lambda", lambda)?; + } + if let Some(ref sns) = self.sns { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Sns", sns)?; + } + if let Some(ref sqs) = self.sqs { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Sqs", sqs)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AlarmAction { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AlarmAction; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AlarmAction") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut dynamo_db: Option<::Value> = None; + let mut dynamo_d_bv2: Option<::Value> = None; + let mut firehose: Option<::Value> = None; + let mut iot_events: Option<::Value> = None; + let mut iot_site_wise: Option<::Value> = None; + let mut iot_topic_publish: Option<::Value> = None; + let mut lambda: Option<::Value> = None; + let mut sns: Option<::Value> = None; + let mut sqs: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DynamoDB" => { + dynamo_db = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DynamoDBv2" => { + dynamo_d_bv2 = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Firehose" => { + firehose = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IotEvents" => { + iot_events = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IotSiteWise" => { + iot_site_wise = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IotTopicPublish" => { + iot_topic_publish = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Lambda" => { + lambda = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Sns" => { + sns = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Sqs" => { + sqs = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AlarmAction { + dynamo_db: dynamo_db, + dynamo_d_bv2: dynamo_d_bv2, + firehose: firehose, + iot_events: iot_events, + iot_site_wise: iot_site_wise, + iot_topic_publish: iot_topic_publish, + lambda: lambda, + sns: sns, + sqs: sqs, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::IoTEvents::AlarmModel.AlarmCapabilities`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmcapabilities.html) property type. + #[derive(Debug, Default)] + pub struct AlarmCapabilities { + /// Property [`AcknowledgeFlow`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmcapabilities.html#cfn-iotevents-alarmmodel-alarmcapabilities-acknowledgeflow). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub acknowledge_flow: Option<::Value>, + /// Property [`InitializationConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmcapabilities.html#cfn-iotevents-alarmmodel-alarmcapabilities-initializationconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub initialization_configuration: Option<::Value>, + } + + impl ::codec::SerializeValue for AlarmCapabilities { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref acknowledge_flow) = self.acknowledge_flow { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AcknowledgeFlow", acknowledge_flow)?; + } + if let Some(ref initialization_configuration) = self.initialization_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InitializationConfiguration", initialization_configuration)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AlarmCapabilities { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AlarmCapabilities; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AlarmCapabilities") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut acknowledge_flow: Option<::Value> = None; + let mut initialization_configuration: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AcknowledgeFlow" => { + acknowledge_flow = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InitializationConfiguration" => { + initialization_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AlarmCapabilities { + acknowledge_flow: acknowledge_flow, + initialization_configuration: initialization_configuration, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::IoTEvents::AlarmModel.AlarmEventActions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmeventactions.html) property type. + #[derive(Debug, Default)] + pub struct AlarmEventActions { + /// Property [`AlarmActions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmeventactions.html#cfn-iotevents-alarmmodel-alarmeventactions-alarmactions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub alarm_actions: Option<::ValueList>, + } + + impl ::codec::SerializeValue for AlarmEventActions { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref alarm_actions) = self.alarm_actions { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AlarmActions", alarm_actions)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AlarmEventActions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AlarmEventActions; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AlarmEventActions") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut alarm_actions: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AlarmActions" => { + alarm_actions = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AlarmEventActions { + alarm_actions: alarm_actions, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::IoTEvents::AlarmModel.AlarmRule`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmrule.html) property type. + #[derive(Debug, Default)] + pub struct AlarmRule { + /// Property [`SimpleRule`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-alarmrule.html#cfn-iotevents-alarmmodel-alarmrule-simplerule). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub simple_rule: Option<::Value>, + } + + impl ::codec::SerializeValue for AlarmRule { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref simple_rule) = self.simple_rule { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SimpleRule", simple_rule)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AlarmRule { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AlarmRule; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AlarmRule") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut simple_rule: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "SimpleRule" => { + simple_rule = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AlarmRule { + simple_rule: simple_rule, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::IoTEvents::AlarmModel.AssetPropertyTimestamp`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertytimestamp.html) property type. + #[derive(Debug, Default)] + pub struct AssetPropertyTimestamp { + /// Property [`OffsetInNanos`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertytimestamp.html#cfn-iotevents-alarmmodel-assetpropertytimestamp-offsetinnanos). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub offset_in_nanos: Option<::Value>, + /// Property [`TimeInSeconds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertytimestamp.html#cfn-iotevents-alarmmodel-assetpropertytimestamp-timeinseconds). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub time_in_seconds: ::Value, + } + + impl ::codec::SerializeValue for AssetPropertyTimestamp { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref offset_in_nanos) = self.offset_in_nanos { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OffsetInNanos", offset_in_nanos)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TimeInSeconds", &self.time_in_seconds)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AssetPropertyTimestamp { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AssetPropertyTimestamp; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AssetPropertyTimestamp") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut offset_in_nanos: Option<::Value> = None; + let mut time_in_seconds: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "OffsetInNanos" => { + offset_in_nanos = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TimeInSeconds" => { + time_in_seconds = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AssetPropertyTimestamp { + offset_in_nanos: offset_in_nanos, + time_in_seconds: time_in_seconds.ok_or(::serde::de::Error::missing_field("TimeInSeconds"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::IoTEvents::AlarmModel.AssetPropertyValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertyvalue.html) property type. + #[derive(Debug, Default)] + pub struct AssetPropertyValue { + /// Property [`Quality`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertyvalue.html#cfn-iotevents-alarmmodel-assetpropertyvalue-quality). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub quality: Option<::Value>, + /// Property [`Timestamp`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertyvalue.html#cfn-iotevents-alarmmodel-assetpropertyvalue-timestamp). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub timestamp: Option<::Value>, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertyvalue.html#cfn-iotevents-alarmmodel-assetpropertyvalue-value). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub value: ::Value, + } + + impl ::codec::SerializeValue for AssetPropertyValue { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref quality) = self.quality { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Quality", quality)?; + } + if let Some(ref timestamp) = self.timestamp { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Timestamp", timestamp)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", &self.value)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AssetPropertyValue { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AssetPropertyValue; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AssetPropertyValue") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut quality: Option<::Value> = None; + let mut timestamp: Option<::Value> = None; + let mut value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Quality" => { + quality = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Timestamp" => { + timestamp = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AssetPropertyValue { + quality: quality, + timestamp: timestamp, + value: value.ok_or(::serde::de::Error::missing_field("Value"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::IoTEvents::AlarmModel.AssetPropertyVariant`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertyvariant.html) property type. + #[derive(Debug, Default)] + pub struct AssetPropertyVariant { + /// Property [`BooleanValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertyvariant.html#cfn-iotevents-alarmmodel-assetpropertyvariant-booleanvalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub boolean_value: Option<::Value>, + /// Property [`DoubleValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertyvariant.html#cfn-iotevents-alarmmodel-assetpropertyvariant-doublevalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub double_value: Option<::Value>, + /// Property [`IntegerValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertyvariant.html#cfn-iotevents-alarmmodel-assetpropertyvariant-integervalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub integer_value: Option<::Value>, + /// Property [`StringValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-assetpropertyvariant.html#cfn-iotevents-alarmmodel-assetpropertyvariant-stringvalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub string_value: Option<::Value>, + } + + impl ::codec::SerializeValue for AssetPropertyVariant { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref boolean_value) = self.boolean_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BooleanValue", boolean_value)?; + } + if let Some(ref double_value) = self.double_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DoubleValue", double_value)?; + } + if let Some(ref integer_value) = self.integer_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IntegerValue", integer_value)?; + } + if let Some(ref string_value) = self.string_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "StringValue", string_value)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AssetPropertyVariant { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AssetPropertyVariant; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AssetPropertyVariant") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut boolean_value: Option<::Value> = None; + let mut double_value: Option<::Value> = None; + let mut integer_value: Option<::Value> = None; + let mut string_value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "BooleanValue" => { + boolean_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DoubleValue" => { + double_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IntegerValue" => { + integer_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + "StringValue" => { + string_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AssetPropertyVariant { + boolean_value: boolean_value, + double_value: double_value, + integer_value: integer_value, + string_value: string_value, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::IoTEvents::AlarmModel.DynamoDB`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodb.html) property type. + #[derive(Debug, Default)] + pub struct DynamoDB { + /// Property [`HashKeyField`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodb.html#cfn-iotevents-alarmmodel-dynamodb-hashkeyfield). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub hash_key_field: ::Value, + /// Property [`HashKeyType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodb.html#cfn-iotevents-alarmmodel-dynamodb-hashkeytype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub hash_key_type: Option<::Value>, + /// Property [`HashKeyValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodb.html#cfn-iotevents-alarmmodel-dynamodb-hashkeyvalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub hash_key_value: ::Value, + /// Property [`Operation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodb.html#cfn-iotevents-alarmmodel-dynamodb-operation). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub operation: Option<::Value>, + /// Property [`Payload`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodb.html#cfn-iotevents-alarmmodel-dynamodb-payload). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub payload: Option<::Value>, + /// Property [`PayloadField`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodb.html#cfn-iotevents-alarmmodel-dynamodb-payloadfield). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub payload_field: Option<::Value>, + /// Property [`RangeKeyField`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodb.html#cfn-iotevents-alarmmodel-dynamodb-rangekeyfield). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub range_key_field: Option<::Value>, + /// Property [`RangeKeyType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodb.html#cfn-iotevents-alarmmodel-dynamodb-rangekeytype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub range_key_type: Option<::Value>, + /// Property [`RangeKeyValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodb.html#cfn-iotevents-alarmmodel-dynamodb-rangekeyvalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub range_key_value: Option<::Value>, + /// Property [`TableName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodb.html#cfn-iotevents-alarmmodel-dynamodb-tablename). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub table_name: ::Value, + } + + impl ::codec::SerializeValue for DynamoDB { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HashKeyField", &self.hash_key_field)?; + if let Some(ref hash_key_type) = self.hash_key_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HashKeyType", hash_key_type)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "HashKeyValue", &self.hash_key_value)?; + if let Some(ref operation) = self.operation { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Operation", operation)?; + } + if let Some(ref payload) = self.payload { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Payload", payload)?; + } + if let Some(ref payload_field) = self.payload_field { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PayloadField", payload_field)?; + } + if let Some(ref range_key_field) = self.range_key_field { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RangeKeyField", range_key_field)?; + } + if let Some(ref range_key_type) = self.range_key_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RangeKeyType", range_key_type)?; + } + if let Some(ref range_key_value) = self.range_key_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RangeKeyValue", range_key_value)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TableName", &self.table_name)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for DynamoDB { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = DynamoDB; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type DynamoDB") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut hash_key_field: Option<::Value> = None; + let mut hash_key_type: Option<::Value> = None; + let mut hash_key_value: Option<::Value> = None; + let mut operation: Option<::Value> = None; + let mut payload: Option<::Value> = None; + let mut payload_field: Option<::Value> = None; + let mut range_key_field: Option<::Value> = None; + let mut range_key_type: Option<::Value> = None; + let mut range_key_value: Option<::Value> = None; + let mut table_name: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "HashKeyField" => { + hash_key_field = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HashKeyType" => { + hash_key_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "HashKeyValue" => { + hash_key_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Operation" => { + operation = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Payload" => { + payload = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PayloadField" => { + payload_field = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RangeKeyField" => { + range_key_field = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RangeKeyType" => { + range_key_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RangeKeyValue" => { + range_key_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TableName" => { + table_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(DynamoDB { + hash_key_field: hash_key_field.ok_or(::serde::de::Error::missing_field("HashKeyField"))?, + hash_key_type: hash_key_type, + hash_key_value: hash_key_value.ok_or(::serde::de::Error::missing_field("HashKeyValue"))?, + operation: operation, + payload: payload, + payload_field: payload_field, + range_key_field: range_key_field, + range_key_type: range_key_type, + range_key_value: range_key_value, + table_name: table_name.ok_or(::serde::de::Error::missing_field("TableName"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::IoTEvents::AlarmModel.DynamoDBv2`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodbv2.html) property type. + #[derive(Debug, Default)] + pub struct DynamoDBv2 { + /// Property [`Payload`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodbv2.html#cfn-iotevents-alarmmodel-dynamodbv2-payload). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub payload: Option<::Value>, + /// Property [`TableName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-dynamodbv2.html#cfn-iotevents-alarmmodel-dynamodbv2-tablename). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub table_name: ::Value, + } + + impl ::codec::SerializeValue for DynamoDBv2 { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref payload) = self.payload { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Payload", payload)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TableName", &self.table_name)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for DynamoDBv2 { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = DynamoDBv2; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type DynamoDBv2") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut payload: Option<::Value> = None; + let mut table_name: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Payload" => { + payload = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TableName" => { + table_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(DynamoDBv2 { + payload: payload, + table_name: table_name.ok_or(::serde::de::Error::missing_field("TableName"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::IoTEvents::AlarmModel.Firehose`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-firehose.html) property type. + #[derive(Debug, Default)] + pub struct Firehose { + /// Property [`DeliveryStreamName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-firehose.html#cfn-iotevents-alarmmodel-firehose-deliverystreamname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub delivery_stream_name: ::Value, + /// Property [`Payload`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-firehose.html#cfn-iotevents-alarmmodel-firehose-payload). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub payload: Option<::Value>, + /// Property [`Separator`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-firehose.html#cfn-iotevents-alarmmodel-firehose-separator). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub separator: Option<::Value>, + } + + impl ::codec::SerializeValue for Firehose { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeliveryStreamName", &self.delivery_stream_name)?; + if let Some(ref payload) = self.payload { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Payload", payload)?; + } + if let Some(ref separator) = self.separator { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Separator", separator)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Firehose { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Firehose; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Firehose") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut delivery_stream_name: Option<::Value> = None; + let mut payload: Option<::Value> = None; + let mut separator: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DeliveryStreamName" => { + delivery_stream_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Payload" => { + payload = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Separator" => { + separator = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Firehose { + delivery_stream_name: delivery_stream_name.ok_or(::serde::de::Error::missing_field("DeliveryStreamName"))?, + payload: payload, + separator: separator, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::IoTEvents::AlarmModel.InitializationConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-initializationconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct InitializationConfiguration { + /// Property [`DisabledOnInitialization`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-initializationconfiguration.html#cfn-iotevents-alarmmodel-initializationconfiguration-disabledoninitialization). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub disabled_on_initialization: ::Value, + } + + impl ::codec::SerializeValue for InitializationConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DisabledOnInitialization", &self.disabled_on_initialization)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for InitializationConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = InitializationConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type InitializationConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut disabled_on_initialization: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DisabledOnInitialization" => { + disabled_on_initialization = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(InitializationConfiguration { + disabled_on_initialization: disabled_on_initialization.ok_or(::serde::de::Error::missing_field("DisabledOnInitialization"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::IoTEvents::AlarmModel.IotEvents`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iotevents.html) property type. + #[derive(Debug, Default)] + pub struct IotEvents { + /// Property [`InputName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iotevents.html#cfn-iotevents-alarmmodel-iotevents-inputname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub input_name: ::Value, + /// Property [`Payload`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iotevents.html#cfn-iotevents-alarmmodel-iotevents-payload). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub payload: Option<::Value>, + } + + impl ::codec::SerializeValue for IotEvents { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InputName", &self.input_name)?; + if let Some(ref payload) = self.payload { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Payload", payload)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for IotEvents { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = IotEvents; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type IotEvents") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut input_name: Option<::Value> = None; + let mut payload: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "InputName" => { + input_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Payload" => { + payload = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(IotEvents { + input_name: input_name.ok_or(::serde::de::Error::missing_field("InputName"))?, + payload: payload, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::IoTEvents::AlarmModel.IotSiteWise`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iotsitewise.html) property type. + #[derive(Debug, Default)] + pub struct IotSiteWise { + /// Property [`AssetId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iotsitewise.html#cfn-iotevents-alarmmodel-iotsitewise-assetid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub asset_id: Option<::Value>, + /// Property [`EntryId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iotsitewise.html#cfn-iotevents-alarmmodel-iotsitewise-entryid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub entry_id: Option<::Value>, + /// Property [`PropertyAlias`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iotsitewise.html#cfn-iotevents-alarmmodel-iotsitewise-propertyalias). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub property_alias: Option<::Value>, + /// Property [`PropertyId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iotsitewise.html#cfn-iotevents-alarmmodel-iotsitewise-propertyid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub property_id: Option<::Value>, + /// Property [`PropertyValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iotsitewise.html#cfn-iotevents-alarmmodel-iotsitewise-propertyvalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub property_value: ::Value, + } + + impl ::codec::SerializeValue for IotSiteWise { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref asset_id) = self.asset_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AssetId", asset_id)?; + } + if let Some(ref entry_id) = self.entry_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EntryId", entry_id)?; + } + if let Some(ref property_alias) = self.property_alias { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PropertyAlias", property_alias)?; + } + if let Some(ref property_id) = self.property_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PropertyId", property_id)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PropertyValue", &self.property_value)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for IotSiteWise { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = IotSiteWise; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type IotSiteWise") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut asset_id: Option<::Value> = None; + let mut entry_id: Option<::Value> = None; + let mut property_alias: Option<::Value> = None; + let mut property_id: Option<::Value> = None; + let mut property_value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AssetId" => { + asset_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "EntryId" => { + entry_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PropertyAlias" => { + property_alias = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PropertyId" => { + property_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PropertyValue" => { + property_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(IotSiteWise { + asset_id: asset_id, + entry_id: entry_id, + property_alias: property_alias, + property_id: property_id, + property_value: property_value.ok_or(::serde::de::Error::missing_field("PropertyValue"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::IoTEvents::AlarmModel.IotTopicPublish`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iottopicpublish.html) property type. + #[derive(Debug, Default)] + pub struct IotTopicPublish { + /// Property [`MqttTopic`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iottopicpublish.html#cfn-iotevents-alarmmodel-iottopicpublish-mqtttopic). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub mqtt_topic: ::Value, + /// Property [`Payload`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-iottopicpublish.html#cfn-iotevents-alarmmodel-iottopicpublish-payload). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub payload: Option<::Value>, + } + + impl ::codec::SerializeValue for IotTopicPublish { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MqttTopic", &self.mqtt_topic)?; + if let Some(ref payload) = self.payload { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Payload", payload)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for IotTopicPublish { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = IotTopicPublish; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type IotTopicPublish") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut mqtt_topic: Option<::Value> = None; + let mut payload: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "MqttTopic" => { + mqtt_topic = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Payload" => { + payload = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(IotTopicPublish { + mqtt_topic: mqtt_topic.ok_or(::serde::de::Error::missing_field("MqttTopic"))?, + payload: payload, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::IoTEvents::AlarmModel.Lambda`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-lambda.html) property type. + #[derive(Debug, Default)] + pub struct Lambda { + /// Property [`FunctionArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-lambda.html#cfn-iotevents-alarmmodel-lambda-functionarn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub function_arn: ::Value, + /// Property [`Payload`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-lambda.html#cfn-iotevents-alarmmodel-lambda-payload). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub payload: Option<::Value>, + } + + impl ::codec::SerializeValue for Lambda { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FunctionArn", &self.function_arn)?; + if let Some(ref payload) = self.payload { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Payload", payload)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Lambda { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Lambda; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Lambda") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut function_arn: Option<::Value> = None; + let mut payload: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "FunctionArn" => { + function_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Payload" => { + payload = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Lambda { + function_arn: function_arn.ok_or(::serde::de::Error::missing_field("FunctionArn"))?, + payload: payload, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::IoTEvents::AlarmModel.Payload`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-payload.html) property type. + #[derive(Debug, Default)] + pub struct Payload { + /// Property [`ContentExpression`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-payload.html#cfn-iotevents-alarmmodel-payload-contentexpression). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub content_expression: ::Value, + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-payload.html#cfn-iotevents-alarmmodel-payload-type). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#type: ::Value, + } + + impl ::codec::SerializeValue for Payload { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ContentExpression", &self.content_expression)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Payload { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Payload; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Payload") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut content_expression: Option<::Value> = None; + let mut r#type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ContentExpression" => { + content_expression = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Payload { + content_expression: content_expression.ok_or(::serde::de::Error::missing_field("ContentExpression"))?, + r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::IoTEvents::AlarmModel.SimpleRule`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-simplerule.html) property type. + #[derive(Debug, Default)] + pub struct SimpleRule { + /// Property [`ComparisonOperator`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-simplerule.html#cfn-iotevents-alarmmodel-simplerule-comparisonoperator). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub comparison_operator: ::Value, + /// Property [`InputProperty`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-simplerule.html#cfn-iotevents-alarmmodel-simplerule-inputproperty). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub input_property: ::Value, + /// Property [`Threshold`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-simplerule.html#cfn-iotevents-alarmmodel-simplerule-threshold). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub threshold: ::Value, + } + + impl ::codec::SerializeValue for SimpleRule { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ComparisonOperator", &self.comparison_operator)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InputProperty", &self.input_property)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Threshold", &self.threshold)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for SimpleRule { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = SimpleRule; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type SimpleRule") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut comparison_operator: Option<::Value> = None; + let mut input_property: Option<::Value> = None; + let mut threshold: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ComparisonOperator" => { + comparison_operator = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InputProperty" => { + input_property = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Threshold" => { + threshold = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(SimpleRule { + comparison_operator: comparison_operator.ok_or(::serde::de::Error::missing_field("ComparisonOperator"))?, + input_property: input_property.ok_or(::serde::de::Error::missing_field("InputProperty"))?, + threshold: threshold.ok_or(::serde::de::Error::missing_field("Threshold"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::IoTEvents::AlarmModel.Sns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-sns.html) property type. + #[derive(Debug, Default)] + pub struct Sns { + /// Property [`Payload`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-sns.html#cfn-iotevents-alarmmodel-sns-payload). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub payload: Option<::Value>, + /// Property [`TargetArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-sns.html#cfn-iotevents-alarmmodel-sns-targetarn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub target_arn: ::Value, + } + + impl ::codec::SerializeValue for Sns { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref payload) = self.payload { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Payload", payload)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetArn", &self.target_arn)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Sns { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Sns; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Sns") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut payload: Option<::Value> = None; + let mut target_arn: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Payload" => { + payload = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TargetArn" => { + target_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Sns { + payload: payload, + target_arn: target_arn.ok_or(::serde::de::Error::missing_field("TargetArn"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::IoTEvents::AlarmModel.Sqs`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-sqs.html) property type. + #[derive(Debug, Default)] + pub struct Sqs { + /// Property [`Payload`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-sqs.html#cfn-iotevents-alarmmodel-sqs-payload). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub payload: Option<::Value>, + /// Property [`QueueUrl`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-sqs.html#cfn-iotevents-alarmmodel-sqs-queueurl). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub queue_url: ::Value, + /// Property [`UseBase64`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotevents-alarmmodel-sqs.html#cfn-iotevents-alarmmodel-sqs-usebase64). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub use_base64: Option<::Value>, + } + + impl ::codec::SerializeValue for Sqs { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref payload) = self.payload { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Payload", payload)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "QueueUrl", &self.queue_url)?; + if let Some(ref use_base64) = self.use_base64 { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UseBase64", use_base64)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Sqs { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Sqs; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Sqs") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut payload: Option<::Value> = None; + let mut queue_url: Option<::Value> = None; + let mut use_base64: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Payload" => { + payload = ::serde::de::MapAccess::next_value(&mut map)?; + } + "QueueUrl" => { + queue_url = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UseBase64" => { + use_base64 = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Sqs { + payload: payload, + queue_url: queue_url.ok_or(::serde::de::Error::missing_field("QueueUrl"))?, + use_base64: use_base64, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + pub mod detector_model { //! Property types for the `DetectorModel` resource. diff --git a/src/aws/iotsitewise.rs b/src/aws/iotsitewise.rs index a9dbdb0..9fb87b4 100644 --- a/src/aws/iotsitewise.rs +++ b/src/aws/iotsitewise.rs @@ -774,6 +774,11 @@ pub struct Project { /// Properties for the `Project` resource. #[derive(Debug, Default)] pub struct ProjectProperties { + /// Property [`AssetIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-project.html#cfn-iotsitewise-project-assetids). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub asset_ids: Option<::ValueList>, /// Property [`PortalId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotsitewise-project.html#cfn-iotsitewise-project-portalid). /// /// Update type: _Immutable_. @@ -799,6 +804,9 @@ pub struct ProjectProperties { impl ::serde::Serialize for ProjectProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref asset_ids) = self.asset_ids { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AssetIds", asset_ids)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "PortalId", &self.portal_id)?; if let Some(ref project_description) = self.project_description { ::serde::ser::SerializeMap::serialize_entry(&mut map, "ProjectDescription", project_description)?; @@ -823,6 +831,7 @@ impl<'de> ::serde::Deserialize<'de> for ProjectProperties { } fn visit_map>(self, mut map: A) -> Result { + let mut asset_ids: Option<::ValueList> = None; let mut portal_id: Option<::Value> = None; let mut project_description: Option<::Value> = None; let mut project_name: Option<::Value> = None; @@ -830,6 +839,9 @@ impl<'de> ::serde::Deserialize<'de> for ProjectProperties { while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "AssetIds" => { + asset_ids = ::serde::de::MapAccess::next_value(&mut map)?; + } "PortalId" => { portal_id = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -847,6 +859,7 @@ impl<'de> ::serde::Deserialize<'de> for ProjectProperties { } Ok(ProjectProperties { + asset_ids: asset_ids, portal_id: portal_id.ok_or(::serde::de::Error::missing_field("PortalId"))?, project_description: project_description, project_name: project_name.ok_or(::serde::de::Error::missing_field("ProjectName"))?, @@ -2110,12 +2123,20 @@ pub mod asset_model { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub interval: ::Value, + /// Property [`Offset`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-assetmodel-tumblingwindow.html#cfn-iotsitewise-assetmodel-tumblingwindow-offset). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub offset: Option<::Value>, } impl ::codec::SerializeValue for TumblingWindow { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "Interval", &self.interval)?; + if let Some(ref offset) = self.offset { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Offset", offset)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -2133,18 +2154,23 @@ pub mod asset_model { fn visit_map>(self, mut map: A) -> Result { let mut interval: Option<::Value> = None; + let mut offset: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { "Interval" => { interval = ::serde::de::MapAccess::next_value(&mut map)?; } + "Offset" => { + offset = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } Ok(TumblingWindow { interval: interval.ok_or(::serde::de::Error::missing_field("Interval"))?, + offset: offset, }) } } @@ -2292,13 +2318,23 @@ pub mod gateway { /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. - pub greengrass: ::Value, + pub greengrass: Option<::Value>, + /// Property [`GreengrassV2`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-gateway-gatewayplatform.html#cfn-iotsitewise-gateway-gatewayplatform-greengrassv2). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub greengrass_v2: Option<::Value>, } impl ::codec::SerializeValue for GatewayPlatform { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "Greengrass", &self.greengrass)?; + if let Some(ref greengrass) = self.greengrass { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Greengrass", greengrass)?; + } + if let Some(ref greengrass_v2) = self.greengrass_v2 { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GreengrassV2", greengrass_v2)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -2316,18 +2352,23 @@ pub mod gateway { fn visit_map>(self, mut map: A) -> Result { let mut greengrass: Option<::Value> = None; + let mut greengrass_v2: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { "Greengrass" => { greengrass = ::serde::de::MapAccess::next_value(&mut map)?; } + "GreengrassV2" => { + greengrass_v2 = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } Ok(GatewayPlatform { - greengrass: greengrass.ok_or(::serde::de::Error::missing_field("Greengrass"))?, + greengrass: greengrass, + greengrass_v2: greengrass_v2, }) } } @@ -2386,4 +2427,55 @@ pub mod gateway { d.deserialize_map(Visitor) } } + + /// The [`AWS::IoTSiteWise::Gateway.GreengrassV2`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-gateway-greengrassv2.html) property type. + #[derive(Debug, Default)] + pub struct GreengrassV2 { + /// Property [`CoreDeviceThingName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotsitewise-gateway-greengrassv2.html#cfn-iotsitewise-gateway-greengrassv2-coredevicethingname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub core_device_thing_name: ::Value, + } + + impl ::codec::SerializeValue for GreengrassV2 { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CoreDeviceThingName", &self.core_device_thing_name)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for GreengrassV2 { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = GreengrassV2; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type GreengrassV2") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut core_device_thing_name: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CoreDeviceThingName" => { + core_device_thing_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(GreengrassV2 { + core_device_thing_name: core_device_thing_name.ok_or(::serde::de::Error::missing_field("CoreDeviceThingName"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } } diff --git a/src/aws/iotwireless.rs b/src/aws/iotwireless.rs index bc971ad..7ea5086 100644 --- a/src/aws/iotwireless.rs +++ b/src/aws/iotwireless.rs @@ -239,6 +239,336 @@ impl From for DeviceProfile { } } +/// The [`AWS::IoTWireless::FuotaTask`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-fuotatask.html) resource type. +#[derive(Debug, Default)] +pub struct FuotaTask { + properties: FuotaTaskProperties +} + +/// Properties for the `FuotaTask` resource. +#[derive(Debug, Default)] +pub struct FuotaTaskProperties { + /// Property [`AssociateMulticastGroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-fuotatask.html#cfn-iotwireless-fuotatask-associatemulticastgroup). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub associate_multicast_group: Option<::Value>, + /// Property [`AssociateWirelessDevice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-fuotatask.html#cfn-iotwireless-fuotatask-associatewirelessdevice). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub associate_wireless_device: Option<::Value>, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-fuotatask.html#cfn-iotwireless-fuotatask-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`DisassociateMulticastGroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-fuotatask.html#cfn-iotwireless-fuotatask-disassociatemulticastgroup). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub disassociate_multicast_group: Option<::Value>, + /// Property [`DisassociateWirelessDevice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-fuotatask.html#cfn-iotwireless-fuotatask-disassociatewirelessdevice). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub disassociate_wireless_device: Option<::Value>, + /// Property [`FirmwareUpdateImage`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-fuotatask.html#cfn-iotwireless-fuotatask-firmwareupdateimage). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub firmware_update_image: ::Value, + /// Property [`FirmwareUpdateRole`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-fuotatask.html#cfn-iotwireless-fuotatask-firmwareupdaterole). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub firmware_update_role: ::Value, + /// Property [`LoRaWAN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-fuotatask.html#cfn-iotwireless-fuotatask-lorawan). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub lo_ra_wan: ::Value, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-fuotatask.html#cfn-iotwireless-fuotatask-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-fuotatask.html#cfn-iotwireless-fuotatask-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, +} + +impl ::serde::Serialize for FuotaTaskProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref associate_multicast_group) = self.associate_multicast_group { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AssociateMulticastGroup", associate_multicast_group)?; + } + if let Some(ref associate_wireless_device) = self.associate_wireless_device { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AssociateWirelessDevice", associate_wireless_device)?; + } + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + if let Some(ref disassociate_multicast_group) = self.disassociate_multicast_group { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DisassociateMulticastGroup", disassociate_multicast_group)?; + } + if let Some(ref disassociate_wireless_device) = self.disassociate_wireless_device { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DisassociateWirelessDevice", disassociate_wireless_device)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FirmwareUpdateImage", &self.firmware_update_image)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FirmwareUpdateRole", &self.firmware_update_role)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LoRaWAN", &self.lo_ra_wan)?; + if let Some(ref name) = self.name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for FuotaTaskProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = FuotaTaskProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type FuotaTaskProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut associate_multicast_group: Option<::Value> = None; + let mut associate_wireless_device: Option<::Value> = None; + let mut description: Option<::Value> = None; + let mut disassociate_multicast_group: Option<::Value> = None; + let mut disassociate_wireless_device: Option<::Value> = None; + let mut firmware_update_image: Option<::Value> = None; + let mut firmware_update_role: Option<::Value> = None; + let mut lo_ra_wan: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AssociateMulticastGroup" => { + associate_multicast_group = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AssociateWirelessDevice" => { + associate_wireless_device = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DisassociateMulticastGroup" => { + disassociate_multicast_group = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DisassociateWirelessDevice" => { + disassociate_wireless_device = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FirmwareUpdateImage" => { + firmware_update_image = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FirmwareUpdateRole" => { + firmware_update_role = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LoRaWAN" => { + lo_ra_wan = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(FuotaTaskProperties { + associate_multicast_group: associate_multicast_group, + associate_wireless_device: associate_wireless_device, + description: description, + disassociate_multicast_group: disassociate_multicast_group, + disassociate_wireless_device: disassociate_wireless_device, + firmware_update_image: firmware_update_image.ok_or(::serde::de::Error::missing_field("FirmwareUpdateImage"))?, + firmware_update_role: firmware_update_role.ok_or(::serde::de::Error::missing_field("FirmwareUpdateRole"))?, + lo_ra_wan: lo_ra_wan.ok_or(::serde::de::Error::missing_field("LoRaWAN"))?, + name: name, + tags: tags, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for FuotaTask { + type Properties = FuotaTaskProperties; + const TYPE: &'static str = "AWS::IoTWireless::FuotaTask"; + fn properties(&self) -> &FuotaTaskProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut FuotaTaskProperties { + &mut self.properties + } +} + +impl ::private::Sealed for FuotaTask {} + +impl From for FuotaTask { + fn from(properties: FuotaTaskProperties) -> FuotaTask { + FuotaTask { properties } + } +} + +/// The [`AWS::IoTWireless::MulticastGroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-multicastgroup.html) resource type. +#[derive(Debug, Default)] +pub struct MulticastGroup { + properties: MulticastGroupProperties +} + +/// Properties for the `MulticastGroup` resource. +#[derive(Debug, Default)] +pub struct MulticastGroupProperties { + /// Property [`AssociateWirelessDevice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-multicastgroup.html#cfn-iotwireless-multicastgroup-associatewirelessdevice). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub associate_wireless_device: Option<::Value>, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-multicastgroup.html#cfn-iotwireless-multicastgroup-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`DisassociateWirelessDevice`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-multicastgroup.html#cfn-iotwireless-multicastgroup-disassociatewirelessdevice). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub disassociate_wireless_device: Option<::Value>, + /// Property [`LoRaWAN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-multicastgroup.html#cfn-iotwireless-multicastgroup-lorawan). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub lo_ra_wan: ::Value, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-multicastgroup.html#cfn-iotwireless-multicastgroup-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-multicastgroup.html#cfn-iotwireless-multicastgroup-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, +} + +impl ::serde::Serialize for MulticastGroupProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref associate_wireless_device) = self.associate_wireless_device { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AssociateWirelessDevice", associate_wireless_device)?; + } + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + if let Some(ref disassociate_wireless_device) = self.disassociate_wireless_device { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DisassociateWirelessDevice", disassociate_wireless_device)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LoRaWAN", &self.lo_ra_wan)?; + if let Some(ref name) = self.name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for MulticastGroupProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = MulticastGroupProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type MulticastGroupProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut associate_wireless_device: Option<::Value> = None; + let mut description: Option<::Value> = None; + let mut disassociate_wireless_device: Option<::Value> = None; + let mut lo_ra_wan: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AssociateWirelessDevice" => { + associate_wireless_device = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DisassociateWirelessDevice" => { + disassociate_wireless_device = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LoRaWAN" => { + lo_ra_wan = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(MulticastGroupProperties { + associate_wireless_device: associate_wireless_device, + description: description, + disassociate_wireless_device: disassociate_wireless_device, + lo_ra_wan: lo_ra_wan.ok_or(::serde::de::Error::missing_field("LoRaWAN"))?, + name: name, + tags: tags, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for MulticastGroup { + type Properties = MulticastGroupProperties; + const TYPE: &'static str = "AWS::IoTWireless::MulticastGroup"; + fn properties(&self) -> &MulticastGroupProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut MulticastGroupProperties { + &mut self.properties + } +} + +impl ::private::Sealed for MulticastGroup {} + +impl From for MulticastGroup { + fn from(properties: MulticastGroupProperties) -> MulticastGroup { + MulticastGroup { properties } + } +} + /// The [`AWS::IoTWireless::PartnerAccount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iotwireless-partneraccount.html) resource type. #[derive(Debug, Default)] pub struct PartnerAccount { @@ -1172,6 +1502,166 @@ pub mod device_profile { } } +pub mod fuota_task { + //! Property types for the `FuotaTask` resource. + + /// The [`AWS::IoTWireless::FuotaTask.LoRaWAN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-fuotatask-lorawan.html) property type. + #[derive(Debug, Default)] + pub struct LoRaWAN { + /// Property [`RfRegion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-fuotatask-lorawan.html#cfn-iotwireless-fuotatask-lorawan-rfregion). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub rf_region: ::Value, + /// Property [`StartTime`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-fuotatask-lorawan.html#cfn-iotwireless-fuotatask-lorawan-starttime). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub start_time: Option<::Value>, + } + + impl ::codec::SerializeValue for LoRaWAN { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RfRegion", &self.rf_region)?; + if let Some(ref start_time) = self.start_time { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "StartTime", start_time)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for LoRaWAN { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = LoRaWAN; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type LoRaWAN") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut rf_region: Option<::Value> = None; + let mut start_time: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "RfRegion" => { + rf_region = ::serde::de::MapAccess::next_value(&mut map)?; + } + "StartTime" => { + start_time = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(LoRaWAN { + rf_region: rf_region.ok_or(::serde::de::Error::missing_field("RfRegion"))?, + start_time: start_time, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + +pub mod multicast_group { + //! Property types for the `MulticastGroup` resource. + + /// The [`AWS::IoTWireless::MulticastGroup.LoRaWAN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-multicastgroup-lorawan.html) property type. + #[derive(Debug, Default)] + pub struct LoRaWAN { + /// Property [`DlClass`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-multicastgroup-lorawan.html#cfn-iotwireless-multicastgroup-lorawan-dlclass). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub dl_class: ::Value, + /// Property [`NumberOfDevicesInGroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-multicastgroup-lorawan.html#cfn-iotwireless-multicastgroup-lorawan-numberofdevicesingroup). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub number_of_devices_in_group: Option<::Value>, + /// Property [`NumberOfDevicesRequested`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-multicastgroup-lorawan.html#cfn-iotwireless-multicastgroup-lorawan-numberofdevicesrequested). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub number_of_devices_requested: Option<::Value>, + /// Property [`RfRegion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iotwireless-multicastgroup-lorawan.html#cfn-iotwireless-multicastgroup-lorawan-rfregion). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub rf_region: ::Value, + } + + impl ::codec::SerializeValue for LoRaWAN { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DlClass", &self.dl_class)?; + if let Some(ref number_of_devices_in_group) = self.number_of_devices_in_group { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NumberOfDevicesInGroup", number_of_devices_in_group)?; + } + if let Some(ref number_of_devices_requested) = self.number_of_devices_requested { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NumberOfDevicesRequested", number_of_devices_requested)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RfRegion", &self.rf_region)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for LoRaWAN { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = LoRaWAN; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type LoRaWAN") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut dl_class: Option<::Value> = None; + let mut number_of_devices_in_group: Option<::Value> = None; + let mut number_of_devices_requested: Option<::Value> = None; + let mut rf_region: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DlClass" => { + dl_class = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NumberOfDevicesInGroup" => { + number_of_devices_in_group = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NumberOfDevicesRequested" => { + number_of_devices_requested = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RfRegion" => { + rf_region = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(LoRaWAN { + dl_class: dl_class.ok_or(::serde::de::Error::missing_field("DlClass"))?, + number_of_devices_in_group: number_of_devices_in_group, + number_of_devices_requested: number_of_devices_requested, + rf_region: rf_region.ok_or(::serde::de::Error::missing_field("RfRegion"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + pub mod partner_account { //! Property types for the `PartnerAccount` resource. diff --git a/src/aws/ivs.rs b/src/aws/ivs.rs index 65a565f..6b4b839 100644 --- a/src/aws/ivs.rs +++ b/src/aws/ivs.rs @@ -269,6 +269,11 @@ pub struct RecordingConfigurationProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub tags: Option<::ValueList<::Tag>>, + /// Property [`ThumbnailConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ivs-recordingconfiguration.html#cfn-ivs-recordingconfiguration-thumbnailconfiguration). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub thumbnail_configuration: Option<::Value>, } impl ::serde::Serialize for RecordingConfigurationProperties { @@ -281,6 +286,9 @@ impl ::serde::Serialize for RecordingConfigurationProperties { if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } + if let Some(ref thumbnail_configuration) = self.thumbnail_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ThumbnailConfiguration", thumbnail_configuration)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -300,6 +308,7 @@ impl<'de> ::serde::Deserialize<'de> for RecordingConfigurationProperties { let mut destination_configuration: Option<::Value> = None; let mut name: Option<::Value> = None; let mut tags: Option<::ValueList<::Tag>> = None; + let mut thumbnail_configuration: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { @@ -312,6 +321,9 @@ impl<'de> ::serde::Deserialize<'de> for RecordingConfigurationProperties { "Tags" => { tags = ::serde::de::MapAccess::next_value(&mut map)?; } + "ThumbnailConfiguration" => { + thumbnail_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } @@ -320,6 +332,7 @@ impl<'de> ::serde::Deserialize<'de> for RecordingConfigurationProperties { destination_configuration: destination_configuration.ok_or(::serde::de::Error::missing_field("DestinationConfiguration"))?, name: name, tags: tags, + thumbnail_configuration: thumbnail_configuration, }) } } @@ -540,4 +553,68 @@ pub mod recording_configuration { d.deserialize_map(Visitor) } } + + /// The [`AWS::IVS::RecordingConfiguration.ThumbnailConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivs-recordingconfiguration-thumbnailconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct ThumbnailConfiguration { + /// Property [`RecordingMode`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivs-recordingconfiguration-thumbnailconfiguration.html#cfn-ivs-recordingconfiguration-thumbnailconfiguration-recordingmode). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub recording_mode: ::Value, + /// Property [`TargetIntervalSeconds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ivs-recordingconfiguration-thumbnailconfiguration.html#cfn-ivs-recordingconfiguration-thumbnailconfiguration-targetintervalseconds). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub target_interval_seconds: Option<::Value>, + } + + impl ::codec::SerializeValue for ThumbnailConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RecordingMode", &self.recording_mode)?; + if let Some(ref target_interval_seconds) = self.target_interval_seconds { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetIntervalSeconds", target_interval_seconds)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ThumbnailConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ThumbnailConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ThumbnailConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut recording_mode: Option<::Value> = None; + let mut target_interval_seconds: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "RecordingMode" => { + recording_mode = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TargetIntervalSeconds" => { + target_interval_seconds = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ThumbnailConfiguration { + recording_mode: recording_mode.ok_or(::serde::de::Error::missing_field("RecordingMode"))?, + target_interval_seconds: target_interval_seconds, + }) + } + } + + d.deserialize_map(Visitor) + } + } } diff --git a/src/aws/kafkaconnect.rs b/src/aws/kafkaconnect.rs new file mode 100644 index 0000000..203e464 --- /dev/null +++ b/src/aws/kafkaconnect.rs @@ -0,0 +1,1322 @@ +//! Types for the `KafkaConnect` service. + +/// The [`AWS::KafkaConnect::Connector`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html) resource type. +#[derive(Debug, Default)] +pub struct Connector { + properties: ConnectorProperties +} + +/// Properties for the `Connector` resource. +#[derive(Debug, Default)] +pub struct ConnectorProperties { + /// Property [`Capacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-capacity). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub capacity: ::Value, + /// Property [`ConnectorConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-connectorconfiguration). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub connector_configuration: ::ValueMap, + /// Property [`ConnectorDescription`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-connectordescription). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub connector_description: Option<::Value>, + /// Property [`ConnectorName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-connectorname). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub connector_name: ::Value, + /// Property [`KafkaCluster`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-kafkacluster). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub kafka_cluster: ::Value, + /// Property [`KafkaClusterClientAuthentication`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-kafkaclusterclientauthentication). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub kafka_cluster_client_authentication: ::Value, + /// Property [`KafkaClusterEncryptionInTransit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-kafkaclusterencryptionintransit). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub kafka_cluster_encryption_in_transit: ::Value, + /// Property [`KafkaConnectVersion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-kafkaconnectversion). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub kafka_connect_version: ::Value, + /// Property [`LogDelivery`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-logdelivery). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub log_delivery: Option<::Value>, + /// Property [`Plugins`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-plugins). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub plugins: ::ValueList, + /// Property [`ServiceExecutionRoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-serviceexecutionrolearn). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub service_execution_role_arn: ::Value, + /// Property [`WorkerConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kafkaconnect-connector.html#cfn-kafkaconnect-connector-workerconfiguration). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub worker_configuration: Option<::Value>, +} + +impl ::serde::Serialize for ConnectorProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Capacity", &self.capacity)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConnectorConfiguration", &self.connector_configuration)?; + if let Some(ref connector_description) = self.connector_description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConnectorDescription", connector_description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConnectorName", &self.connector_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "KafkaCluster", &self.kafka_cluster)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "KafkaClusterClientAuthentication", &self.kafka_cluster_client_authentication)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "KafkaClusterEncryptionInTransit", &self.kafka_cluster_encryption_in_transit)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "KafkaConnectVersion", &self.kafka_connect_version)?; + if let Some(ref log_delivery) = self.log_delivery { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogDelivery", log_delivery)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Plugins", &self.plugins)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServiceExecutionRoleArn", &self.service_execution_role_arn)?; + if let Some(ref worker_configuration) = self.worker_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "WorkerConfiguration", worker_configuration)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for ConnectorProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ConnectorProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ConnectorProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut capacity: Option<::Value> = None; + let mut connector_configuration: Option<::ValueMap> = None; + let mut connector_description: Option<::Value> = None; + let mut connector_name: Option<::Value> = None; + let mut kafka_cluster: Option<::Value> = None; + let mut kafka_cluster_client_authentication: Option<::Value> = None; + let mut kafka_cluster_encryption_in_transit: Option<::Value> = None; + let mut kafka_connect_version: Option<::Value> = None; + let mut log_delivery: Option<::Value> = None; + let mut plugins: Option<::ValueList> = None; + let mut service_execution_role_arn: Option<::Value> = None; + let mut worker_configuration: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Capacity" => { + capacity = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ConnectorConfiguration" => { + connector_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ConnectorDescription" => { + connector_description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ConnectorName" => { + connector_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "KafkaCluster" => { + kafka_cluster = ::serde::de::MapAccess::next_value(&mut map)?; + } + "KafkaClusterClientAuthentication" => { + kafka_cluster_client_authentication = ::serde::de::MapAccess::next_value(&mut map)?; + } + "KafkaClusterEncryptionInTransit" => { + kafka_cluster_encryption_in_transit = ::serde::de::MapAccess::next_value(&mut map)?; + } + "KafkaConnectVersion" => { + kafka_connect_version = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LogDelivery" => { + log_delivery = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Plugins" => { + plugins = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ServiceExecutionRoleArn" => { + service_execution_role_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "WorkerConfiguration" => { + worker_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ConnectorProperties { + capacity: capacity.ok_or(::serde::de::Error::missing_field("Capacity"))?, + connector_configuration: connector_configuration.ok_or(::serde::de::Error::missing_field("ConnectorConfiguration"))?, + connector_description: connector_description, + connector_name: connector_name.ok_or(::serde::de::Error::missing_field("ConnectorName"))?, + kafka_cluster: kafka_cluster.ok_or(::serde::de::Error::missing_field("KafkaCluster"))?, + kafka_cluster_client_authentication: kafka_cluster_client_authentication.ok_or(::serde::de::Error::missing_field("KafkaClusterClientAuthentication"))?, + kafka_cluster_encryption_in_transit: kafka_cluster_encryption_in_transit.ok_or(::serde::de::Error::missing_field("KafkaClusterEncryptionInTransit"))?, + kafka_connect_version: kafka_connect_version.ok_or(::serde::de::Error::missing_field("KafkaConnectVersion"))?, + log_delivery: log_delivery, + plugins: plugins.ok_or(::serde::de::Error::missing_field("Plugins"))?, + service_execution_role_arn: service_execution_role_arn.ok_or(::serde::de::Error::missing_field("ServiceExecutionRoleArn"))?, + worker_configuration: worker_configuration, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for Connector { + type Properties = ConnectorProperties; + const TYPE: &'static str = "AWS::KafkaConnect::Connector"; + fn properties(&self) -> &ConnectorProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut ConnectorProperties { + &mut self.properties + } +} + +impl ::private::Sealed for Connector {} + +impl From for Connector { + fn from(properties: ConnectorProperties) -> Connector { + Connector { properties } + } +} + +pub mod connector { + //! Property types for the `Connector` resource. + + /// The [`AWS::KafkaConnect::Connector.ApacheKafkaCluster`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-apachekafkacluster.html) property type. + #[derive(Debug, Default)] + pub struct ApacheKafkaCluster { + /// Property [`BootstrapServers`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-apachekafkacluster.html#cfn-kafkaconnect-connector-apachekafkacluster-bootstrapservers). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub bootstrap_servers: ::Value, + /// Property [`Vpc`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-apachekafkacluster.html#cfn-kafkaconnect-connector-apachekafkacluster-vpc). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub vpc: ::Value, + } + + impl ::codec::SerializeValue for ApacheKafkaCluster { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BootstrapServers", &self.bootstrap_servers)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Vpc", &self.vpc)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ApacheKafkaCluster { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ApacheKafkaCluster; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ApacheKafkaCluster") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut bootstrap_servers: Option<::Value> = None; + let mut vpc: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "BootstrapServers" => { + bootstrap_servers = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Vpc" => { + vpc = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ApacheKafkaCluster { + bootstrap_servers: bootstrap_servers.ok_or(::serde::de::Error::missing_field("BootstrapServers"))?, + vpc: vpc.ok_or(::serde::de::Error::missing_field("Vpc"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::KafkaConnect::Connector.AutoScaling`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-autoscaling.html) property type. + #[derive(Debug, Default)] + pub struct AutoScaling { + /// Property [`MaxWorkerCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-autoscaling.html#cfn-kafkaconnect-connector-autoscaling-maxworkercount). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub max_worker_count: ::Value, + /// Property [`McuCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-autoscaling.html#cfn-kafkaconnect-connector-autoscaling-mcucount). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub mcu_count: ::Value, + /// Property [`MinWorkerCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-autoscaling.html#cfn-kafkaconnect-connector-autoscaling-minworkercount). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub min_worker_count: ::Value, + /// Property [`ScaleInPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-autoscaling.html#cfn-kafkaconnect-connector-autoscaling-scaleinpolicy). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub scale_in_policy: ::Value, + /// Property [`ScaleOutPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-autoscaling.html#cfn-kafkaconnect-connector-autoscaling-scaleoutpolicy). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub scale_out_policy: ::Value, + } + + impl ::codec::SerializeValue for AutoScaling { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxWorkerCount", &self.max_worker_count)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "McuCount", &self.mcu_count)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MinWorkerCount", &self.min_worker_count)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ScaleInPolicy", &self.scale_in_policy)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ScaleOutPolicy", &self.scale_out_policy)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AutoScaling { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AutoScaling; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AutoScaling") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut max_worker_count: Option<::Value> = None; + let mut mcu_count: Option<::Value> = None; + let mut min_worker_count: Option<::Value> = None; + let mut scale_in_policy: Option<::Value> = None; + let mut scale_out_policy: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "MaxWorkerCount" => { + max_worker_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + "McuCount" => { + mcu_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MinWorkerCount" => { + min_worker_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ScaleInPolicy" => { + scale_in_policy = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ScaleOutPolicy" => { + scale_out_policy = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AutoScaling { + max_worker_count: max_worker_count.ok_or(::serde::de::Error::missing_field("MaxWorkerCount"))?, + mcu_count: mcu_count.ok_or(::serde::de::Error::missing_field("McuCount"))?, + min_worker_count: min_worker_count.ok_or(::serde::de::Error::missing_field("MinWorkerCount"))?, + scale_in_policy: scale_in_policy.ok_or(::serde::de::Error::missing_field("ScaleInPolicy"))?, + scale_out_policy: scale_out_policy.ok_or(::serde::de::Error::missing_field("ScaleOutPolicy"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::KafkaConnect::Connector.Capacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-capacity.html) property type. + #[derive(Debug, Default)] + pub struct Capacity { + /// Property [`AutoScaling`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-capacity.html#cfn-kafkaconnect-connector-capacity-autoscaling). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub auto_scaling: Option<::Value>, + /// Property [`ProvisionedCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-capacity.html#cfn-kafkaconnect-connector-capacity-provisionedcapacity). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub provisioned_capacity: Option<::Value>, + } + + impl ::codec::SerializeValue for Capacity { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref auto_scaling) = self.auto_scaling { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AutoScaling", auto_scaling)?; + } + if let Some(ref provisioned_capacity) = self.provisioned_capacity { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ProvisionedCapacity", provisioned_capacity)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Capacity { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Capacity; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Capacity") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut auto_scaling: Option<::Value> = None; + let mut provisioned_capacity: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AutoScaling" => { + auto_scaling = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ProvisionedCapacity" => { + provisioned_capacity = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Capacity { + auto_scaling: auto_scaling, + provisioned_capacity: provisioned_capacity, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::KafkaConnect::Connector.CloudWatchLogsLogDelivery`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-cloudwatchlogslogdelivery.html) property type. + #[derive(Debug, Default)] + pub struct CloudWatchLogsLogDelivery { + /// Property [`Enabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-cloudwatchlogslogdelivery.html#cfn-kafkaconnect-connector-cloudwatchlogslogdelivery-enabled). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub enabled: ::Value, + /// Property [`LogGroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-cloudwatchlogslogdelivery.html#cfn-kafkaconnect-connector-cloudwatchlogslogdelivery-loggroup). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub log_group: Option<::Value>, + } + + impl ::codec::SerializeValue for CloudWatchLogsLogDelivery { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Enabled", &self.enabled)?; + if let Some(ref log_group) = self.log_group { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogGroup", log_group)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CloudWatchLogsLogDelivery { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CloudWatchLogsLogDelivery; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CloudWatchLogsLogDelivery") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut enabled: Option<::Value> = None; + let mut log_group: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Enabled" => { + enabled = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LogGroup" => { + log_group = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CloudWatchLogsLogDelivery { + enabled: enabled.ok_or(::serde::de::Error::missing_field("Enabled"))?, + log_group: log_group, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::KafkaConnect::Connector.CustomPlugin`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-customplugin.html) property type. + #[derive(Debug, Default)] + pub struct CustomPlugin { + /// Property [`CustomPluginArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-customplugin.html#cfn-kafkaconnect-connector-customplugin-custompluginarn). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub custom_plugin_arn: ::Value, + /// Property [`Revision`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-customplugin.html#cfn-kafkaconnect-connector-customplugin-revision). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub revision: ::Value, + } + + impl ::codec::SerializeValue for CustomPlugin { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CustomPluginArn", &self.custom_plugin_arn)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Revision", &self.revision)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CustomPlugin { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CustomPlugin; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CustomPlugin") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut custom_plugin_arn: Option<::Value> = None; + let mut revision: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CustomPluginArn" => { + custom_plugin_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Revision" => { + revision = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CustomPlugin { + custom_plugin_arn: custom_plugin_arn.ok_or(::serde::de::Error::missing_field("CustomPluginArn"))?, + revision: revision.ok_or(::serde::de::Error::missing_field("Revision"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::KafkaConnect::Connector.FirehoseLogDelivery`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-firehoselogdelivery.html) property type. + #[derive(Debug, Default)] + pub struct FirehoseLogDelivery { + /// Property [`DeliveryStream`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-firehoselogdelivery.html#cfn-kafkaconnect-connector-firehoselogdelivery-deliverystream). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub delivery_stream: Option<::Value>, + /// Property [`Enabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-firehoselogdelivery.html#cfn-kafkaconnect-connector-firehoselogdelivery-enabled). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub enabled: ::Value, + } + + impl ::codec::SerializeValue for FirehoseLogDelivery { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref delivery_stream) = self.delivery_stream { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeliveryStream", delivery_stream)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Enabled", &self.enabled)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for FirehoseLogDelivery { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = FirehoseLogDelivery; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type FirehoseLogDelivery") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut delivery_stream: Option<::Value> = None; + let mut enabled: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DeliveryStream" => { + delivery_stream = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Enabled" => { + enabled = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(FirehoseLogDelivery { + delivery_stream: delivery_stream, + enabled: enabled.ok_or(::serde::de::Error::missing_field("Enabled"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::KafkaConnect::Connector.KafkaCluster`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-kafkacluster.html) property type. + #[derive(Debug, Default)] + pub struct KafkaCluster { + /// Property [`ApacheKafkaCluster`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-kafkacluster.html#cfn-kafkaconnect-connector-kafkacluster-apachekafkacluster). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub apache_kafka_cluster: ::Value, + } + + impl ::codec::SerializeValue for KafkaCluster { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ApacheKafkaCluster", &self.apache_kafka_cluster)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for KafkaCluster { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = KafkaCluster; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type KafkaCluster") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut apache_kafka_cluster: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ApacheKafkaCluster" => { + apache_kafka_cluster = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(KafkaCluster { + apache_kafka_cluster: apache_kafka_cluster.ok_or(::serde::de::Error::missing_field("ApacheKafkaCluster"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::KafkaConnect::Connector.KafkaClusterClientAuthentication`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-kafkaclusterclientauthentication.html) property type. + #[derive(Debug, Default)] + pub struct KafkaClusterClientAuthentication { + /// Property [`AuthenticationType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-kafkaclusterclientauthentication.html#cfn-kafkaconnect-connector-kafkaclusterclientauthentication-authenticationtype). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub authentication_type: ::Value, + } + + impl ::codec::SerializeValue for KafkaClusterClientAuthentication { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AuthenticationType", &self.authentication_type)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for KafkaClusterClientAuthentication { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = KafkaClusterClientAuthentication; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type KafkaClusterClientAuthentication") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut authentication_type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AuthenticationType" => { + authentication_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(KafkaClusterClientAuthentication { + authentication_type: authentication_type.ok_or(::serde::de::Error::missing_field("AuthenticationType"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::KafkaConnect::Connector.KafkaClusterEncryptionInTransit`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-kafkaclusterencryptionintransit.html) property type. + #[derive(Debug, Default)] + pub struct KafkaClusterEncryptionInTransit { + /// Property [`EncryptionType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-kafkaclusterencryptionintransit.html#cfn-kafkaconnect-connector-kafkaclusterencryptionintransit-encryptiontype). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub encryption_type: ::Value, + } + + impl ::codec::SerializeValue for KafkaClusterEncryptionInTransit { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EncryptionType", &self.encryption_type)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for KafkaClusterEncryptionInTransit { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = KafkaClusterEncryptionInTransit; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type KafkaClusterEncryptionInTransit") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut encryption_type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "EncryptionType" => { + encryption_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(KafkaClusterEncryptionInTransit { + encryption_type: encryption_type.ok_or(::serde::de::Error::missing_field("EncryptionType"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::KafkaConnect::Connector.LogDelivery`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-logdelivery.html) property type. + #[derive(Debug, Default)] + pub struct LogDelivery { + /// Property [`WorkerLogDelivery`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-logdelivery.html#cfn-kafkaconnect-connector-logdelivery-workerlogdelivery). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub worker_log_delivery: ::Value, + } + + impl ::codec::SerializeValue for LogDelivery { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "WorkerLogDelivery", &self.worker_log_delivery)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for LogDelivery { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = LogDelivery; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type LogDelivery") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut worker_log_delivery: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "WorkerLogDelivery" => { + worker_log_delivery = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(LogDelivery { + worker_log_delivery: worker_log_delivery.ok_or(::serde::de::Error::missing_field("WorkerLogDelivery"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::KafkaConnect::Connector.Plugin`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-plugin.html) property type. + #[derive(Debug, Default)] + pub struct Plugin { + /// Property [`CustomPlugin`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-plugin.html#cfn-kafkaconnect-connector-plugin-customplugin). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub custom_plugin: ::Value, + } + + impl ::codec::SerializeValue for Plugin { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CustomPlugin", &self.custom_plugin)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Plugin { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Plugin; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Plugin") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut custom_plugin: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CustomPlugin" => { + custom_plugin = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Plugin { + custom_plugin: custom_plugin.ok_or(::serde::de::Error::missing_field("CustomPlugin"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::KafkaConnect::Connector.ProvisionedCapacity`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-provisionedcapacity.html) property type. + #[derive(Debug, Default)] + pub struct ProvisionedCapacity { + /// Property [`McuCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-provisionedcapacity.html#cfn-kafkaconnect-connector-provisionedcapacity-mcucount). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub mcu_count: Option<::Value>, + /// Property [`WorkerCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-provisionedcapacity.html#cfn-kafkaconnect-connector-provisionedcapacity-workercount). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub worker_count: ::Value, + } + + impl ::codec::SerializeValue for ProvisionedCapacity { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref mcu_count) = self.mcu_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "McuCount", mcu_count)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "WorkerCount", &self.worker_count)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ProvisionedCapacity { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ProvisionedCapacity; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ProvisionedCapacity") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut mcu_count: Option<::Value> = None; + let mut worker_count: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "McuCount" => { + mcu_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + "WorkerCount" => { + worker_count = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ProvisionedCapacity { + mcu_count: mcu_count, + worker_count: worker_count.ok_or(::serde::de::Error::missing_field("WorkerCount"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::KafkaConnect::Connector.S3LogDelivery`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-s3logdelivery.html) property type. + #[derive(Debug, Default)] + pub struct S3LogDelivery { + /// Property [`Bucket`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-s3logdelivery.html#cfn-kafkaconnect-connector-s3logdelivery-bucket). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub bucket: Option<::Value>, + /// Property [`Enabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-s3logdelivery.html#cfn-kafkaconnect-connector-s3logdelivery-enabled). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub enabled: ::Value, + /// Property [`Prefix`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-s3logdelivery.html#cfn-kafkaconnect-connector-s3logdelivery-prefix). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub prefix: Option<::Value>, + } + + impl ::codec::SerializeValue for S3LogDelivery { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref bucket) = self.bucket { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Bucket", bucket)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Enabled", &self.enabled)?; + if let Some(ref prefix) = self.prefix { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Prefix", prefix)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for S3LogDelivery { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = S3LogDelivery; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type S3LogDelivery") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut bucket: Option<::Value> = None; + let mut enabled: Option<::Value> = None; + let mut prefix: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Bucket" => { + bucket = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Enabled" => { + enabled = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Prefix" => { + prefix = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(S3LogDelivery { + bucket: bucket, + enabled: enabled.ok_or(::serde::de::Error::missing_field("Enabled"))?, + prefix: prefix, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::KafkaConnect::Connector.ScaleInPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-scaleinpolicy.html) property type. + #[derive(Debug, Default)] + pub struct ScaleInPolicy { + /// Property [`CpuUtilizationPercentage`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-scaleinpolicy.html#cfn-kafkaconnect-connector-scaleinpolicy-cpuutilizationpercentage). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub cpu_utilization_percentage: ::Value, + } + + impl ::codec::SerializeValue for ScaleInPolicy { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CpuUtilizationPercentage", &self.cpu_utilization_percentage)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ScaleInPolicy { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ScaleInPolicy; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ScaleInPolicy") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut cpu_utilization_percentage: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CpuUtilizationPercentage" => { + cpu_utilization_percentage = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ScaleInPolicy { + cpu_utilization_percentage: cpu_utilization_percentage.ok_or(::serde::de::Error::missing_field("CpuUtilizationPercentage"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::KafkaConnect::Connector.ScaleOutPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-scaleoutpolicy.html) property type. + #[derive(Debug, Default)] + pub struct ScaleOutPolicy { + /// Property [`CpuUtilizationPercentage`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-scaleoutpolicy.html#cfn-kafkaconnect-connector-scaleoutpolicy-cpuutilizationpercentage). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub cpu_utilization_percentage: ::Value, + } + + impl ::codec::SerializeValue for ScaleOutPolicy { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CpuUtilizationPercentage", &self.cpu_utilization_percentage)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ScaleOutPolicy { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ScaleOutPolicy; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ScaleOutPolicy") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut cpu_utilization_percentage: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CpuUtilizationPercentage" => { + cpu_utilization_percentage = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ScaleOutPolicy { + cpu_utilization_percentage: cpu_utilization_percentage.ok_or(::serde::de::Error::missing_field("CpuUtilizationPercentage"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::KafkaConnect::Connector.Vpc`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-vpc.html) property type. + #[derive(Debug, Default)] + pub struct Vpc { + /// Property [`SecurityGroups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-vpc.html#cfn-kafkaconnect-connector-vpc-securitygroups). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub security_groups: ::ValueList, + /// Property [`Subnets`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-vpc.html#cfn-kafkaconnect-connector-vpc-subnets). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub subnets: ::ValueList, + } + + impl ::codec::SerializeValue for Vpc { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityGroups", &self.security_groups)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Subnets", &self.subnets)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Vpc { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Vpc; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Vpc") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut security_groups: Option<::ValueList> = None; + let mut subnets: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "SecurityGroups" => { + security_groups = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Subnets" => { + subnets = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Vpc { + security_groups: security_groups.ok_or(::serde::de::Error::missing_field("SecurityGroups"))?, + subnets: subnets.ok_or(::serde::de::Error::missing_field("Subnets"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::KafkaConnect::Connector.WorkerConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-workerconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct WorkerConfiguration { + /// Property [`Revision`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-workerconfiguration.html#cfn-kafkaconnect-connector-workerconfiguration-revision). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub revision: ::Value, + /// Property [`WorkerConfigurationArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-workerconfiguration.html#cfn-kafkaconnect-connector-workerconfiguration-workerconfigurationarn). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub worker_configuration_arn: ::Value, + } + + impl ::codec::SerializeValue for WorkerConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Revision", &self.revision)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "WorkerConfigurationArn", &self.worker_configuration_arn)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for WorkerConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = WorkerConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type WorkerConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut revision: Option<::Value> = None; + let mut worker_configuration_arn: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Revision" => { + revision = ::serde::de::MapAccess::next_value(&mut map)?; + } + "WorkerConfigurationArn" => { + worker_configuration_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(WorkerConfiguration { + revision: revision.ok_or(::serde::de::Error::missing_field("Revision"))?, + worker_configuration_arn: worker_configuration_arn.ok_or(::serde::de::Error::missing_field("WorkerConfigurationArn"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::KafkaConnect::Connector.WorkerLogDelivery`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-workerlogdelivery.html) property type. + #[derive(Debug, Default)] + pub struct WorkerLogDelivery { + /// Property [`CloudWatchLogs`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-workerlogdelivery.html#cfn-kafkaconnect-connector-workerlogdelivery-cloudwatchlogs). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub cloud_watch_logs: Option<::Value>, + /// Property [`Firehose`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-workerlogdelivery.html#cfn-kafkaconnect-connector-workerlogdelivery-firehose). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub firehose: Option<::Value>, + /// Property [`S3`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kafkaconnect-connector-workerlogdelivery.html#cfn-kafkaconnect-connector-workerlogdelivery-s3). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub s3: Option<::Value>, + } + + impl ::codec::SerializeValue for WorkerLogDelivery { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref cloud_watch_logs) = self.cloud_watch_logs { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CloudWatchLogs", cloud_watch_logs)?; + } + if let Some(ref firehose) = self.firehose { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Firehose", firehose)?; + } + if let Some(ref s3) = self.s3 { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3", s3)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for WorkerLogDelivery { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = WorkerLogDelivery; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type WorkerLogDelivery") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut cloud_watch_logs: Option<::Value> = None; + let mut firehose: Option<::Value> = None; + let mut s3: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CloudWatchLogs" => { + cloud_watch_logs = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Firehose" => { + firehose = ::serde::de::MapAccess::next_value(&mut map)?; + } + "S3" => { + s3 = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(WorkerLogDelivery { + cloud_watch_logs: cloud_watch_logs, + firehose: firehose, + s3: s3, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} diff --git a/src/aws/kendra.rs b/src/aws/kendra.rs index 4ccc9f6..425b17b 100644 --- a/src/aws/kendra.rs +++ b/src/aws/kendra.rs @@ -9,6 +9,11 @@ pub struct DataSource { /// Properties for the `DataSource` resource. #[derive(Debug, Default)] pub struct DataSourceProperties { + /// Property [`CustomDocumentEnrichmentConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-datasource.html#cfn-kendra-datasource-customdocumentenrichmentconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub custom_document_enrichment_configuration: Option<::Value>, /// Property [`DataSourceConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-datasource.html#cfn-kendra-datasource-datasourceconfiguration). /// /// Update type: _Mutable_. @@ -54,6 +59,9 @@ pub struct DataSourceProperties { impl ::serde::Serialize for DataSourceProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref custom_document_enrichment_configuration) = self.custom_document_enrichment_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CustomDocumentEnrichmentConfiguration", custom_document_enrichment_configuration)?; + } if let Some(ref data_source_configuration) = self.data_source_configuration { ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataSourceConfiguration", data_source_configuration)?; } @@ -88,6 +96,7 @@ impl<'de> ::serde::Deserialize<'de> for DataSourceProperties { } fn visit_map>(self, mut map: A) -> Result { + let mut custom_document_enrichment_configuration: Option<::Value> = None; let mut data_source_configuration: Option<::Value> = None; let mut description: Option<::Value> = None; let mut index_id: Option<::Value> = None; @@ -99,6 +108,9 @@ impl<'de> ::serde::Deserialize<'de> for DataSourceProperties { while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "CustomDocumentEnrichmentConfiguration" => { + custom_document_enrichment_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } "DataSourceConfiguration" => { data_source_configuration = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -128,6 +140,7 @@ impl<'de> ::serde::Deserialize<'de> for DataSourceProperties { } Ok(DataSourceProperties { + custom_document_enrichment_configuration: custom_document_enrichment_configuration, data_source_configuration: data_source_configuration, description: description, index_id: index_id.ok_or(::serde::de::Error::missing_field("IndexId"))?, @@ -1542,6 +1555,98 @@ pub mod data_source { } } + /// The [`AWS::Kendra::DataSource.CustomDocumentEnrichmentConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-customdocumentenrichmentconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct CustomDocumentEnrichmentConfiguration { + /// Property [`InlineConfigurations`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-customdocumentenrichmentconfiguration.html#cfn-kendra-datasource-customdocumentenrichmentconfiguration-inlineconfigurations). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub inline_configurations: Option<::ValueList>, + /// Property [`PostExtractionHookConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-customdocumentenrichmentconfiguration.html#cfn-kendra-datasource-customdocumentenrichmentconfiguration-postextractionhookconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub post_extraction_hook_configuration: Option<::Value>, + /// Property [`PreExtractionHookConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-customdocumentenrichmentconfiguration.html#cfn-kendra-datasource-customdocumentenrichmentconfiguration-preextractionhookconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub pre_extraction_hook_configuration: Option<::Value>, + /// Property [`RoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-customdocumentenrichmentconfiguration.html#cfn-kendra-datasource-customdocumentenrichmentconfiguration-rolearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub role_arn: Option<::Value>, + } + + impl ::codec::SerializeValue for CustomDocumentEnrichmentConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref inline_configurations) = self.inline_configurations { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InlineConfigurations", inline_configurations)?; + } + if let Some(ref post_extraction_hook_configuration) = self.post_extraction_hook_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PostExtractionHookConfiguration", post_extraction_hook_configuration)?; + } + if let Some(ref pre_extraction_hook_configuration) = self.pre_extraction_hook_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PreExtractionHookConfiguration", pre_extraction_hook_configuration)?; + } + if let Some(ref role_arn) = self.role_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RoleArn", role_arn)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CustomDocumentEnrichmentConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CustomDocumentEnrichmentConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CustomDocumentEnrichmentConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut inline_configurations: Option<::ValueList> = None; + let mut post_extraction_hook_configuration: Option<::Value> = None; + let mut pre_extraction_hook_configuration: Option<::Value> = None; + let mut role_arn: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "InlineConfigurations" => { + inline_configurations = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PostExtractionHookConfiguration" => { + post_extraction_hook_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PreExtractionHookConfiguration" => { + pre_extraction_hook_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RoleArn" => { + role_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CustomDocumentEnrichmentConfiguration { + inline_configurations: inline_configurations, + post_extraction_hook_configuration: post_extraction_hook_configuration, + pre_extraction_hook_configuration: pre_extraction_hook_configuration, + role_arn: role_arn, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::Kendra::DataSource.DataSourceConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourceconfiguration.html) property type. #[derive(Debug, Default)] pub struct DataSourceConfiguration { @@ -1585,6 +1690,16 @@ pub mod data_source { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub share_point_configuration: Option<::Value>, + /// Property [`WebCrawlerConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourceconfiguration.html#cfn-kendra-datasource-datasourceconfiguration-webcrawlerconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub web_crawler_configuration: Option<::Value>, + /// Property [`WorkDocsConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourceconfiguration.html#cfn-kendra-datasource-datasourceconfiguration-workdocsconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub work_docs_configuration: Option<::Value>, } impl ::codec::SerializeValue for DataSourceConfiguration { @@ -1614,6 +1729,12 @@ pub mod data_source { if let Some(ref share_point_configuration) = self.share_point_configuration { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SharePointConfiguration", share_point_configuration)?; } + if let Some(ref web_crawler_configuration) = self.web_crawler_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "WebCrawlerConfiguration", web_crawler_configuration)?; + } + if let Some(ref work_docs_configuration) = self.work_docs_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "WorkDocsConfiguration", work_docs_configuration)?; + } ::serde::ser::SerializeMap::end(map) } } @@ -1638,6 +1759,8 @@ pub mod data_source { let mut salesforce_configuration: Option<::Value> = None; let mut service_now_configuration: Option<::Value> = None; let mut share_point_configuration: Option<::Value> = None; + let mut web_crawler_configuration: Option<::Value> = None; + let mut work_docs_configuration: Option<::Value> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { @@ -1665,6 +1788,12 @@ pub mod data_source { "SharePointConfiguration" => { share_point_configuration = ::serde::de::MapAccess::next_value(&mut map)?; } + "WebCrawlerConfiguration" => { + web_crawler_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "WorkDocsConfiguration" => { + work_docs_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } _ => {} } } @@ -1678,6 +1807,8 @@ pub mod data_source { salesforce_configuration: salesforce_configuration, service_now_configuration: service_now_configuration, share_point_configuration: share_point_configuration, + web_crawler_configuration: web_crawler_configuration, + work_docs_configuration: work_docs_configuration, }) } } @@ -1935,6 +2066,250 @@ pub mod data_source { } } + /// The [`AWS::Kendra::DataSource.DocumentAttributeCondition`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributecondition.html) property type. + #[derive(Debug, Default)] + pub struct DocumentAttributeCondition { + /// Property [`ConditionDocumentAttributeKey`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributecondition.html#cfn-kendra-datasource-documentattributecondition-conditiondocumentattributekey). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub condition_document_attribute_key: ::Value, + /// Property [`ConditionOnValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributecondition.html#cfn-kendra-datasource-documentattributecondition-conditiononvalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub condition_on_value: Option<::Value>, + /// Property [`Operator`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributecondition.html#cfn-kendra-datasource-documentattributecondition-operator). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub operator: ::Value, + } + + impl ::codec::SerializeValue for DocumentAttributeCondition { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConditionDocumentAttributeKey", &self.condition_document_attribute_key)?; + if let Some(ref condition_on_value) = self.condition_on_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConditionOnValue", condition_on_value)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Operator", &self.operator)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for DocumentAttributeCondition { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = DocumentAttributeCondition; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type DocumentAttributeCondition") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut condition_document_attribute_key: Option<::Value> = None; + let mut condition_on_value: Option<::Value> = None; + let mut operator: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "ConditionDocumentAttributeKey" => { + condition_document_attribute_key = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ConditionOnValue" => { + condition_on_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Operator" => { + operator = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(DocumentAttributeCondition { + condition_document_attribute_key: condition_document_attribute_key.ok_or(::serde::de::Error::missing_field("ConditionDocumentAttributeKey"))?, + condition_on_value: condition_on_value, + operator: operator.ok_or(::serde::de::Error::missing_field("Operator"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Kendra::DataSource.DocumentAttributeTarget`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributetarget.html) property type. + #[derive(Debug, Default)] + pub struct DocumentAttributeTarget { + /// Property [`TargetDocumentAttributeKey`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributetarget.html#cfn-kendra-datasource-documentattributetarget-targetdocumentattributekey). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub target_document_attribute_key: ::Value, + /// Property [`TargetDocumentAttributeValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributetarget.html#cfn-kendra-datasource-documentattributetarget-targetdocumentattributevalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub target_document_attribute_value: Option<::Value>, + /// Property [`TargetDocumentAttributeValueDeletion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributetarget.html#cfn-kendra-datasource-documentattributetarget-targetdocumentattributevaluedeletion). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub target_document_attribute_value_deletion: Option<::Value>, + } + + impl ::codec::SerializeValue for DocumentAttributeTarget { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetDocumentAttributeKey", &self.target_document_attribute_key)?; + if let Some(ref target_document_attribute_value) = self.target_document_attribute_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetDocumentAttributeValue", target_document_attribute_value)?; + } + if let Some(ref target_document_attribute_value_deletion) = self.target_document_attribute_value_deletion { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetDocumentAttributeValueDeletion", target_document_attribute_value_deletion)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for DocumentAttributeTarget { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = DocumentAttributeTarget; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type DocumentAttributeTarget") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut target_document_attribute_key: Option<::Value> = None; + let mut target_document_attribute_value: Option<::Value> = None; + let mut target_document_attribute_value_deletion: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "TargetDocumentAttributeKey" => { + target_document_attribute_key = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TargetDocumentAttributeValue" => { + target_document_attribute_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TargetDocumentAttributeValueDeletion" => { + target_document_attribute_value_deletion = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(DocumentAttributeTarget { + target_document_attribute_key: target_document_attribute_key.ok_or(::serde::de::Error::missing_field("TargetDocumentAttributeKey"))?, + target_document_attribute_value: target_document_attribute_value, + target_document_attribute_value_deletion: target_document_attribute_value_deletion, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Kendra::DataSource.DocumentAttributeValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributevalue.html) property type. + #[derive(Debug, Default)] + pub struct DocumentAttributeValue { + /// Property [`DateValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributevalue.html#cfn-kendra-datasource-documentattributevalue-datevalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub date_value: Option<::Value>, + /// Property [`LongValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributevalue.html#cfn-kendra-datasource-documentattributevalue-longvalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub long_value: Option<::Value>, + /// Property [`StringListValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributevalue.html#cfn-kendra-datasource-documentattributevalue-stringlistvalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub string_list_value: Option<::ValueList>, + /// Property [`StringValue`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentattributevalue.html#cfn-kendra-datasource-documentattributevalue-stringvalue). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub string_value: Option<::Value>, + } + + impl ::codec::SerializeValue for DocumentAttributeValue { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref date_value) = self.date_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DateValue", date_value)?; + } + if let Some(ref long_value) = self.long_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LongValue", long_value)?; + } + if let Some(ref string_list_value) = self.string_list_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "StringListValue", string_list_value)?; + } + if let Some(ref string_value) = self.string_value { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "StringValue", string_value)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for DocumentAttributeValue { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = DocumentAttributeValue; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type DocumentAttributeValue") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut date_value: Option<::Value> = None; + let mut long_value: Option<::Value> = None; + let mut string_list_value: Option<::ValueList> = None; + let mut string_value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DateValue" => { + date_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LongValue" => { + long_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + "StringListValue" => { + string_list_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + "StringValue" => { + string_value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(DocumentAttributeValue { + date_value: date_value, + long_value: long_value, + string_list_value: string_list_value, + string_value: string_value, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::Kendra::DataSource.DocumentsMetadataConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentsmetadataconfiguration.html) property type. #[derive(Debug, Default)] pub struct DocumentsMetadataConfiguration { @@ -2117,74 +2492,228 @@ pub mod data_source { } } - /// The [`AWS::Kendra::DataSource.OneDriveConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html) property type. + /// The [`AWS::Kendra::DataSource.HookConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-hookconfiguration.html) property type. #[derive(Debug, Default)] - pub struct OneDriveConfiguration { - /// Property [`DisableLocalGroups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-disablelocalgroups). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub disable_local_groups: Option<::Value>, - /// Property [`ExclusionPatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-exclusionpatterns). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub exclusion_patterns: Option<::ValueList>, - /// Property [`FieldMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-fieldmappings). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub field_mappings: Option<::ValueList>, - /// Property [`InclusionPatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-inclusionpatterns). - /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. - pub inclusion_patterns: Option<::ValueList>, - /// Property [`OneDriveUsers`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-onedriveusers). + pub struct HookConfiguration { + /// Property [`InvocationCondition`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-hookconfiguration.html#cfn-kendra-datasource-hookconfiguration-invocationcondition). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub one_drive_users: ::Value, - /// Property [`SecretArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-secretarn). + pub invocation_condition: Option<::Value>, + /// Property [`LambdaArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-hookconfiguration.html#cfn-kendra-datasource-hookconfiguration-lambdaarn). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub secret_arn: ::Value, - /// Property [`TenantDomain`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-tenantdomain). + pub lambda_arn: ::Value, + /// Property [`S3Bucket`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-hookconfiguration.html#cfn-kendra-datasource-hookconfiguration-s3bucket). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub tenant_domain: ::Value, + pub s3_bucket: ::Value, } - impl ::codec::SerializeValue for OneDriveConfiguration { + impl ::codec::SerializeValue for HookConfiguration { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; - if let Some(ref disable_local_groups) = self.disable_local_groups { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "DisableLocalGroups", disable_local_groups)?; - } - if let Some(ref exclusion_patterns) = self.exclusion_patterns { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExclusionPatterns", exclusion_patterns)?; - } - if let Some(ref field_mappings) = self.field_mappings { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "FieldMappings", field_mappings)?; - } - if let Some(ref inclusion_patterns) = self.inclusion_patterns { - ::serde::ser::SerializeMap::serialize_entry(&mut map, "InclusionPatterns", inclusion_patterns)?; + if let Some(ref invocation_condition) = self.invocation_condition { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InvocationCondition", invocation_condition)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "OneDriveUsers", &self.one_drive_users)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretArn", &self.secret_arn)?; - ::serde::ser::SerializeMap::serialize_entry(&mut map, "TenantDomain", &self.tenant_domain)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LambdaArn", &self.lambda_arn)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3Bucket", &self.s3_bucket)?; ::serde::ser::SerializeMap::end(map) } } - impl ::codec::DeserializeValue for OneDriveConfiguration { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + impl ::codec::DeserializeValue for HookConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { struct Visitor; impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = OneDriveConfiguration; + type Value = HookConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type HookConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut invocation_condition: Option<::Value> = None; + let mut lambda_arn: Option<::Value> = None; + let mut s3_bucket: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "InvocationCondition" => { + invocation_condition = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LambdaArn" => { + lambda_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "S3Bucket" => { + s3_bucket = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(HookConfiguration { + invocation_condition: invocation_condition, + lambda_arn: lambda_arn.ok_or(::serde::de::Error::missing_field("LambdaArn"))?, + s3_bucket: s3_bucket.ok_or(::serde::de::Error::missing_field("S3Bucket"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Kendra::DataSource.InlineCustomDocumentEnrichmentConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-inlinecustomdocumentenrichmentconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct InlineCustomDocumentEnrichmentConfiguration { + /// Property [`Condition`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-inlinecustomdocumentenrichmentconfiguration.html#cfn-kendra-datasource-inlinecustomdocumentenrichmentconfiguration-condition). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub condition: Option<::Value>, + /// Property [`DocumentContentDeletion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-inlinecustomdocumentenrichmentconfiguration.html#cfn-kendra-datasource-inlinecustomdocumentenrichmentconfiguration-documentcontentdeletion). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub document_content_deletion: Option<::Value>, + /// Property [`Target`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-inlinecustomdocumentenrichmentconfiguration.html#cfn-kendra-datasource-inlinecustomdocumentenrichmentconfiguration-target). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub target: Option<::Value>, + } + + impl ::codec::SerializeValue for InlineCustomDocumentEnrichmentConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref condition) = self.condition { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Condition", condition)?; + } + if let Some(ref document_content_deletion) = self.document_content_deletion { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentContentDeletion", document_content_deletion)?; + } + if let Some(ref target) = self.target { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Target", target)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for InlineCustomDocumentEnrichmentConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = InlineCustomDocumentEnrichmentConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type InlineCustomDocumentEnrichmentConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut condition: Option<::Value> = None; + let mut document_content_deletion: Option<::Value> = None; + let mut target: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Condition" => { + condition = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DocumentContentDeletion" => { + document_content_deletion = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Target" => { + target = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(InlineCustomDocumentEnrichmentConfiguration { + condition: condition, + document_content_deletion: document_content_deletion, + target: target, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Kendra::DataSource.OneDriveConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct OneDriveConfiguration { + /// Property [`DisableLocalGroups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-disablelocalgroups). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub disable_local_groups: Option<::Value>, + /// Property [`ExclusionPatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-exclusionpatterns). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub exclusion_patterns: Option<::ValueList>, + /// Property [`FieldMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-fieldmappings). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub field_mappings: Option<::ValueList>, + /// Property [`InclusionPatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-inclusionpatterns). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub inclusion_patterns: Option<::ValueList>, + /// Property [`OneDriveUsers`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-onedriveusers). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub one_drive_users: ::Value, + /// Property [`SecretArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-secretarn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub secret_arn: ::Value, + /// Property [`TenantDomain`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-tenantdomain). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tenant_domain: ::Value, + } + + impl ::codec::SerializeValue for OneDriveConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref disable_local_groups) = self.disable_local_groups { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DisableLocalGroups", disable_local_groups)?; + } + if let Some(ref exclusion_patterns) = self.exclusion_patterns { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExclusionPatterns", exclusion_patterns)?; + } + if let Some(ref field_mappings) = self.field_mappings { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FieldMappings", field_mappings)?; + } + if let Some(ref inclusion_patterns) = self.inclusion_patterns { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InclusionPatterns", inclusion_patterns)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OneDriveUsers", &self.one_drive_users)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretArn", &self.secret_arn)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TenantDomain", &self.tenant_domain)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for OneDriveConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = OneDriveConfiguration; fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { write!(f, "a struct of type OneDriveConfiguration") @@ -2308,6 +2837,81 @@ pub mod data_source { } } + /// The [`AWS::Kendra::DataSource.ProxyConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-proxyconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct ProxyConfiguration { + /// Property [`Credentials`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-proxyconfiguration.html#cfn-kendra-datasource-proxyconfiguration-credentials). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub credentials: Option<::Value>, + /// Property [`Host`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-proxyconfiguration.html#cfn-kendra-datasource-proxyconfiguration-host). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub host: ::Value, + /// Property [`Port`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-proxyconfiguration.html#cfn-kendra-datasource-proxyconfiguration-port). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub port: ::Value, + } + + impl ::codec::SerializeValue for ProxyConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref credentials) = self.credentials { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Credentials", credentials)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Host", &self.host)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Port", &self.port)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ProxyConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ProxyConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ProxyConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut credentials: Option<::Value> = None; + let mut host: Option<::Value> = None; + let mut port: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Credentials" => { + credentials = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Host" => { + host = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Port" => { + port = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ProxyConfiguration { + credentials: credentials, + host: host.ok_or(::serde::de::Error::missing_field("Host"))?, + port: port.ok_or(::serde::de::Error::missing_field("Port"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::Kendra::DataSource.S3DataSourceConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-s3datasourceconfiguration.html) property type. #[derive(Debug, Default)] pub struct S3DataSourceConfiguration { @@ -3128,6 +3732,11 @@ pub mod data_source { /// The [`AWS::Kendra::DataSource.ServiceNowConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowconfiguration.html) property type. #[derive(Debug, Default)] pub struct ServiceNowConfiguration { + /// Property [`AuthenticationType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowconfiguration.html#cfn-kendra-datasource-servicenowconfiguration-authenticationtype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub authentication_type: Option<::Value>, /// Property [`HostUrl`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowconfiguration.html#cfn-kendra-datasource-servicenowconfiguration-hosturl). /// /// Update type: _Mutable_. @@ -3158,6 +3767,9 @@ pub mod data_source { impl ::codec::SerializeValue for ServiceNowConfiguration { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref authentication_type) = self.authentication_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AuthenticationType", authentication_type)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "HostUrl", &self.host_url)?; if let Some(ref knowledge_article_configuration) = self.knowledge_article_configuration { ::serde::ser::SerializeMap::serialize_entry(&mut map, "KnowledgeArticleConfiguration", knowledge_article_configuration)?; @@ -3183,6 +3795,7 @@ pub mod data_source { } fn visit_map>(self, mut map: A) -> Result { + let mut authentication_type: Option<::Value> = None; let mut host_url: Option<::Value> = None; let mut knowledge_article_configuration: Option<::Value> = None; let mut secret_arn: Option<::Value> = None; @@ -3191,6 +3804,9 @@ pub mod data_source { while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "AuthenticationType" => { + authentication_type = ::serde::de::MapAccess::next_value(&mut map)?; + } "HostUrl" => { host_url = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -3211,6 +3827,7 @@ pub mod data_source { } Ok(ServiceNowConfiguration { + authentication_type: authentication_type, host_url: host_url.ok_or(::serde::de::Error::missing_field("HostUrl"))?, knowledge_article_configuration: knowledge_article_configuration, secret_arn: secret_arn.ok_or(::serde::de::Error::missing_field("SecretArn"))?, @@ -3252,6 +3869,11 @@ pub mod data_source { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub field_mappings: Option<::ValueList>, + /// Property [`FilterQuery`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowknowledgearticleconfiguration.html#cfn-kendra-datasource-servicenowknowledgearticleconfiguration-filterquery). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub filter_query: Option<::Value>, /// Property [`IncludeAttachmentFilePatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowknowledgearticleconfiguration.html#cfn-kendra-datasource-servicenowknowledgearticleconfiguration-includeattachmentfilepatterns). /// /// Update type: _Mutable_. @@ -3275,6 +3897,9 @@ pub mod data_source { if let Some(ref field_mappings) = self.field_mappings { ::serde::ser::SerializeMap::serialize_entry(&mut map, "FieldMappings", field_mappings)?; } + if let Some(ref filter_query) = self.filter_query { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FilterQuery", filter_query)?; + } if let Some(ref include_attachment_file_patterns) = self.include_attachment_file_patterns { ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludeAttachmentFilePatterns", include_attachment_file_patterns)?; } @@ -3299,6 +3924,7 @@ pub mod data_source { let mut document_title_field_name: Option<::Value> = None; let mut exclude_attachment_file_patterns: Option<::ValueList> = None; let mut field_mappings: Option<::ValueList> = None; + let mut filter_query: Option<::Value> = None; let mut include_attachment_file_patterns: Option<::ValueList> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { @@ -3318,6 +3944,9 @@ pub mod data_source { "FieldMappings" => { field_mappings = ::serde::de::MapAccess::next_value(&mut map)?; } + "FilterQuery" => { + filter_query = ::serde::de::MapAccess::next_value(&mut map)?; + } "IncludeAttachmentFilePatterns" => { include_attachment_file_patterns = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -3331,6 +3960,7 @@ pub mod data_source { document_title_field_name: document_title_field_name, exclude_attachment_file_patterns: exclude_attachment_file_patterns, field_mappings: field_mappings, + filter_query: filter_query, include_attachment_file_patterns: include_attachment_file_patterns, }) } @@ -3499,6 +4129,11 @@ pub mod data_source { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub share_point_version: ::Value, + /// Property [`SslCertificateS3Path`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-sslcertificates3path). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ssl_certificate_s3_path: Option<::Value>, /// Property [`Urls`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-urls). /// /// Update type: _Mutable_. @@ -3539,6 +4174,9 @@ pub mod data_source { } ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretArn", &self.secret_arn)?; ::serde::ser::SerializeMap::serialize_entry(&mut map, "SharePointVersion", &self.share_point_version)?; + if let Some(ref ssl_certificate_s3_path) = self.ssl_certificate_s3_path { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SslCertificateS3Path", ssl_certificate_s3_path)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "Urls", &self.urls)?; if let Some(ref use_change_log) = self.use_change_log { ::serde::ser::SerializeMap::serialize_entry(&mut map, "UseChangeLog", use_change_log)?; @@ -3570,6 +4208,7 @@ pub mod data_source { let mut inclusion_patterns: Option<::ValueList> = None; let mut secret_arn: Option<::Value> = None; let mut share_point_version: Option<::Value> = None; + let mut ssl_certificate_s3_path: Option<::Value> = None; let mut urls: Option<::ValueList> = None; let mut use_change_log: Option<::Value> = None; let mut vpc_configuration: Option<::Value> = None; @@ -3600,6 +4239,9 @@ pub mod data_source { "SharePointVersion" => { share_point_version = ::serde::de::MapAccess::next_value(&mut map)?; } + "SslCertificateS3Path" => { + ssl_certificate_s3_path = ::serde::de::MapAccess::next_value(&mut map)?; + } "Urls" => { urls = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -3622,6 +4264,7 @@ pub mod data_source { inclusion_patterns: inclusion_patterns, secret_arn: secret_arn.ok_or(::serde::de::Error::missing_field("SecretArn"))?, share_point_version: share_point_version.ok_or(::serde::de::Error::missing_field("SharePointVersion"))?, + ssl_certificate_s3_path: ssl_certificate_s3_path, urls: urls.ok_or(::serde::de::Error::missing_field("Urls"))?, use_change_log: use_change_log, vpc_configuration: vpc_configuration, @@ -3685,6 +4328,584 @@ pub mod data_source { d.deserialize_map(Visitor) } } + + /// The [`AWS::Kendra::DataSource.WebCrawlerAuthenticationConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerauthenticationconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct WebCrawlerAuthenticationConfiguration { + /// Property [`BasicAuthentication`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerauthenticationconfiguration.html#cfn-kendra-datasource-webcrawlerauthenticationconfiguration-basicauthentication). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub basic_authentication: Option<::ValueList>, + } + + impl ::codec::SerializeValue for WebCrawlerAuthenticationConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref basic_authentication) = self.basic_authentication { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BasicAuthentication", basic_authentication)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for WebCrawlerAuthenticationConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = WebCrawlerAuthenticationConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type WebCrawlerAuthenticationConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut basic_authentication: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "BasicAuthentication" => { + basic_authentication = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(WebCrawlerAuthenticationConfiguration { + basic_authentication: basic_authentication, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Kendra::DataSource.WebCrawlerBasicAuthentication`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerbasicauthentication.html) property type. + #[derive(Debug, Default)] + pub struct WebCrawlerBasicAuthentication { + /// Property [`Credentials`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerbasicauthentication.html#cfn-kendra-datasource-webcrawlerbasicauthentication-credentials). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub credentials: ::Value, + /// Property [`Host`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerbasicauthentication.html#cfn-kendra-datasource-webcrawlerbasicauthentication-host). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub host: ::Value, + /// Property [`Port`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerbasicauthentication.html#cfn-kendra-datasource-webcrawlerbasicauthentication-port). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub port: ::Value, + } + + impl ::codec::SerializeValue for WebCrawlerBasicAuthentication { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Credentials", &self.credentials)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Host", &self.host)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Port", &self.port)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for WebCrawlerBasicAuthentication { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = WebCrawlerBasicAuthentication; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type WebCrawlerBasicAuthentication") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut credentials: Option<::Value> = None; + let mut host: Option<::Value> = None; + let mut port: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Credentials" => { + credentials = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Host" => { + host = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Port" => { + port = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(WebCrawlerBasicAuthentication { + credentials: credentials.ok_or(::serde::de::Error::missing_field("Credentials"))?, + host: host.ok_or(::serde::de::Error::missing_field("Host"))?, + port: port.ok_or(::serde::de::Error::missing_field("Port"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Kendra::DataSource.WebCrawlerConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct WebCrawlerConfiguration { + /// Property [`AuthenticationConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerconfiguration.html#cfn-kendra-datasource-webcrawlerconfiguration-authenticationconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub authentication_configuration: Option<::Value>, + /// Property [`CrawlDepth`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerconfiguration.html#cfn-kendra-datasource-webcrawlerconfiguration-crawldepth). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub crawl_depth: Option<::Value>, + /// Property [`MaxContentSizePerPageInMegaBytes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerconfiguration.html#cfn-kendra-datasource-webcrawlerconfiguration-maxcontentsizeperpageinmegabytes). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub max_content_size_per_page_in_mega_bytes: Option<::Value>, + /// Property [`MaxLinksPerPage`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerconfiguration.html#cfn-kendra-datasource-webcrawlerconfiguration-maxlinksperpage). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub max_links_per_page: Option<::Value>, + /// Property [`MaxUrlsPerMinuteCrawlRate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerconfiguration.html#cfn-kendra-datasource-webcrawlerconfiguration-maxurlsperminutecrawlrate). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub max_urls_per_minute_crawl_rate: Option<::Value>, + /// Property [`ProxyConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerconfiguration.html#cfn-kendra-datasource-webcrawlerconfiguration-proxyconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub proxy_configuration: Option<::Value>, + /// Property [`UrlExclusionPatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerconfiguration.html#cfn-kendra-datasource-webcrawlerconfiguration-urlexclusionpatterns). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub url_exclusion_patterns: Option<::ValueList>, + /// Property [`UrlInclusionPatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerconfiguration.html#cfn-kendra-datasource-webcrawlerconfiguration-urlinclusionpatterns). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub url_inclusion_patterns: Option<::ValueList>, + /// Property [`Urls`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerconfiguration.html#cfn-kendra-datasource-webcrawlerconfiguration-urls). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub urls: ::Value, + } + + impl ::codec::SerializeValue for WebCrawlerConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref authentication_configuration) = self.authentication_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AuthenticationConfiguration", authentication_configuration)?; + } + if let Some(ref crawl_depth) = self.crawl_depth { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CrawlDepth", crawl_depth)?; + } + if let Some(ref max_content_size_per_page_in_mega_bytes) = self.max_content_size_per_page_in_mega_bytes { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxContentSizePerPageInMegaBytes", max_content_size_per_page_in_mega_bytes)?; + } + if let Some(ref max_links_per_page) = self.max_links_per_page { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxLinksPerPage", max_links_per_page)?; + } + if let Some(ref max_urls_per_minute_crawl_rate) = self.max_urls_per_minute_crawl_rate { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxUrlsPerMinuteCrawlRate", max_urls_per_minute_crawl_rate)?; + } + if let Some(ref proxy_configuration) = self.proxy_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ProxyConfiguration", proxy_configuration)?; + } + if let Some(ref url_exclusion_patterns) = self.url_exclusion_patterns { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UrlExclusionPatterns", url_exclusion_patterns)?; + } + if let Some(ref url_inclusion_patterns) = self.url_inclusion_patterns { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UrlInclusionPatterns", url_inclusion_patterns)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Urls", &self.urls)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for WebCrawlerConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = WebCrawlerConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type WebCrawlerConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut authentication_configuration: Option<::Value> = None; + let mut crawl_depth: Option<::Value> = None; + let mut max_content_size_per_page_in_mega_bytes: Option<::Value> = None; + let mut max_links_per_page: Option<::Value> = None; + let mut max_urls_per_minute_crawl_rate: Option<::Value> = None; + let mut proxy_configuration: Option<::Value> = None; + let mut url_exclusion_patterns: Option<::ValueList> = None; + let mut url_inclusion_patterns: Option<::ValueList> = None; + let mut urls: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AuthenticationConfiguration" => { + authentication_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CrawlDepth" => { + crawl_depth = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MaxContentSizePerPageInMegaBytes" => { + max_content_size_per_page_in_mega_bytes = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MaxLinksPerPage" => { + max_links_per_page = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MaxUrlsPerMinuteCrawlRate" => { + max_urls_per_minute_crawl_rate = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ProxyConfiguration" => { + proxy_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UrlExclusionPatterns" => { + url_exclusion_patterns = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UrlInclusionPatterns" => { + url_inclusion_patterns = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Urls" => { + urls = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(WebCrawlerConfiguration { + authentication_configuration: authentication_configuration, + crawl_depth: crawl_depth, + max_content_size_per_page_in_mega_bytes: max_content_size_per_page_in_mega_bytes, + max_links_per_page: max_links_per_page, + max_urls_per_minute_crawl_rate: max_urls_per_minute_crawl_rate, + proxy_configuration: proxy_configuration, + url_exclusion_patterns: url_exclusion_patterns, + url_inclusion_patterns: url_inclusion_patterns, + urls: urls.ok_or(::serde::de::Error::missing_field("Urls"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Kendra::DataSource.WebCrawlerSeedUrlConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerseedurlconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct WebCrawlerSeedUrlConfiguration { + /// Property [`SeedUrls`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerseedurlconfiguration.html#cfn-kendra-datasource-webcrawlerseedurlconfiguration-seedurls). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub seed_urls: ::ValueList, + /// Property [`WebCrawlerMode`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerseedurlconfiguration.html#cfn-kendra-datasource-webcrawlerseedurlconfiguration-webcrawlermode). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub web_crawler_mode: Option<::Value>, + } + + impl ::codec::SerializeValue for WebCrawlerSeedUrlConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SeedUrls", &self.seed_urls)?; + if let Some(ref web_crawler_mode) = self.web_crawler_mode { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "WebCrawlerMode", web_crawler_mode)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for WebCrawlerSeedUrlConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = WebCrawlerSeedUrlConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type WebCrawlerSeedUrlConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut seed_urls: Option<::ValueList> = None; + let mut web_crawler_mode: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "SeedUrls" => { + seed_urls = ::serde::de::MapAccess::next_value(&mut map)?; + } + "WebCrawlerMode" => { + web_crawler_mode = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(WebCrawlerSeedUrlConfiguration { + seed_urls: seed_urls.ok_or(::serde::de::Error::missing_field("SeedUrls"))?, + web_crawler_mode: web_crawler_mode, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Kendra::DataSource.WebCrawlerSiteMapsConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlersitemapsconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct WebCrawlerSiteMapsConfiguration { + /// Property [`SiteMaps`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlersitemapsconfiguration.html#cfn-kendra-datasource-webcrawlersitemapsconfiguration-sitemaps). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub site_maps: ::ValueList, + } + + impl ::codec::SerializeValue for WebCrawlerSiteMapsConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SiteMaps", &self.site_maps)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for WebCrawlerSiteMapsConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = WebCrawlerSiteMapsConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type WebCrawlerSiteMapsConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut site_maps: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "SiteMaps" => { + site_maps = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(WebCrawlerSiteMapsConfiguration { + site_maps: site_maps.ok_or(::serde::de::Error::missing_field("SiteMaps"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Kendra::DataSource.WebCrawlerUrls`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerurls.html) property type. + #[derive(Debug, Default)] + pub struct WebCrawlerUrls { + /// Property [`SeedUrlConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerurls.html#cfn-kendra-datasource-webcrawlerurls-seedurlconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub seed_url_configuration: Option<::Value>, + /// Property [`SiteMapsConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-webcrawlerurls.html#cfn-kendra-datasource-webcrawlerurls-sitemapsconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub site_maps_configuration: Option<::Value>, + } + + impl ::codec::SerializeValue for WebCrawlerUrls { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref seed_url_configuration) = self.seed_url_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SeedUrlConfiguration", seed_url_configuration)?; + } + if let Some(ref site_maps_configuration) = self.site_maps_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SiteMapsConfiguration", site_maps_configuration)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for WebCrawlerUrls { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = WebCrawlerUrls; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type WebCrawlerUrls") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut seed_url_configuration: Option<::Value> = None; + let mut site_maps_configuration: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "SeedUrlConfiguration" => { + seed_url_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SiteMapsConfiguration" => { + site_maps_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(WebCrawlerUrls { + seed_url_configuration: seed_url_configuration, + site_maps_configuration: site_maps_configuration, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Kendra::DataSource.WorkDocsConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-workdocsconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct WorkDocsConfiguration { + /// Property [`CrawlComments`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-workdocsconfiguration.html#cfn-kendra-datasource-workdocsconfiguration-crawlcomments). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub crawl_comments: Option<::Value>, + /// Property [`ExclusionPatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-workdocsconfiguration.html#cfn-kendra-datasource-workdocsconfiguration-exclusionpatterns). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub exclusion_patterns: Option<::ValueList>, + /// Property [`FieldMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-workdocsconfiguration.html#cfn-kendra-datasource-workdocsconfiguration-fieldmappings). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub field_mappings: Option<::ValueList>, + /// Property [`InclusionPatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-workdocsconfiguration.html#cfn-kendra-datasource-workdocsconfiguration-inclusionpatterns). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub inclusion_patterns: Option<::ValueList>, + /// Property [`OrganizationId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-workdocsconfiguration.html#cfn-kendra-datasource-workdocsconfiguration-organizationid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub organization_id: ::Value, + /// Property [`UseChangeLog`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-workdocsconfiguration.html#cfn-kendra-datasource-workdocsconfiguration-usechangelog). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub use_change_log: Option<::Value>, + } + + impl ::codec::SerializeValue for WorkDocsConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref crawl_comments) = self.crawl_comments { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CrawlComments", crawl_comments)?; + } + if let Some(ref exclusion_patterns) = self.exclusion_patterns { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExclusionPatterns", exclusion_patterns)?; + } + if let Some(ref field_mappings) = self.field_mappings { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FieldMappings", field_mappings)?; + } + if let Some(ref inclusion_patterns) = self.inclusion_patterns { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "InclusionPatterns", inclusion_patterns)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "OrganizationId", &self.organization_id)?; + if let Some(ref use_change_log) = self.use_change_log { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UseChangeLog", use_change_log)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for WorkDocsConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = WorkDocsConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type WorkDocsConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut crawl_comments: Option<::Value> = None; + let mut exclusion_patterns: Option<::ValueList> = None; + let mut field_mappings: Option<::ValueList> = None; + let mut inclusion_patterns: Option<::ValueList> = None; + let mut organization_id: Option<::Value> = None; + let mut use_change_log: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CrawlComments" => { + crawl_comments = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ExclusionPatterns" => { + exclusion_patterns = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FieldMappings" => { + field_mappings = ::serde::de::MapAccess::next_value(&mut map)?; + } + "InclusionPatterns" => { + inclusion_patterns = ::serde::de::MapAccess::next_value(&mut map)?; + } + "OrganizationId" => { + organization_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UseChangeLog" => { + use_change_log = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(WorkDocsConfiguration { + crawl_comments: crawl_comments, + exclusion_patterns: exclusion_patterns, + field_mappings: field_mappings, + inclusion_patterns: inclusion_patterns, + organization_id: organization_id.ok_or(::serde::de::Error::missing_field("OrganizationId"))?, + use_change_log: use_change_log, + }) + } + } + + d.deserialize_map(Visitor) + } + } } pub mod faq { diff --git a/src/aws/kinesis.rs b/src/aws/kinesis.rs index 6d296e8..302dd46 100644 --- a/src/aws/kinesis.rs +++ b/src/aws/kinesis.rs @@ -23,12 +23,17 @@ pub struct StreamProperties { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub shard_count: ::Value, + pub shard_count: Option<::Value>, /// Property [`StreamEncryption`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesis-stream.html#cfn-kinesis-stream-streamencryption). /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub stream_encryption: Option<::Value>, + /// Property [`StreamModeDetails`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesis-stream.html#cfn-kinesis-stream-streammodedetails). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub stream_mode_details: Option<::Value>, /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesis-stream.html#cfn-kinesis-stream-tags). /// /// Update type: _Mutable_. @@ -45,10 +50,15 @@ impl ::serde::Serialize for StreamProperties { if let Some(ref retention_period_hours) = self.retention_period_hours { ::serde::ser::SerializeMap::serialize_entry(&mut map, "RetentionPeriodHours", retention_period_hours)?; } - ::serde::ser::SerializeMap::serialize_entry(&mut map, "ShardCount", &self.shard_count)?; + if let Some(ref shard_count) = self.shard_count { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ShardCount", shard_count)?; + } if let Some(ref stream_encryption) = self.stream_encryption { ::serde::ser::SerializeMap::serialize_entry(&mut map, "StreamEncryption", stream_encryption)?; } + if let Some(ref stream_mode_details) = self.stream_mode_details { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "StreamModeDetails", stream_mode_details)?; + } if let Some(ref tags) = self.tags { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; } @@ -72,6 +82,7 @@ impl<'de> ::serde::Deserialize<'de> for StreamProperties { let mut retention_period_hours: Option<::Value> = None; let mut shard_count: Option<::Value> = None; let mut stream_encryption: Option<::Value> = None; + let mut stream_mode_details: Option<::Value> = None; let mut tags: Option<::ValueList<::Tag>> = None; while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { @@ -88,6 +99,9 @@ impl<'de> ::serde::Deserialize<'de> for StreamProperties { "StreamEncryption" => { stream_encryption = ::serde::de::MapAccess::next_value(&mut map)?; } + "StreamModeDetails" => { + stream_mode_details = ::serde::de::MapAccess::next_value(&mut map)?; + } "Tags" => { tags = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -98,8 +112,9 @@ impl<'de> ::serde::Deserialize<'de> for StreamProperties { Ok(StreamProperties { name: name, retention_period_hours: retention_period_hours, - shard_count: shard_count.ok_or(::serde::de::Error::missing_field("ShardCount"))?, + shard_count: shard_count, stream_encryption: stream_encryption, + stream_mode_details: stream_mode_details, tags: tags, }) } @@ -279,4 +294,55 @@ pub mod stream { d.deserialize_map(Visitor) } } + + /// The [`AWS::Kinesis::Stream.StreamModeDetails`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesis-stream-streammodedetails.html) property type. + #[derive(Debug, Default)] + pub struct StreamModeDetails { + /// Property [`StreamMode`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesis-stream-streammodedetails.html#cfn-kinesis-stream-streammodedetails-streammode). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub stream_mode: ::Value, + } + + impl ::codec::SerializeValue for StreamModeDetails { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "StreamMode", &self.stream_mode)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for StreamModeDetails { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = StreamModeDetails; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type StreamModeDetails") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut stream_mode: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "StreamMode" => { + stream_mode = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(StreamModeDetails { + stream_mode: stream_mode.ok_or(::serde::de::Error::missing_field("StreamMode"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } } diff --git a/src/aws/kinesisanalyticsv2.rs b/src/aws/kinesisanalyticsv2.rs index f13fea1..0fe4858 100644 --- a/src/aws/kinesisanalyticsv2.rs +++ b/src/aws/kinesisanalyticsv2.rs @@ -1008,38 +1008,6 @@ pub mod application { } } - /// The [`AWS::KinesisAnalyticsV2::Application.CustomArtifactsConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-customartifactsconfiguration.html) property type. - #[derive(Debug, Default)] - pub struct CustomArtifactsConfiguration { - } - - impl ::codec::SerializeValue for CustomArtifactsConfiguration { - fn serialize(&self, s: S) -> Result { - let map = ::serde::Serializer::serialize_map(s, None)?; - ::serde::ser::SerializeMap::end(map) - } - } - - impl ::codec::DeserializeValue for CustomArtifactsConfiguration { - fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { - struct Visitor; - - impl<'de> ::serde::de::Visitor<'de> for Visitor { - type Value = CustomArtifactsConfiguration; - - fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { - write!(f, "a struct of type CustomArtifactsConfiguration") - } - - fn visit_map>(self, _map: A) -> Result { - Ok(CustomArtifactsConfiguration {}) - } - } - - d.deserialize_map(Visitor) - } - } - /// The [`AWS::KinesisAnalyticsV2::Application.DeployAsApplicationConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-deployasapplicationconfiguration.html) property type. #[derive(Debug, Default)] pub struct DeployAsApplicationConfiguration { @@ -2492,7 +2460,7 @@ pub mod application { /// /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. - pub custom_artifacts_configuration: Option<::Value>, + pub custom_artifacts_configuration: Option<::ValueList>, /// Property [`DeployAsApplicationConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-zeppelinapplicationconfiguration.html#cfn-kinesisanalyticsv2-application-zeppelinapplicationconfiguration-deployasapplicationconfiguration). /// /// Update type: _Mutable_. @@ -2537,7 +2505,7 @@ pub mod application { fn visit_map>(self, mut map: A) -> Result { let mut catalog_configuration: Option<::Value> = None; - let mut custom_artifacts_configuration: Option<::Value> = None; + let mut custom_artifacts_configuration: Option<::ValueList> = None; let mut deploy_as_application_configuration: Option<::Value> = None; let mut monitoring_configuration: Option<::Value> = None; diff --git a/src/aws/kinesisfirehose.rs b/src/aws/kinesisfirehose.rs index 42bbd0a..eb96144 100644 --- a/src/aws/kinesisfirehose.rs +++ b/src/aws/kinesisfirehose.rs @@ -9,6 +9,11 @@ pub struct DeliveryStream { /// Properties for the `DeliveryStream` resource. #[derive(Debug, Default)] pub struct DeliveryStreamProperties { + /// Property [`AmazonopensearchserviceDestinationConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisfirehose-deliverystream.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub amazonopensearchservice_destination_configuration: Option<::Value>, /// Property [`DeliveryStreamEncryptionConfigurationInput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisfirehose-deliverystream.html#cfn-kinesisfirehose-deliverystream-deliverystreamencryptionconfigurationinput). /// /// Update type: _Mutable_. @@ -69,6 +74,9 @@ pub struct DeliveryStreamProperties { impl ::serde::Serialize for DeliveryStreamProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref amazonopensearchservice_destination_configuration) = self.amazonopensearchservice_destination_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AmazonopensearchserviceDestinationConfiguration", amazonopensearchservice_destination_configuration)?; + } if let Some(ref delivery_stream_encryption_configuration_input) = self.delivery_stream_encryption_configuration_input { ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeliveryStreamEncryptionConfigurationInput", delivery_stream_encryption_configuration_input)?; } @@ -118,6 +126,7 @@ impl<'de> ::serde::Deserialize<'de> for DeliveryStreamProperties { } fn visit_map>(self, mut map: A) -> Result { + let mut amazonopensearchservice_destination_configuration: Option<::Value> = None; let mut delivery_stream_encryption_configuration_input: Option<::Value> = None; let mut delivery_stream_name: Option<::Value> = None; let mut delivery_stream_type: Option<::Value> = None; @@ -132,6 +141,9 @@ impl<'de> ::serde::Deserialize<'de> for DeliveryStreamProperties { while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "AmazonopensearchserviceDestinationConfiguration" => { + amazonopensearchservice_destination_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } "DeliveryStreamEncryptionConfigurationInput" => { delivery_stream_encryption_configuration_input = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -170,6 +182,7 @@ impl<'de> ::serde::Deserialize<'de> for DeliveryStreamProperties { } Ok(DeliveryStreamProperties { + amazonopensearchservice_destination_configuration: amazonopensearchservice_destination_configuration, delivery_stream_encryption_configuration_input: delivery_stream_encryption_configuration_input, delivery_stream_name: delivery_stream_name, delivery_stream_type: delivery_stream_type, @@ -211,6 +224,328 @@ impl From for DeliveryStream { pub mod delivery_stream { //! Property types for the `DeliveryStream` resource. + /// The [`AWS::KinesisFirehose::DeliveryStream.AmazonopensearchserviceBufferingHints`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicebufferinghints.html) property type. + #[derive(Debug, Default)] + pub struct AmazonopensearchserviceBufferingHints { + /// Property [`IntervalInSeconds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicebufferinghints.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicebufferinghints-intervalinseconds). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub interval_in_seconds: Option<::Value>, + /// Property [`SizeInMBs`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicebufferinghints.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicebufferinghints-sizeinmbs). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub size_in_m_bs: Option<::Value>, + } + + impl ::codec::SerializeValue for AmazonopensearchserviceBufferingHints { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref interval_in_seconds) = self.interval_in_seconds { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IntervalInSeconds", interval_in_seconds)?; + } + if let Some(ref size_in_m_bs) = self.size_in_m_bs { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SizeInMBs", size_in_m_bs)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AmazonopensearchserviceBufferingHints { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AmazonopensearchserviceBufferingHints; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AmazonopensearchserviceBufferingHints") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut interval_in_seconds: Option<::Value> = None; + let mut size_in_m_bs: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "IntervalInSeconds" => { + interval_in_seconds = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SizeInMBs" => { + size_in_m_bs = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AmazonopensearchserviceBufferingHints { + interval_in_seconds: interval_in_seconds, + size_in_m_bs: size_in_m_bs, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::KinesisFirehose::DeliveryStream.AmazonopensearchserviceDestinationConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct AmazonopensearchserviceDestinationConfiguration { + /// Property [`BufferingHints`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-bufferinghints). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub buffering_hints: Option<::Value>, + /// Property [`CloudWatchLoggingOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-cloudwatchloggingoptions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub cloud_watch_logging_options: Option<::Value>, + /// Property [`ClusterEndpoint`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-clusterendpoint). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub cluster_endpoint: Option<::Value>, + /// Property [`DomainARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-domainarn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub domain_arn: Option<::Value>, + /// Property [`IndexName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-indexname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub index_name: ::Value, + /// Property [`IndexRotationPeriod`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-indexrotationperiod). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub index_rotation_period: Option<::Value>, + /// Property [`ProcessingConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-processingconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub processing_configuration: Option<::Value>, + /// Property [`RetryOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-retryoptions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub retry_options: Option<::Value>, + /// Property [`RoleARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-rolearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub role_arn: ::Value, + /// Property [`S3BackupMode`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-s3backupmode). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub s3_backup_mode: Option<::Value>, + /// Property [`S3Configuration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-s3configuration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub s3_configuration: ::Value, + /// Property [`TypeName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-typename). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub type_name: Option<::Value>, + /// Property [`VpcConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration.html#cfn-kinesisfirehose-deliverystream-amazonopensearchservicedestinationconfiguration-vpcconfiguration). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub vpc_configuration: Option<::Value>, + } + + impl ::codec::SerializeValue for AmazonopensearchserviceDestinationConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref buffering_hints) = self.buffering_hints { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BufferingHints", buffering_hints)?; + } + if let Some(ref cloud_watch_logging_options) = self.cloud_watch_logging_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CloudWatchLoggingOptions", cloud_watch_logging_options)?; + } + if let Some(ref cluster_endpoint) = self.cluster_endpoint { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ClusterEndpoint", cluster_endpoint)?; + } + if let Some(ref domain_arn) = self.domain_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DomainARN", domain_arn)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IndexName", &self.index_name)?; + if let Some(ref index_rotation_period) = self.index_rotation_period { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IndexRotationPeriod", index_rotation_period)?; + } + if let Some(ref processing_configuration) = self.processing_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ProcessingConfiguration", processing_configuration)?; + } + if let Some(ref retry_options) = self.retry_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RetryOptions", retry_options)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RoleARN", &self.role_arn)?; + if let Some(ref s3_backup_mode) = self.s3_backup_mode { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3BackupMode", s3_backup_mode)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3Configuration", &self.s3_configuration)?; + if let Some(ref type_name) = self.type_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TypeName", type_name)?; + } + if let Some(ref vpc_configuration) = self.vpc_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcConfiguration", vpc_configuration)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AmazonopensearchserviceDestinationConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AmazonopensearchserviceDestinationConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AmazonopensearchserviceDestinationConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut buffering_hints: Option<::Value> = None; + let mut cloud_watch_logging_options: Option<::Value> = None; + let mut cluster_endpoint: Option<::Value> = None; + let mut domain_arn: Option<::Value> = None; + let mut index_name: Option<::Value> = None; + let mut index_rotation_period: Option<::Value> = None; + let mut processing_configuration: Option<::Value> = None; + let mut retry_options: Option<::Value> = None; + let mut role_arn: Option<::Value> = None; + let mut s3_backup_mode: Option<::Value> = None; + let mut s3_configuration: Option<::Value> = None; + let mut type_name: Option<::Value> = None; + let mut vpc_configuration: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "BufferingHints" => { + buffering_hints = ::serde::de::MapAccess::next_value(&mut map)?; + } + "CloudWatchLoggingOptions" => { + cloud_watch_logging_options = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ClusterEndpoint" => { + cluster_endpoint = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DomainARN" => { + domain_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IndexName" => { + index_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IndexRotationPeriod" => { + index_rotation_period = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ProcessingConfiguration" => { + processing_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RetryOptions" => { + retry_options = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RoleARN" => { + role_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "S3BackupMode" => { + s3_backup_mode = ::serde::de::MapAccess::next_value(&mut map)?; + } + "S3Configuration" => { + s3_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TypeName" => { + type_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VpcConfiguration" => { + vpc_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AmazonopensearchserviceDestinationConfiguration { + buffering_hints: buffering_hints, + cloud_watch_logging_options: cloud_watch_logging_options, + cluster_endpoint: cluster_endpoint, + domain_arn: domain_arn, + index_name: index_name.ok_or(::serde::de::Error::missing_field("IndexName"))?, + index_rotation_period: index_rotation_period, + processing_configuration: processing_configuration, + retry_options: retry_options, + role_arn: role_arn.ok_or(::serde::de::Error::missing_field("RoleARN"))?, + s3_backup_mode: s3_backup_mode, + s3_configuration: s3_configuration.ok_or(::serde::de::Error::missing_field("S3Configuration"))?, + type_name: type_name, + vpc_configuration: vpc_configuration, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::KinesisFirehose::DeliveryStream.AmazonopensearchserviceRetryOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchserviceretryoptions.html) property type. + #[derive(Debug, Default)] + pub struct AmazonopensearchserviceRetryOptions { + /// Property [`DurationInSeconds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-amazonopensearchserviceretryoptions.html#cfn-kinesisfirehose-deliverystream-amazonopensearchserviceretryoptions-durationinseconds). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub duration_in_seconds: Option<::Value>, + } + + impl ::codec::SerializeValue for AmazonopensearchserviceRetryOptions { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref duration_in_seconds) = self.duration_in_seconds { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DurationInSeconds", duration_in_seconds)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AmazonopensearchserviceRetryOptions { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AmazonopensearchserviceRetryOptions; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AmazonopensearchserviceRetryOptions") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut duration_in_seconds: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DurationInSeconds" => { + duration_in_seconds = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AmazonopensearchserviceRetryOptions { + duration_in_seconds: duration_in_seconds, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::KinesisFirehose::DeliveryStream.BufferingHints`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-bufferinghints.html) property type. #[derive(Debug, Default)] pub struct BufferingHints { @@ -655,6 +990,72 @@ pub mod delivery_stream { } } + /// The [`AWS::KinesisFirehose::DeliveryStream.DynamicPartitioningConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-dynamicpartitioningconfiguration.html) property type. + #[derive(Debug, Default)] + pub struct DynamicPartitioningConfiguration { + /// Property [`Enabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-dynamicpartitioningconfiguration.html#cfn-kinesisfirehose-deliverystream-dynamicpartitioningconfiguration-enabled). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enabled: Option<::Value>, + /// Property [`RetryOptions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-dynamicpartitioningconfiguration.html#cfn-kinesisfirehose-deliverystream-dynamicpartitioningconfiguration-retryoptions). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub retry_options: Option<::Value>, + } + + impl ::codec::SerializeValue for DynamicPartitioningConfiguration { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref enabled) = self.enabled { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Enabled", enabled)?; + } + if let Some(ref retry_options) = self.retry_options { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RetryOptions", retry_options)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for DynamicPartitioningConfiguration { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = DynamicPartitioningConfiguration; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type DynamicPartitioningConfiguration") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut enabled: Option<::Value> = None; + let mut retry_options: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Enabled" => { + enabled = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RetryOptions" => { + retry_options = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(DynamicPartitioningConfiguration { + enabled: enabled, + retry_options: retry_options, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::KinesisFirehose::DeliveryStream.ElasticsearchBufferingHints`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-elasticsearchbufferinghints.html) property type. #[derive(Debug, Default)] pub struct ElasticsearchBufferingHints { @@ -1071,6 +1472,11 @@ pub mod delivery_stream { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub data_format_conversion_configuration: Option<::Value>, + /// Property [`DynamicPartitioningConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-extendeds3destinationconfiguration.html#cfn-kinesisfirehose-deliverystream-extendeds3destinationconfiguration-dynamicpartitioningconfiguration). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub dynamic_partitioning_configuration: Option<::Value>, /// Property [`EncryptionConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-extendeds3destinationconfiguration.html#cfn-kinesisfirehose-deliverystream-extendeds3destinationconfiguration-encryptionconfiguration). /// /// Update type: _Mutable_. @@ -1124,6 +1530,9 @@ pub mod delivery_stream { if let Some(ref data_format_conversion_configuration) = self.data_format_conversion_configuration { ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataFormatConversionConfiguration", data_format_conversion_configuration)?; } + if let Some(ref dynamic_partitioning_configuration) = self.dynamic_partitioning_configuration { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DynamicPartitioningConfiguration", dynamic_partitioning_configuration)?; + } if let Some(ref encryption_configuration) = self.encryption_configuration { ::serde::ser::SerializeMap::serialize_entry(&mut map, "EncryptionConfiguration", encryption_configuration)?; } @@ -1164,6 +1573,7 @@ pub mod delivery_stream { let mut cloud_watch_logging_options: Option<::Value> = None; let mut compression_format: Option<::Value> = None; let mut data_format_conversion_configuration: Option<::Value> = None; + let mut dynamic_partitioning_configuration: Option<::Value> = None; let mut encryption_configuration: Option<::Value> = None; let mut error_output_prefix: Option<::Value> = None; let mut prefix: Option<::Value> = None; @@ -1189,6 +1599,9 @@ pub mod delivery_stream { "DataFormatConversionConfiguration" => { data_format_conversion_configuration = ::serde::de::MapAccess::next_value(&mut map)?; } + "DynamicPartitioningConfiguration" => { + dynamic_partitioning_configuration = ::serde::de::MapAccess::next_value(&mut map)?; + } "EncryptionConfiguration" => { encryption_configuration = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1220,6 +1633,7 @@ pub mod delivery_stream { cloud_watch_logging_options: cloud_watch_logging_options, compression_format: compression_format, data_format_conversion_configuration: data_format_conversion_configuration, + dynamic_partitioning_configuration: dynamic_partitioning_configuration, encryption_configuration: encryption_configuration, error_output_prefix: error_output_prefix, prefix: prefix, diff --git a/src/aws/kinesisvideo.rs b/src/aws/kinesisvideo.rs new file mode 100644 index 0000000..c03fe02 --- /dev/null +++ b/src/aws/kinesisvideo.rs @@ -0,0 +1,261 @@ +//! Types for the `KinesisVideo` service. + +/// The [`AWS::KinesisVideo::SignalingChannel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-signalingchannel.html) resource type. +#[derive(Debug, Default)] +pub struct SignalingChannel { + properties: SignalingChannelProperties +} + +/// Properties for the `SignalingChannel` resource. +#[derive(Debug, Default)] +pub struct SignalingChannelProperties { + /// Property [`MessageTtlSeconds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-signalingchannel.html#cfn-kinesisvideo-signalingchannel-messagettlseconds). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub message_ttl_seconds: Option<::Value>, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-signalingchannel.html#cfn-kinesisvideo-signalingchannel-name). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub name: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-signalingchannel.html#cfn-kinesisvideo-signalingchannel-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, + /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-signalingchannel.html#cfn-kinesisvideo-signalingchannel-type). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub r#type: Option<::Value>, +} + +impl ::serde::Serialize for SignalingChannelProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref message_ttl_seconds) = self.message_ttl_seconds { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MessageTtlSeconds", message_ttl_seconds)?; + } + if let Some(ref name) = self.name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + if let Some(ref r#type) = self.r#type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", r#type)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for SignalingChannelProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = SignalingChannelProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type SignalingChannelProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut message_ttl_seconds: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + let mut r#type: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "MessageTtlSeconds" => { + message_ttl_seconds = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Type" => { + r#type = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(SignalingChannelProperties { + message_ttl_seconds: message_ttl_seconds, + name: name, + tags: tags, + r#type: r#type, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for SignalingChannel { + type Properties = SignalingChannelProperties; + const TYPE: &'static str = "AWS::KinesisVideo::SignalingChannel"; + fn properties(&self) -> &SignalingChannelProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut SignalingChannelProperties { + &mut self.properties + } +} + +impl ::private::Sealed for SignalingChannel {} + +impl From for SignalingChannel { + fn from(properties: SignalingChannelProperties) -> SignalingChannel { + SignalingChannel { properties } + } +} + +/// The [`AWS::KinesisVideo::Stream`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-stream.html) resource type. +#[derive(Debug, Default)] +pub struct Stream { + properties: StreamProperties +} + +/// Properties for the `Stream` resource. +#[derive(Debug, Default)] +pub struct StreamProperties { + /// Property [`DataRetentionInHours`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-stream.html#cfn-kinesisvideo-stream-dataretentioninhours). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub data_retention_in_hours: Option<::Value>, + /// Property [`DeviceName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-stream.html#cfn-kinesisvideo-stream-devicename). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub device_name: Option<::Value>, + /// Property [`KmsKeyId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-stream.html#cfn-kinesisvideo-stream-kmskeyid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub kms_key_id: Option<::Value>, + /// Property [`MediaType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-stream.html#cfn-kinesisvideo-stream-mediatype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub media_type: Option<::Value>, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-stream.html#cfn-kinesisvideo-stream-name). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub name: Option<::Value>, + /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisvideo-stream.html#cfn-kinesisvideo-stream-tags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub tags: Option<::ValueList<::Tag>>, +} + +impl ::serde::Serialize for StreamProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref data_retention_in_hours) = self.data_retention_in_hours { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataRetentionInHours", data_retention_in_hours)?; + } + if let Some(ref device_name) = self.device_name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeviceName", device_name)?; + } + if let Some(ref kms_key_id) = self.kms_key_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "KmsKeyId", kms_key_id)?; + } + if let Some(ref media_type) = self.media_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MediaType", media_type)?; + } + if let Some(ref name) = self.name { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?; + } + if let Some(ref tags) = self.tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for StreamProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = StreamProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type StreamProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut data_retention_in_hours: Option<::Value> = None; + let mut device_name: Option<::Value> = None; + let mut kms_key_id: Option<::Value> = None; + let mut media_type: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "DataRetentionInHours" => { + data_retention_in_hours = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DeviceName" => { + device_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "KmsKeyId" => { + kms_key_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MediaType" => { + media_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Tags" => { + tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(StreamProperties { + data_retention_in_hours: data_retention_in_hours, + device_name: device_name, + kms_key_id: kms_key_id, + media_type: media_type, + name: name, + tags: tags, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for Stream { + type Properties = StreamProperties; + const TYPE: &'static str = "AWS::KinesisVideo::Stream"; + fn properties(&self) -> &StreamProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut StreamProperties { + &mut self.properties + } +} + +impl ::private::Sealed for Stream {} + +impl From for Stream { + fn from(properties: StreamProperties) -> Stream { + Stream { properties } + } +} diff --git a/src/aws/lambda.rs b/src/aws/lambda.rs index d98507f..988d1d5 100644 --- a/src/aws/lambda.rs +++ b/src/aws/lambda.rs @@ -399,6 +399,11 @@ pub struct EventSourceMappingProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub event_source_arn: Option<::Value>, + /// Property [`FilterCriteria`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-filtercriteria). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub filter_criteria: Option<::Value>, /// Property [`FunctionName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-functionname). /// /// Update type: _Mutable_. @@ -451,8 +456,8 @@ pub struct EventSourceMappingProperties { pub starting_position: Option<::Value>, /// Property [`StartingPositionTimestamp`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-startingpositiontimestamp). /// - /// Update type: _Mutable_. - /// AWS CloudFormation doesn't replace the resource when you change this property. + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. pub starting_position_timestamp: Option<::Value>, /// Property [`Topics`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html#cfn-lambda-eventsourcemapping-topics). /// @@ -484,6 +489,9 @@ impl ::serde::Serialize for EventSourceMappingProperties { if let Some(ref event_source_arn) = self.event_source_arn { ::serde::ser::SerializeMap::serialize_entry(&mut map, "EventSourceArn", event_source_arn)?; } + if let Some(ref filter_criteria) = self.filter_criteria { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FilterCriteria", filter_criteria)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "FunctionName", &self.function_name)?; if let Some(ref function_response_types) = self.function_response_types { ::serde::ser::SerializeMap::serialize_entry(&mut map, "FunctionResponseTypes", function_response_types)?; @@ -542,6 +550,7 @@ impl<'de> ::serde::Deserialize<'de> for EventSourceMappingProperties { let mut destination_config: Option<::Value> = None; let mut enabled: Option<::Value> = None; let mut event_source_arn: Option<::Value> = None; + let mut filter_criteria: Option<::Value> = None; let mut function_name: Option<::Value> = None; let mut function_response_types: Option<::ValueList> = None; let mut maximum_batching_window_in_seconds: Option<::Value> = None; @@ -573,6 +582,9 @@ impl<'de> ::serde::Deserialize<'de> for EventSourceMappingProperties { "EventSourceArn" => { event_source_arn = ::serde::de::MapAccess::next_value(&mut map)?; } + "FilterCriteria" => { + filter_criteria = ::serde::de::MapAccess::next_value(&mut map)?; + } "FunctionName" => { function_name = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -622,6 +634,7 @@ impl<'de> ::serde::Deserialize<'de> for EventSourceMappingProperties { destination_config: destination_config, enabled: enabled, event_source_arn: event_source_arn, + filter_criteria: filter_criteria, function_name: function_name.ok_or(::serde::de::Error::missing_field("FunctionName"))?, function_response_types: function_response_types, maximum_batching_window_in_seconds: maximum_batching_window_in_seconds, @@ -671,6 +684,11 @@ pub struct Function { /// Properties for the `Function` resource. #[derive(Debug, Default)] pub struct FunctionProperties { + /// Property [`Architectures`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-architectures). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub architectures: Option<::ValueList>, /// Property [`Code`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-code). /// /// Update type: _Mutable_. @@ -696,6 +714,11 @@ pub struct FunctionProperties { /// Update type: _Mutable_. /// AWS CloudFormation doesn't replace the resource when you change this property. pub environment: Option<::Value>, + /// Property [`EphemeralStorage`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-ephemeralstorage). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub ephemeral_storage: Option<::Value>, /// Property [`FileSystemConfigs`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-filesystemconfigs). /// /// Update type: _Mutable_. @@ -776,6 +799,9 @@ pub struct FunctionProperties { impl ::serde::Serialize for FunctionProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref architectures) = self.architectures { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Architectures", architectures)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "Code", &self.code)?; if let Some(ref code_signing_config_arn) = self.code_signing_config_arn { ::serde::ser::SerializeMap::serialize_entry(&mut map, "CodeSigningConfigArn", code_signing_config_arn)?; @@ -789,6 +815,9 @@ impl ::serde::Serialize for FunctionProperties { if let Some(ref environment) = self.environment { ::serde::ser::SerializeMap::serialize_entry(&mut map, "Environment", environment)?; } + if let Some(ref ephemeral_storage) = self.ephemeral_storage { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "EphemeralStorage", ephemeral_storage)?; + } if let Some(ref file_system_configs) = self.file_system_configs { ::serde::ser::SerializeMap::serialize_entry(&mut map, "FileSystemConfigs", file_system_configs)?; } @@ -848,11 +877,13 @@ impl<'de> ::serde::Deserialize<'de> for FunctionProperties { } fn visit_map>(self, mut map: A) -> Result { + let mut architectures: Option<::ValueList> = None; let mut code: Option<::Value> = None; let mut code_signing_config_arn: Option<::Value> = None; let mut dead_letter_config: Option<::Value> = None; let mut description: Option<::Value> = None; let mut environment: Option<::Value> = None; + let mut ephemeral_storage: Option<::Value> = None; let mut file_system_configs: Option<::ValueList> = None; let mut function_name: Option<::Value> = None; let mut handler: Option<::Value> = None; @@ -871,6 +902,9 @@ impl<'de> ::serde::Deserialize<'de> for FunctionProperties { while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "Architectures" => { + architectures = ::serde::de::MapAccess::next_value(&mut map)?; + } "Code" => { code = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -886,6 +920,9 @@ impl<'de> ::serde::Deserialize<'de> for FunctionProperties { "Environment" => { environment = ::serde::de::MapAccess::next_value(&mut map)?; } + "EphemeralStorage" => { + ephemeral_storage = ::serde::de::MapAccess::next_value(&mut map)?; + } "FileSystemConfigs" => { file_system_configs = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -936,11 +973,13 @@ impl<'de> ::serde::Deserialize<'de> for FunctionProperties { } Ok(FunctionProperties { + architectures: architectures, code: code.ok_or(::serde::de::Error::missing_field("Code"))?, code_signing_config_arn: code_signing_config_arn, dead_letter_config: dead_letter_config, description: description, environment: environment, + ephemeral_storage: ephemeral_storage, file_system_configs: file_system_configs, function_name: function_name, handler: handler, @@ -992,6 +1031,11 @@ pub struct LayerVersion { /// Properties for the `LayerVersion` resource. #[derive(Debug, Default)] pub struct LayerVersionProperties { + /// Property [`CompatibleArchitectures`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-layerversion.html#cfn-lambda-layerversion-compatiblearchitectures). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub compatible_architectures: Option<::ValueList>, /// Property [`CompatibleRuntimes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-layerversion.html#cfn-lambda-layerversion-compatibleruntimes). /// /// Update type: _Immutable_. @@ -1022,6 +1066,9 @@ pub struct LayerVersionProperties { impl ::serde::Serialize for LayerVersionProperties { fn serialize(&self, s: S) -> Result { let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref compatible_architectures) = self.compatible_architectures { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CompatibleArchitectures", compatible_architectures)?; + } if let Some(ref compatible_runtimes) = self.compatible_runtimes { ::serde::ser::SerializeMap::serialize_entry(&mut map, "CompatibleRuntimes", compatible_runtimes)?; } @@ -1051,6 +1098,7 @@ impl<'de> ::serde::Deserialize<'de> for LayerVersionProperties { } fn visit_map>(self, mut map: A) -> Result { + let mut compatible_architectures: Option<::ValueList> = None; let mut compatible_runtimes: Option<::ValueList> = None; let mut content: Option<::Value> = None; let mut description: Option<::Value> = None; @@ -1059,6 +1107,9 @@ impl<'de> ::serde::Deserialize<'de> for LayerVersionProperties { while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { match __cfn_key.as_ref() { + "CompatibleArchitectures" => { + compatible_architectures = ::serde::de::MapAccess::next_value(&mut map)?; + } "CompatibleRuntimes" => { compatible_runtimes = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1079,6 +1130,7 @@ impl<'de> ::serde::Deserialize<'de> for LayerVersionProperties { } Ok(LayerVersionProperties { + compatible_architectures: compatible_architectures, compatible_runtimes: compatible_runtimes, content: content.ok_or(::serde::de::Error::missing_field("Content"))?, description: description, @@ -1246,11 +1298,21 @@ pub struct PermissionProperties { /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub function_name: ::Value, + /// Property [`FunctionUrlAuthType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-permission.html#cfn-lambda-permission-functionurlauthtype). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub function_url_auth_type: Option<::Value>, /// Property [`Principal`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-permission.html#cfn-lambda-permission-principal). /// /// Update type: _Immutable_. /// AWS CloudFormation replaces the resource when you change this property. pub principal: ::Value, + /// Property [`PrincipalOrgID`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-permission.html#cfn-lambda-permission-principalorgid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub principal_org_id: Option<::Value>, /// Property [`SourceAccount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-permission.html#cfn-lambda-permission-sourceaccount). /// /// Update type: _Immutable_. @@ -1271,7 +1333,13 @@ impl ::serde::Serialize for PermissionProperties { ::serde::ser::SerializeMap::serialize_entry(&mut map, "EventSourceToken", event_source_token)?; } ::serde::ser::SerializeMap::serialize_entry(&mut map, "FunctionName", &self.function_name)?; + if let Some(ref function_url_auth_type) = self.function_url_auth_type { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FunctionUrlAuthType", function_url_auth_type)?; + } ::serde::ser::SerializeMap::serialize_entry(&mut map, "Principal", &self.principal)?; + if let Some(ref principal_org_id) = self.principal_org_id { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PrincipalOrgID", principal_org_id)?; + } if let Some(ref source_account) = self.source_account { ::serde::ser::SerializeMap::serialize_entry(&mut map, "SourceAccount", source_account)?; } @@ -1297,7 +1365,9 @@ impl<'de> ::serde::Deserialize<'de> for PermissionProperties { let mut action: Option<::Value> = None; let mut event_source_token: Option<::Value> = None; let mut function_name: Option<::Value> = None; + let mut function_url_auth_type: Option<::Value> = None; let mut principal: Option<::Value> = None; + let mut principal_org_id: Option<::Value> = None; let mut source_account: Option<::Value> = None; let mut source_arn: Option<::Value> = None; @@ -1312,9 +1382,15 @@ impl<'de> ::serde::Deserialize<'de> for PermissionProperties { "FunctionName" => { function_name = ::serde::de::MapAccess::next_value(&mut map)?; } + "FunctionUrlAuthType" => { + function_url_auth_type = ::serde::de::MapAccess::next_value(&mut map)?; + } "Principal" => { principal = ::serde::de::MapAccess::next_value(&mut map)?; } + "PrincipalOrgID" => { + principal_org_id = ::serde::de::MapAccess::next_value(&mut map)?; + } "SourceAccount" => { source_account = ::serde::de::MapAccess::next_value(&mut map)?; } @@ -1329,7 +1405,9 @@ impl<'de> ::serde::Deserialize<'de> for PermissionProperties { action: action.ok_or(::serde::de::Error::missing_field("Action"))?, event_source_token: event_source_token, function_name: function_name.ok_or(::serde::de::Error::missing_field("FunctionName"))?, + function_url_auth_type: function_url_auth_type, principal: principal.ok_or(::serde::de::Error::missing_field("Principal"))?, + principal_org_id: principal_org_id, source_account: source_account, source_arn: source_arn, }) @@ -1359,6 +1437,119 @@ impl From for Permission { } } +/// The [`AWS::Lambda::Url`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-url.html) resource type. +#[derive(Debug, Default)] +pub struct Url { + properties: UrlProperties +} + +/// Properties for the `Url` resource. +#[derive(Debug, Default)] +pub struct UrlProperties { + /// Property [`AuthType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-url.html#cfn-lambda-url-authtype). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub auth_type: ::Value, + /// Property [`Cors`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-url.html#cfn-lambda-url-cors). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub cors: Option<::Value>, + /// Property [`Qualifier`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-url.html#cfn-lambda-url-qualifier). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub qualifier: Option<::Value>, + /// Property [`TargetFunctionArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-url.html#cfn-lambda-url-targetfunctionarn). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub target_function_arn: ::Value, +} + +impl ::serde::Serialize for UrlProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AuthType", &self.auth_type)?; + if let Some(ref cors) = self.cors { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Cors", cors)?; + } + if let Some(ref qualifier) = self.qualifier { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Qualifier", qualifier)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetFunctionArn", &self.target_function_arn)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for UrlProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = UrlProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type UrlProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut auth_type: Option<::Value> = None; + let mut cors: Option<::Value> = None; + let mut qualifier: Option<::Value> = None; + let mut target_function_arn: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AuthType" => { + auth_type = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Cors" => { + cors = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Qualifier" => { + qualifier = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TargetFunctionArn" => { + target_function_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(UrlProperties { + auth_type: auth_type.ok_or(::serde::de::Error::missing_field("AuthType"))?, + cors: cors, + qualifier: qualifier, + target_function_arn: target_function_arn.ok_or(::serde::de::Error::missing_field("TargetFunctionArn"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for Url { + type Properties = UrlProperties; + const TYPE: &'static str = "AWS::Lambda::Url"; + fn properties(&self) -> &UrlProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut UrlProperties { + &mut self.properties + } +} + +impl ::private::Sealed for Url {} + +impl From for Url { + fn from(properties: UrlProperties) -> Url { + Url { properties } + } +} + /// The [`AWS::Lambda::Version`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-version.html) resource type. #[derive(Debug, Default)] pub struct Version { @@ -2029,6 +2220,112 @@ pub mod event_source_mapping { } } + /// The [`AWS::Lambda::EventSourceMapping.Filter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-filter.html) property type. + #[derive(Debug, Default)] + pub struct Filter { + /// Property [`Pattern`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-filter.html#cfn-lambda-eventsourcemapping-filter-pattern). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub pattern: Option<::Value>, + } + + impl ::codec::SerializeValue for Filter { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref pattern) = self.pattern { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Pattern", pattern)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Filter { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Filter; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Filter") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut pattern: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Pattern" => { + pattern = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Filter { + pattern: pattern, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Lambda::EventSourceMapping.FilterCriteria`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-filtercriteria.html) property type. + #[derive(Debug, Default)] + pub struct FilterCriteria { + /// Property [`Filters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-filtercriteria.html#cfn-lambda-eventsourcemapping-filtercriteria-filters). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub filters: Option<::ValueList>, + } + + impl ::codec::SerializeValue for FilterCriteria { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref filters) = self.filters { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Filters", filters)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for FilterCriteria { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = FilterCriteria; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type FilterCriteria") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut filters: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Filters" => { + filters = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(FilterCriteria { + filters: filters, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::Lambda::EventSourceMapping.OnFailure`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-eventsourcemapping-onfailure.html) property type. #[derive(Debug, Default)] pub struct OnFailure { @@ -2416,6 +2713,57 @@ pub mod function { } } + /// The [`AWS::Lambda::Function.EphemeralStorage`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-ephemeralstorage.html) property type. + #[derive(Debug, Default)] + pub struct EphemeralStorage { + /// Property [`Size`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-ephemeralstorage.html#cfn-lambda-function-ephemeralstorage-size). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub size: ::Value, + } + + impl ::codec::SerializeValue for EphemeralStorage { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Size", &self.size)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for EphemeralStorage { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = EphemeralStorage; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type EphemeralStorage") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut size: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Size" => { + size = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(EphemeralStorage { + size: size.ok_or(::serde::de::Error::missing_field("Size"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + /// The [`AWS::Lambda::Function.FileSystemConfig`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-filesystemconfig.html) property type. #[derive(Debug, Default)] pub struct FileSystemConfig { @@ -2756,6 +3104,128 @@ pub mod layer_version { } } +pub mod url { + //! Property types for the `Url` resource. + + /// The [`AWS::Lambda::Url.Cors`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-url-cors.html) property type. + #[derive(Debug, Default)] + pub struct Cors { + /// Property [`AllowCredentials`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-url-cors.html#cfn-lambda-url-cors-allowcredentials). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub allow_credentials: Option<::Value>, + /// Property [`AllowHeaders`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-url-cors.html#cfn-lambda-url-cors-allowheaders). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub allow_headers: Option<::ValueList>, + /// Property [`AllowMethods`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-url-cors.html#cfn-lambda-url-cors-allowmethods). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub allow_methods: Option<::ValueList>, + /// Property [`AllowOrigins`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-url-cors.html#cfn-lambda-url-cors-alloworigins). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub allow_origins: Option<::ValueList>, + /// Property [`ExposeHeaders`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-url-cors.html#cfn-lambda-url-cors-exposeheaders). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub expose_headers: Option<::ValueList>, + /// Property [`MaxAge`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-url-cors.html#cfn-lambda-url-cors-maxage). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub max_age: Option<::Value>, + } + + impl ::codec::SerializeValue for Cors { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref allow_credentials) = self.allow_credentials { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AllowCredentials", allow_credentials)?; + } + if let Some(ref allow_headers) = self.allow_headers { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AllowHeaders", allow_headers)?; + } + if let Some(ref allow_methods) = self.allow_methods { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AllowMethods", allow_methods)?; + } + if let Some(ref allow_origins) = self.allow_origins { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AllowOrigins", allow_origins)?; + } + if let Some(ref expose_headers) = self.expose_headers { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExposeHeaders", expose_headers)?; + } + if let Some(ref max_age) = self.max_age { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaxAge", max_age)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Cors { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Cors; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Cors") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut allow_credentials: Option<::Value> = None; + let mut allow_headers: Option<::ValueList> = None; + let mut allow_methods: Option<::ValueList> = None; + let mut allow_origins: Option<::ValueList> = None; + let mut expose_headers: Option<::ValueList> = None; + let mut max_age: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AllowCredentials" => { + allow_credentials = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AllowHeaders" => { + allow_headers = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AllowMethods" => { + allow_methods = ::serde::de::MapAccess::next_value(&mut map)?; + } + "AllowOrigins" => { + allow_origins = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ExposeHeaders" => { + expose_headers = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MaxAge" => { + max_age = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Cors { + allow_credentials: allow_credentials, + allow_headers: allow_headers, + allow_methods: allow_methods, + allow_origins: allow_origins, + expose_headers: expose_headers, + max_age: max_age, + }) + } + } + + d.deserialize_map(Visitor) + } + } +} + pub mod version { //! Property types for the `Version` resource. diff --git a/src/aws/lex.rs b/src/aws/lex.rs new file mode 100644 index 0000000..e5c4403 --- /dev/null +++ b/src/aws/lex.rs @@ -0,0 +1,5405 @@ +//! Types for the `Lex` service. + +/// The [`AWS::Lex::Bot`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html) resource type. +#[derive(Debug, Default)] +pub struct Bot { + properties: BotProperties +} + +/// Properties for the `Bot` resource. +#[derive(Debug, Default)] +pub struct BotProperties { + /// Property [`AutoBuildBotLocales`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html#cfn-lex-bot-autobuildbotlocales). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub auto_build_bot_locales: Option<::Value>, + /// Property [`BotFileS3Location`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html#cfn-lex-bot-botfiles3location). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub bot_file_s3_location: Option<::Value>, + /// Property [`BotLocales`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html#cfn-lex-bot-botlocales). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub bot_locales: Option<::ValueList>, + /// Property [`BotTags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html#cfn-lex-bot-bottags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub bot_tags: Option<::ValueList<::Tag>>, + /// Property [`DataPrivacy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html#cfn-lex-bot-dataprivacy). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub data_privacy: ::Value<::json::Value>, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html#cfn-lex-bot-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`IdleSessionTTLInSeconds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html#cfn-lex-bot-idlesessionttlinseconds). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub idle_session_ttl_in_seconds: ::Value, + /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html#cfn-lex-bot-name). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub name: ::Value, + /// Property [`RoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html#cfn-lex-bot-rolearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub role_arn: ::Value, + /// Property [`TestBotAliasSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html#cfn-lex-bot-testbotaliassettings). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub test_bot_alias_settings: Option<::Value>, + /// Property [`TestBotAliasTags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-bot.html#cfn-lex-bot-testbotaliastags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub test_bot_alias_tags: Option<::ValueList<::Tag>>, +} + +impl ::serde::Serialize for BotProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref auto_build_bot_locales) = self.auto_build_bot_locales { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AutoBuildBotLocales", auto_build_bot_locales)?; + } + if let Some(ref bot_file_s3_location) = self.bot_file_s3_location { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BotFileS3Location", bot_file_s3_location)?; + } + if let Some(ref bot_locales) = self.bot_locales { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BotLocales", bot_locales)?; + } + if let Some(ref bot_tags) = self.bot_tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BotTags", bot_tags)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataPrivacy", &self.data_privacy)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "IdleSessionTTLInSeconds", &self.idle_session_ttl_in_seconds)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "RoleArn", &self.role_arn)?; + if let Some(ref test_bot_alias_settings) = self.test_bot_alias_settings { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TestBotAliasSettings", test_bot_alias_settings)?; + } + if let Some(ref test_bot_alias_tags) = self.test_bot_alias_tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TestBotAliasTags", test_bot_alias_tags)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for BotProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = BotProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type BotProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut auto_build_bot_locales: Option<::Value> = None; + let mut bot_file_s3_location: Option<::Value> = None; + let mut bot_locales: Option<::ValueList> = None; + let mut bot_tags: Option<::ValueList<::Tag>> = None; + let mut data_privacy: Option<::Value<::json::Value>> = None; + let mut description: Option<::Value> = None; + let mut idle_session_ttl_in_seconds: Option<::Value> = None; + let mut name: Option<::Value> = None; + let mut role_arn: Option<::Value> = None; + let mut test_bot_alias_settings: Option<::Value> = None; + let mut test_bot_alias_tags: Option<::ValueList<::Tag>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AutoBuildBotLocales" => { + auto_build_bot_locales = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BotFileS3Location" => { + bot_file_s3_location = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BotLocales" => { + bot_locales = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BotTags" => { + bot_tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DataPrivacy" => { + data_privacy = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "IdleSessionTTLInSeconds" => { + idle_session_ttl_in_seconds = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Name" => { + name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "RoleArn" => { + role_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TestBotAliasSettings" => { + test_bot_alias_settings = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TestBotAliasTags" => { + test_bot_alias_tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(BotProperties { + auto_build_bot_locales: auto_build_bot_locales, + bot_file_s3_location: bot_file_s3_location, + bot_locales: bot_locales, + bot_tags: bot_tags, + data_privacy: data_privacy.ok_or(::serde::de::Error::missing_field("DataPrivacy"))?, + description: description, + idle_session_ttl_in_seconds: idle_session_ttl_in_seconds.ok_or(::serde::de::Error::missing_field("IdleSessionTTLInSeconds"))?, + name: name.ok_or(::serde::de::Error::missing_field("Name"))?, + role_arn: role_arn.ok_or(::serde::de::Error::missing_field("RoleArn"))?, + test_bot_alias_settings: test_bot_alias_settings, + test_bot_alias_tags: test_bot_alias_tags, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for Bot { + type Properties = BotProperties; + const TYPE: &'static str = "AWS::Lex::Bot"; + fn properties(&self) -> &BotProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut BotProperties { + &mut self.properties + } +} + +impl ::private::Sealed for Bot {} + +impl From for Bot { + fn from(properties: BotProperties) -> Bot { + Bot { properties } + } +} + +/// The [`AWS::Lex::BotAlias`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botalias.html) resource type. +#[derive(Debug, Default)] +pub struct BotAlias { + properties: BotAliasProperties +} + +/// Properties for the `BotAlias` resource. +#[derive(Debug, Default)] +pub struct BotAliasProperties { + /// Property [`BotAliasLocaleSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botalias.html#cfn-lex-botalias-botaliaslocalesettings). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub bot_alias_locale_settings: Option<::ValueList>, + /// Property [`BotAliasName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botalias.html#cfn-lex-botalias-botaliasname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub bot_alias_name: ::Value, + /// Property [`BotAliasTags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botalias.html#cfn-lex-botalias-botaliastags). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub bot_alias_tags: Option<::ValueList<::Tag>>, + /// Property [`BotId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botalias.html#cfn-lex-botalias-botid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub bot_id: ::Value, + /// Property [`BotVersion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botalias.html#cfn-lex-botalias-botversion). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub bot_version: Option<::Value>, + /// Property [`ConversationLogSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botalias.html#cfn-lex-botalias-conversationlogsettings). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub conversation_log_settings: Option<::Value>, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botalias.html#cfn-lex-botalias-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`SentimentAnalysisSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botalias.html#cfn-lex-botalias-sentimentanalysissettings). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub sentiment_analysis_settings: Option<::Value<::json::Value>>, +} + +impl ::serde::Serialize for BotAliasProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref bot_alias_locale_settings) = self.bot_alias_locale_settings { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BotAliasLocaleSettings", bot_alias_locale_settings)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BotAliasName", &self.bot_alias_name)?; + if let Some(ref bot_alias_tags) = self.bot_alias_tags { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BotAliasTags", bot_alias_tags)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BotId", &self.bot_id)?; + if let Some(ref bot_version) = self.bot_version { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BotVersion", bot_version)?; + } + if let Some(ref conversation_log_settings) = self.conversation_log_settings { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConversationLogSettings", conversation_log_settings)?; + } + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + if let Some(ref sentiment_analysis_settings) = self.sentiment_analysis_settings { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SentimentAnalysisSettings", sentiment_analysis_settings)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for BotAliasProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = BotAliasProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type BotAliasProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut bot_alias_locale_settings: Option<::ValueList> = None; + let mut bot_alias_name: Option<::Value> = None; + let mut bot_alias_tags: Option<::ValueList<::Tag>> = None; + let mut bot_id: Option<::Value> = None; + let mut bot_version: Option<::Value> = None; + let mut conversation_log_settings: Option<::Value> = None; + let mut description: Option<::Value> = None; + let mut sentiment_analysis_settings: Option<::Value<::json::Value>> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "BotAliasLocaleSettings" => { + bot_alias_locale_settings = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BotAliasName" => { + bot_alias_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BotAliasTags" => { + bot_alias_tags = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BotId" => { + bot_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BotVersion" => { + bot_version = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ConversationLogSettings" => { + conversation_log_settings = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SentimentAnalysisSettings" => { + sentiment_analysis_settings = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(BotAliasProperties { + bot_alias_locale_settings: bot_alias_locale_settings, + bot_alias_name: bot_alias_name.ok_or(::serde::de::Error::missing_field("BotAliasName"))?, + bot_alias_tags: bot_alias_tags, + bot_id: bot_id.ok_or(::serde::de::Error::missing_field("BotId"))?, + bot_version: bot_version, + conversation_log_settings: conversation_log_settings, + description: description, + sentiment_analysis_settings: sentiment_analysis_settings, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for BotAlias { + type Properties = BotAliasProperties; + const TYPE: &'static str = "AWS::Lex::BotAlias"; + fn properties(&self) -> &BotAliasProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut BotAliasProperties { + &mut self.properties + } +} + +impl ::private::Sealed for BotAlias {} + +impl From for BotAlias { + fn from(properties: BotAliasProperties) -> BotAlias { + BotAlias { properties } + } +} + +/// The [`AWS::Lex::BotVersion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botversion.html) resource type. +#[derive(Debug, Default)] +pub struct BotVersion { + properties: BotVersionProperties +} + +/// Properties for the `BotVersion` resource. +#[derive(Debug, Default)] +pub struct BotVersionProperties { + /// Property [`BotId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botversion.html#cfn-lex-botversion-botid). + /// + /// Update type: _Immutable_. + /// AWS CloudFormation replaces the resource when you change this property. + pub bot_id: ::Value, + /// Property [`BotVersionLocaleSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botversion.html#cfn-lex-botversion-botversionlocalespecification). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub bot_version_locale_specification: ::ValueList, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-botversion.html#cfn-lex-botversion-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, +} + +impl ::serde::Serialize for BotVersionProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BotId", &self.bot_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BotVersionLocaleSpecification", &self.bot_version_locale_specification)?; + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for BotVersionProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = BotVersionProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type BotVersionProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut bot_id: Option<::Value> = None; + let mut bot_version_locale_specification: Option<::ValueList> = None; + let mut description: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "BotId" => { + bot_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "BotVersionLocaleSpecification" => { + bot_version_locale_specification = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(BotVersionProperties { + bot_id: bot_id.ok_or(::serde::de::Error::missing_field("BotId"))?, + bot_version_locale_specification: bot_version_locale_specification.ok_or(::serde::de::Error::missing_field("BotVersionLocaleSpecification"))?, + description: description, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for BotVersion { + type Properties = BotVersionProperties; + const TYPE: &'static str = "AWS::Lex::BotVersion"; + fn properties(&self) -> &BotVersionProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut BotVersionProperties { + &mut self.properties + } +} + +impl ::private::Sealed for BotVersion {} + +impl From for BotVersion { + fn from(properties: BotVersionProperties) -> BotVersion { + BotVersion { properties } + } +} + +/// The [`AWS::Lex::ResourcePolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-resourcepolicy.html) resource type. +#[derive(Debug, Default)] +pub struct ResourcePolicy { + properties: ResourcePolicyProperties +} + +/// Properties for the `ResourcePolicy` resource. +#[derive(Debug, Default)] +pub struct ResourcePolicyProperties { + /// Property [`Policy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-resourcepolicy.html#cfn-lex-resourcepolicy-policy). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub policy: ::Value, + /// Property [`ResourceArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lex-resourcepolicy.html#cfn-lex-resourcepolicy-resourcearn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub resource_arn: ::Value, +} + +impl ::serde::Serialize for ResourcePolicyProperties { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Policy", &self.policy)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceArn", &self.resource_arn)?; + ::serde::ser::SerializeMap::end(map) + } +} + +impl<'de> ::serde::Deserialize<'de> for ResourcePolicyProperties { + fn deserialize>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ResourcePolicyProperties; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ResourcePolicyProperties") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut policy: Option<::Value> = None; + let mut resource_arn: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Policy" => { + policy = ::serde::de::MapAccess::next_value(&mut map)?; + } + "ResourceArn" => { + resource_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ResourcePolicyProperties { + policy: policy.ok_or(::serde::de::Error::missing_field("Policy"))?, + resource_arn: resource_arn.ok_or(::serde::de::Error::missing_field("ResourceArn"))?, + }) + } + } + + d.deserialize_map(Visitor) + } +} + +impl ::Resource for ResourcePolicy { + type Properties = ResourcePolicyProperties; + const TYPE: &'static str = "AWS::Lex::ResourcePolicy"; + fn properties(&self) -> &ResourcePolicyProperties { + &self.properties + } + fn properties_mut(&mut self) -> &mut ResourcePolicyProperties { + &mut self.properties + } +} + +impl ::private::Sealed for ResourcePolicy {} + +impl From for ResourcePolicy { + fn from(properties: ResourcePolicyProperties) -> ResourcePolicy { + ResourcePolicy { properties } + } +} + +pub mod bot { + //! Property types for the `Bot` resource. + + /// The [`AWS::Lex::Bot.AdvancedRecognitionSetting`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-advancedrecognitionsetting.html) property type. + #[derive(Debug, Default)] + pub struct AdvancedRecognitionSetting { + /// Property [`AudioRecognitionStrategy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-advancedrecognitionsetting.html#cfn-lex-bot-advancedrecognitionsetting-audiorecognitionstrategy). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub audio_recognition_strategy: Option<::Value>, + } + + impl ::codec::SerializeValue for AdvancedRecognitionSetting { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref audio_recognition_strategy) = self.audio_recognition_strategy { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AudioRecognitionStrategy", audio_recognition_strategy)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AdvancedRecognitionSetting { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AdvancedRecognitionSetting; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AdvancedRecognitionSetting") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut audio_recognition_strategy: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AudioRecognitionStrategy" => { + audio_recognition_strategy = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AdvancedRecognitionSetting { + audio_recognition_strategy: audio_recognition_strategy, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Lex::Bot.AudioLogDestination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-audiologdestination.html) property type. + #[derive(Debug, Default)] + pub struct AudioLogDestination { + /// Property [`S3Bucket`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-audiologdestination.html#cfn-lex-bot-audiologdestination-s3bucket). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub s3_bucket: ::Value, + } + + impl ::codec::SerializeValue for AudioLogDestination { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3Bucket", &self.s3_bucket)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AudioLogDestination { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AudioLogDestination; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AudioLogDestination") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut s3_bucket: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "S3Bucket" => { + s3_bucket = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AudioLogDestination { + s3_bucket: s3_bucket.ok_or(::serde::de::Error::missing_field("S3Bucket"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Lex::Bot.AudioLogSetting`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-audiologsetting.html) property type. + #[derive(Debug, Default)] + pub struct AudioLogSetting { + /// Property [`Destination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-audiologsetting.html#cfn-lex-bot-audiologsetting-destination). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub destination: ::Value, + /// Property [`Enabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-audiologsetting.html#cfn-lex-bot-audiologsetting-enabled). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enabled: ::Value, + } + + impl ::codec::SerializeValue for AudioLogSetting { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Destination", &self.destination)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Enabled", &self.enabled)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for AudioLogSetting { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = AudioLogSetting; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type AudioLogSetting") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut destination: Option<::Value> = None; + let mut enabled: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Destination" => { + destination = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Enabled" => { + enabled = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(AudioLogSetting { + destination: destination.ok_or(::serde::de::Error::missing_field("Destination"))?, + enabled: enabled.ok_or(::serde::de::Error::missing_field("Enabled"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Lex::Bot.BotAliasLocaleSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botaliaslocalesettings.html) property type. + #[derive(Debug, Default)] + pub struct BotAliasLocaleSettings { + /// Property [`CodeHookSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botaliaslocalesettings.html#cfn-lex-bot-botaliaslocalesettings-codehookspecification). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub code_hook_specification: Option<::Value>, + /// Property [`Enabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botaliaslocalesettings.html#cfn-lex-bot-botaliaslocalesettings-enabled). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enabled: ::Value, + } + + impl ::codec::SerializeValue for BotAliasLocaleSettings { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref code_hook_specification) = self.code_hook_specification { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CodeHookSpecification", code_hook_specification)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Enabled", &self.enabled)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for BotAliasLocaleSettings { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = BotAliasLocaleSettings; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type BotAliasLocaleSettings") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut code_hook_specification: Option<::Value> = None; + let mut enabled: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CodeHookSpecification" => { + code_hook_specification = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Enabled" => { + enabled = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(BotAliasLocaleSettings { + code_hook_specification: code_hook_specification, + enabled: enabled.ok_or(::serde::de::Error::missing_field("Enabled"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Lex::Bot.BotAliasLocaleSettingsItem`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botaliaslocalesettingsitem.html) property type. + #[derive(Debug, Default)] + pub struct BotAliasLocaleSettingsItem { + /// Property [`BotAliasLocaleSetting`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botaliaslocalesettingsitem.html#cfn-lex-bot-botaliaslocalesettingsitem-botaliaslocalesetting). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub bot_alias_locale_setting: ::Value, + /// Property [`LocaleId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botaliaslocalesettingsitem.html#cfn-lex-bot-botaliaslocalesettingsitem-localeid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub locale_id: ::Value, + } + + impl ::codec::SerializeValue for BotAliasLocaleSettingsItem { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "BotAliasLocaleSetting", &self.bot_alias_locale_setting)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LocaleId", &self.locale_id)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for BotAliasLocaleSettingsItem { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = BotAliasLocaleSettingsItem; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type BotAliasLocaleSettingsItem") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut bot_alias_locale_setting: Option<::Value> = None; + let mut locale_id: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "BotAliasLocaleSetting" => { + bot_alias_locale_setting = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LocaleId" => { + locale_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(BotAliasLocaleSettingsItem { + bot_alias_locale_setting: bot_alias_locale_setting.ok_or(::serde::de::Error::missing_field("BotAliasLocaleSetting"))?, + locale_id: locale_id.ok_or(::serde::de::Error::missing_field("LocaleId"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Lex::Bot.BotLocale`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botlocale.html) property type. + #[derive(Debug, Default)] + pub struct BotLocale { + /// Property [`CustomVocabulary`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botlocale.html#cfn-lex-bot-botlocale-customvocabulary). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub custom_vocabulary: Option<::Value>, + /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botlocale.html#cfn-lex-bot-botlocale-description). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub description: Option<::Value>, + /// Property [`Intents`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botlocale.html#cfn-lex-bot-botlocale-intents). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub intents: Option<::ValueList>, + /// Property [`LocaleId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botlocale.html#cfn-lex-bot-botlocale-localeid). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub locale_id: ::Value, + /// Property [`NluConfidenceThreshold`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botlocale.html#cfn-lex-bot-botlocale-nluconfidencethreshold). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub nlu_confidence_threshold: ::Value, + /// Property [`SlotTypes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botlocale.html#cfn-lex-bot-botlocale-slottypes). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub slot_types: Option<::ValueList>, + /// Property [`VoiceSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-botlocale.html#cfn-lex-bot-botlocale-voicesettings). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub voice_settings: Option<::Value>, + } + + impl ::codec::SerializeValue for BotLocale { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref custom_vocabulary) = self.custom_vocabulary { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CustomVocabulary", custom_vocabulary)?; + } + if let Some(ref description) = self.description { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?; + } + if let Some(ref intents) = self.intents { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Intents", intents)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LocaleId", &self.locale_id)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "NluConfidenceThreshold", &self.nlu_confidence_threshold)?; + if let Some(ref slot_types) = self.slot_types { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "SlotTypes", slot_types)?; + } + if let Some(ref voice_settings) = self.voice_settings { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "VoiceSettings", voice_settings)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for BotLocale { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = BotLocale; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type BotLocale") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut custom_vocabulary: Option<::Value> = None; + let mut description: Option<::Value> = None; + let mut intents: Option<::ValueList> = None; + let mut locale_id: Option<::Value> = None; + let mut nlu_confidence_threshold: Option<::Value> = None; + let mut slot_types: Option<::ValueList> = None; + let mut voice_settings: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CustomVocabulary" => { + custom_vocabulary = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Description" => { + description = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Intents" => { + intents = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LocaleId" => { + locale_id = ::serde::de::MapAccess::next_value(&mut map)?; + } + "NluConfidenceThreshold" => { + nlu_confidence_threshold = ::serde::de::MapAccess::next_value(&mut map)?; + } + "SlotTypes" => { + slot_types = ::serde::de::MapAccess::next_value(&mut map)?; + } + "VoiceSettings" => { + voice_settings = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(BotLocale { + custom_vocabulary: custom_vocabulary, + description: description, + intents: intents, + locale_id: locale_id.ok_or(::serde::de::Error::missing_field("LocaleId"))?, + nlu_confidence_threshold: nlu_confidence_threshold.ok_or(::serde::de::Error::missing_field("NluConfidenceThreshold"))?, + slot_types: slot_types, + voice_settings: voice_settings, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Lex::Bot.Button`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-button.html) property type. + #[derive(Debug, Default)] + pub struct Button { + /// Property [`Text`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-button.html#cfn-lex-bot-button-text). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub text: ::Value, + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-button.html#cfn-lex-bot-button-value). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub value: ::Value, + } + + impl ::codec::SerializeValue for Button { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Text", &self.text)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", &self.value)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for Button { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = Button; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type Button") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut text: Option<::Value> = None; + let mut value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Text" => { + text = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(Button { + text: text.ok_or(::serde::de::Error::missing_field("Text"))?, + value: value.ok_or(::serde::de::Error::missing_field("Value"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Lex::Bot.CloudWatchLogGroupLogDestination`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-cloudwatchloggrouplogdestination.html) property type. + #[derive(Debug, Default)] + pub struct CloudWatchLogGroupLogDestination { + /// Property [`CloudWatchLogGroupArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-cloudwatchloggrouplogdestination.html#cfn-lex-bot-cloudwatchloggrouplogdestination-cloudwatchloggrouparn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub cloud_watch_log_group_arn: ::Value, + /// Property [`LogPrefix`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-cloudwatchloggrouplogdestination.html#cfn-lex-bot-cloudwatchloggrouplogdestination-logprefix). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub log_prefix: ::Value, + } + + impl ::codec::SerializeValue for CloudWatchLogGroupLogDestination { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CloudWatchLogGroupArn", &self.cloud_watch_log_group_arn)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogPrefix", &self.log_prefix)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CloudWatchLogGroupLogDestination { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CloudWatchLogGroupLogDestination; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CloudWatchLogGroupLogDestination") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut cloud_watch_log_group_arn: Option<::Value> = None; + let mut log_prefix: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CloudWatchLogGroupArn" => { + cloud_watch_log_group_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "LogPrefix" => { + log_prefix = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CloudWatchLogGroupLogDestination { + cloud_watch_log_group_arn: cloud_watch_log_group_arn.ok_or(::serde::de::Error::missing_field("CloudWatchLogGroupArn"))?, + log_prefix: log_prefix.ok_or(::serde::de::Error::missing_field("LogPrefix"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Lex::Bot.CodeHookSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-codehookspecification.html) property type. + #[derive(Debug, Default)] + pub struct CodeHookSpecification { + /// Property [`LambdaCodeHook`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-codehookspecification.html#cfn-lex-bot-codehookspecification-lambdacodehook). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub lambda_code_hook: ::Value, + } + + impl ::codec::SerializeValue for CodeHookSpecification { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "LambdaCodeHook", &self.lambda_code_hook)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CodeHookSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CodeHookSpecification; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CodeHookSpecification") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut lambda_code_hook: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "LambdaCodeHook" => { + lambda_code_hook = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CodeHookSpecification { + lambda_code_hook: lambda_code_hook.ok_or(::serde::de::Error::missing_field("LambdaCodeHook"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Lex::Bot.ConversationLogSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-conversationlogsettings.html) property type. + #[derive(Debug, Default)] + pub struct ConversationLogSettings { + /// Property [`AudioLogSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-conversationlogsettings.html#cfn-lex-bot-conversationlogsettings-audiologsettings). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub audio_log_settings: Option<::ValueList>, + /// Property [`TextLogSettings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-conversationlogsettings.html#cfn-lex-bot-conversationlogsettings-textlogsettings). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub text_log_settings: Option<::ValueList>, + } + + impl ::codec::SerializeValue for ConversationLogSettings { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref audio_log_settings) = self.audio_log_settings { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AudioLogSettings", audio_log_settings)?; + } + if let Some(ref text_log_settings) = self.text_log_settings { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TextLogSettings", text_log_settings)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ConversationLogSettings { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ConversationLogSettings; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ConversationLogSettings") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut audio_log_settings: Option<::ValueList> = None; + let mut text_log_settings: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AudioLogSettings" => { + audio_log_settings = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TextLogSettings" => { + text_log_settings = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ConversationLogSettings { + audio_log_settings: audio_log_settings, + text_log_settings: text_log_settings, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Lex::Bot.CustomPayload`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-custompayload.html) property type. + #[derive(Debug, Default)] + pub struct CustomPayload { + /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-custompayload.html#cfn-lex-bot-custompayload-value). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub value: ::Value, + } + + impl ::codec::SerializeValue for CustomPayload { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", &self.value)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CustomPayload { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CustomPayload; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CustomPayload") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut value: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Value" => { + value = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CustomPayload { + value: value.ok_or(::serde::de::Error::missing_field("Value"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Lex::Bot.CustomVocabulary`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-customvocabulary.html) property type. + #[derive(Debug, Default)] + pub struct CustomVocabulary { + /// Property [`CustomVocabularyItems`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-customvocabulary.html#cfn-lex-bot-customvocabulary-customvocabularyitems). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub custom_vocabulary_items: ::ValueList, + } + + impl ::codec::SerializeValue for CustomVocabulary { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "CustomVocabularyItems", &self.custom_vocabulary_items)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CustomVocabulary { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CustomVocabulary; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CustomVocabulary") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut custom_vocabulary_items: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "CustomVocabularyItems" => { + custom_vocabulary_items = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CustomVocabulary { + custom_vocabulary_items: custom_vocabulary_items.ok_or(::serde::de::Error::missing_field("CustomVocabularyItems"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Lex::Bot.CustomVocabularyItem`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-customvocabularyitem.html) property type. + #[derive(Debug, Default)] + pub struct CustomVocabularyItem { + /// Property [`Phrase`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-customvocabularyitem.html#cfn-lex-bot-customvocabularyitem-phrase). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub phrase: ::Value, + /// Property [`Weight`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-customvocabularyitem.html#cfn-lex-bot-customvocabularyitem-weight). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub weight: Option<::Value>, + } + + impl ::codec::SerializeValue for CustomVocabularyItem { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Phrase", &self.phrase)?; + if let Some(ref weight) = self.weight { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Weight", weight)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for CustomVocabularyItem { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = CustomVocabularyItem; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type CustomVocabularyItem") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut phrase: Option<::Value> = None; + let mut weight: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Phrase" => { + phrase = ::serde::de::MapAccess::next_value(&mut map)?; + } + "Weight" => { + weight = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(CustomVocabularyItem { + phrase: phrase.ok_or(::serde::de::Error::missing_field("Phrase"))?, + weight: weight, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Lex::Bot.DialogCodeHookSetting`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dialogcodehooksetting.html) property type. + #[derive(Debug, Default)] + pub struct DialogCodeHookSetting { + /// Property [`Enabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-dialogcodehooksetting.html#cfn-lex-bot-dialogcodehooksetting-enabled). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enabled: ::Value, + } + + impl ::codec::SerializeValue for DialogCodeHookSetting { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Enabled", &self.enabled)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for DialogCodeHookSetting { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = DialogCodeHookSetting; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type DialogCodeHookSetting") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut enabled: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Enabled" => { + enabled = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(DialogCodeHookSetting { + enabled: enabled.ok_or(::serde::de::Error::missing_field("Enabled"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Lex::Bot.ExternalSourceSetting`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-externalsourcesetting.html) property type. + #[derive(Debug, Default)] + pub struct ExternalSourceSetting { + /// Property [`GrammarSlotTypeSetting`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-externalsourcesetting.html#cfn-lex-bot-externalsourcesetting-grammarslottypesetting). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub grammar_slot_type_setting: Option<::Value>, + } + + impl ::codec::SerializeValue for ExternalSourceSetting { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref grammar_slot_type_setting) = self.grammar_slot_type_setting { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "GrammarSlotTypeSetting", grammar_slot_type_setting)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for ExternalSourceSetting { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = ExternalSourceSetting; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type ExternalSourceSetting") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut grammar_slot_type_setting: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "GrammarSlotTypeSetting" => { + grammar_slot_type_setting = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(ExternalSourceSetting { + grammar_slot_type_setting: grammar_slot_type_setting, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Lex::Bot.FulfillmentCodeHookSetting`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentcodehooksetting.html) property type. + #[derive(Debug, Default)] + pub struct FulfillmentCodeHookSetting { + /// Property [`Enabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentcodehooksetting.html#cfn-lex-bot-fulfillmentcodehooksetting-enabled). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub enabled: ::Value, + /// Property [`FulfillmentUpdatesSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentcodehooksetting.html#cfn-lex-bot-fulfillmentcodehooksetting-fulfillmentupdatesspecification). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub fulfillment_updates_specification: Option<::Value>, + /// Property [`PostFulfillmentStatusSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentcodehooksetting.html#cfn-lex-bot-fulfillmentcodehooksetting-postfulfillmentstatusspecification). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub post_fulfillment_status_specification: Option<::Value>, + } + + impl ::codec::SerializeValue for FulfillmentCodeHookSetting { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Enabled", &self.enabled)?; + if let Some(ref fulfillment_updates_specification) = self.fulfillment_updates_specification { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FulfillmentUpdatesSpecification", fulfillment_updates_specification)?; + } + if let Some(ref post_fulfillment_status_specification) = self.post_fulfillment_status_specification { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "PostFulfillmentStatusSpecification", post_fulfillment_status_specification)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for FulfillmentCodeHookSetting { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = FulfillmentCodeHookSetting; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type FulfillmentCodeHookSetting") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut enabled: Option<::Value> = None; + let mut fulfillment_updates_specification: Option<::Value> = None; + let mut post_fulfillment_status_specification: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Enabled" => { + enabled = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FulfillmentUpdatesSpecification" => { + fulfillment_updates_specification = ::serde::de::MapAccess::next_value(&mut map)?; + } + "PostFulfillmentStatusSpecification" => { + post_fulfillment_status_specification = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(FulfillmentCodeHookSetting { + enabled: enabled.ok_or(::serde::de::Error::missing_field("Enabled"))?, + fulfillment_updates_specification: fulfillment_updates_specification, + post_fulfillment_status_specification: post_fulfillment_status_specification, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Lex::Bot.FulfillmentStartResponseSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentstartresponsespecification.html) property type. + #[derive(Debug, Default)] + pub struct FulfillmentStartResponseSpecification { + /// Property [`AllowInterrupt`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentstartresponsespecification.html#cfn-lex-bot-fulfillmentstartresponsespecification-allowinterrupt). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub allow_interrupt: Option<::Value>, + /// Property [`DelayInSeconds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentstartresponsespecification.html#cfn-lex-bot-fulfillmentstartresponsespecification-delayinseconds). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub delay_in_seconds: ::Value, + /// Property [`MessageGroups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentstartresponsespecification.html#cfn-lex-bot-fulfillmentstartresponsespecification-messagegroups). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub message_groups: ::ValueList, + } + + impl ::codec::SerializeValue for FulfillmentStartResponseSpecification { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref allow_interrupt) = self.allow_interrupt { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AllowInterrupt", allow_interrupt)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "DelayInSeconds", &self.delay_in_seconds)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MessageGroups", &self.message_groups)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for FulfillmentStartResponseSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = FulfillmentStartResponseSpecification; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type FulfillmentStartResponseSpecification") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut allow_interrupt: Option<::Value> = None; + let mut delay_in_seconds: Option<::Value> = None; + let mut message_groups: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AllowInterrupt" => { + allow_interrupt = ::serde::de::MapAccess::next_value(&mut map)?; + } + "DelayInSeconds" => { + delay_in_seconds = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MessageGroups" => { + message_groups = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(FulfillmentStartResponseSpecification { + allow_interrupt: allow_interrupt, + delay_in_seconds: delay_in_seconds.ok_or(::serde::de::Error::missing_field("DelayInSeconds"))?, + message_groups: message_groups.ok_or(::serde::de::Error::missing_field("MessageGroups"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Lex::Bot.FulfillmentUpdateResponseSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentupdateresponsespecification.html) property type. + #[derive(Debug, Default)] + pub struct FulfillmentUpdateResponseSpecification { + /// Property [`AllowInterrupt`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentupdateresponsespecification.html#cfn-lex-bot-fulfillmentupdateresponsespecification-allowinterrupt). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub allow_interrupt: Option<::Value>, + /// Property [`FrequencyInSeconds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentupdateresponsespecification.html#cfn-lex-bot-fulfillmentupdateresponsespecification-frequencyinseconds). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub frequency_in_seconds: ::Value, + /// Property [`MessageGroups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentupdateresponsespecification.html#cfn-lex-bot-fulfillmentupdateresponsespecification-messagegroups). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub message_groups: ::ValueList, + } + + impl ::codec::SerializeValue for FulfillmentUpdateResponseSpecification { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref allow_interrupt) = self.allow_interrupt { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "AllowInterrupt", allow_interrupt)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "FrequencyInSeconds", &self.frequency_in_seconds)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "MessageGroups", &self.message_groups)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for FulfillmentUpdateResponseSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = FulfillmentUpdateResponseSpecification; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type FulfillmentUpdateResponseSpecification") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut allow_interrupt: Option<::Value> = None; + let mut frequency_in_seconds: Option<::Value> = None; + let mut message_groups: Option<::ValueList> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "AllowInterrupt" => { + allow_interrupt = ::serde::de::MapAccess::next_value(&mut map)?; + } + "FrequencyInSeconds" => { + frequency_in_seconds = ::serde::de::MapAccess::next_value(&mut map)?; + } + "MessageGroups" => { + message_groups = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(FulfillmentUpdateResponseSpecification { + allow_interrupt: allow_interrupt, + frequency_in_seconds: frequency_in_seconds.ok_or(::serde::de::Error::missing_field("FrequencyInSeconds"))?, + message_groups: message_groups.ok_or(::serde::de::Error::missing_field("MessageGroups"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Lex::Bot.FulfillmentUpdatesSpecification`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentupdatesspecification.html) property type. + #[derive(Debug, Default)] + pub struct FulfillmentUpdatesSpecification { + /// Property [`Active`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentupdatesspecification.html#cfn-lex-bot-fulfillmentupdatesspecification-active). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub active: ::Value, + /// Property [`StartResponse`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentupdatesspecification.html#cfn-lex-bot-fulfillmentupdatesspecification-startresponse). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub start_response: Option<::Value>, + /// Property [`TimeoutInSeconds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentupdatesspecification.html#cfn-lex-bot-fulfillmentupdatesspecification-timeoutinseconds). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub timeout_in_seconds: Option<::Value>, + /// Property [`UpdateResponse`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-fulfillmentupdatesspecification.html#cfn-lex-bot-fulfillmentupdatesspecification-updateresponse). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub update_response: Option<::Value>, + } + + impl ::codec::SerializeValue for FulfillmentUpdatesSpecification { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Active", &self.active)?; + if let Some(ref start_response) = self.start_response { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "StartResponse", start_response)?; + } + if let Some(ref timeout_in_seconds) = self.timeout_in_seconds { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "TimeoutInSeconds", timeout_in_seconds)?; + } + if let Some(ref update_response) = self.update_response { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "UpdateResponse", update_response)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for FulfillmentUpdatesSpecification { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = FulfillmentUpdatesSpecification; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type FulfillmentUpdatesSpecification") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut active: Option<::Value> = None; + let mut start_response: Option<::Value> = None; + let mut timeout_in_seconds: Option<::Value> = None; + let mut update_response: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Active" => { + active = ::serde::de::MapAccess::next_value(&mut map)?; + } + "StartResponse" => { + start_response = ::serde::de::MapAccess::next_value(&mut map)?; + } + "TimeoutInSeconds" => { + timeout_in_seconds = ::serde::de::MapAccess::next_value(&mut map)?; + } + "UpdateResponse" => { + update_response = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(FulfillmentUpdatesSpecification { + active: active.ok_or(::serde::de::Error::missing_field("Active"))?, + start_response: start_response, + timeout_in_seconds: timeout_in_seconds, + update_response: update_response, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Lex::Bot.GrammarSlotTypeSetting`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-grammarslottypesetting.html) property type. + #[derive(Debug, Default)] + pub struct GrammarSlotTypeSetting { + /// Property [`Source`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-grammarslottypesetting.html#cfn-lex-bot-grammarslottypesetting-source). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub source: Option<::Value>, + } + + impl ::codec::SerializeValue for GrammarSlotTypeSetting { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref source) = self.source { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "Source", source)?; + } + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for GrammarSlotTypeSetting { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = GrammarSlotTypeSetting; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type GrammarSlotTypeSetting") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut source: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "Source" => { + source = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(GrammarSlotTypeSetting { + source: source, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Lex::Bot.GrammarSlotTypeSource`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-grammarslottypesource.html) property type. + #[derive(Debug, Default)] + pub struct GrammarSlotTypeSource { + /// Property [`KmsKeyArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-grammarslottypesource.html#cfn-lex-bot-grammarslottypesource-kmskeyarn). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub kms_key_arn: Option<::Value>, + /// Property [`S3BucketName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-grammarslottypesource.html#cfn-lex-bot-grammarslottypesource-s3bucketname). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub s3_bucket_name: ::Value, + /// Property [`S3ObjectKey`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-grammarslottypesource.html#cfn-lex-bot-grammarslottypesource-s3objectkey). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub s3_object_key: ::Value, + } + + impl ::codec::SerializeValue for GrammarSlotTypeSource { + fn serialize(&self, s: S) -> Result { + let mut map = ::serde::Serializer::serialize_map(s, None)?; + if let Some(ref kms_key_arn) = self.kms_key_arn { + ::serde::ser::SerializeMap::serialize_entry(&mut map, "KmsKeyArn", kms_key_arn)?; + } + ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3BucketName", &self.s3_bucket_name)?; + ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3ObjectKey", &self.s3_object_key)?; + ::serde::ser::SerializeMap::end(map) + } + } + + impl ::codec::DeserializeValue for GrammarSlotTypeSource { + fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result { + struct Visitor; + + impl<'de> ::serde::de::Visitor<'de> for Visitor { + type Value = GrammarSlotTypeSource; + + fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { + write!(f, "a struct of type GrammarSlotTypeSource") + } + + fn visit_map>(self, mut map: A) -> Result { + let mut kms_key_arn: Option<::Value> = None; + let mut s3_bucket_name: Option<::Value> = None; + let mut s3_object_key: Option<::Value> = None; + + while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::(&mut map)? { + match __cfn_key.as_ref() { + "KmsKeyArn" => { + kms_key_arn = ::serde::de::MapAccess::next_value(&mut map)?; + } + "S3BucketName" => { + s3_bucket_name = ::serde::de::MapAccess::next_value(&mut map)?; + } + "S3ObjectKey" => { + s3_object_key = ::serde::de::MapAccess::next_value(&mut map)?; + } + _ => {} + } + } + + Ok(GrammarSlotTypeSource { + kms_key_arn: kms_key_arn, + s3_bucket_name: s3_bucket_name.ok_or(::serde::de::Error::missing_field("S3BucketName"))?, + s3_object_key: s3_object_key.ok_or(::serde::de::Error::missing_field("S3ObjectKey"))?, + }) + } + } + + d.deserialize_map(Visitor) + } + } + + /// The [`AWS::Lex::Bot.ImageResponseCard`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-imageresponsecard.html) property type. + #[derive(Debug, Default)] + pub struct ImageResponseCard { + /// Property [`Buttons`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lex-bot-imageresponsecard.html#cfn-lex-bot-imageresponsecard-buttons). + /// + /// Update type: _Mutable_. + /// AWS CloudFormation doesn't replace the resource when you change this property. + pub buttons: Option<::ValueList