cfn/aws/
kinesisanalyticsv2.rs

1//! Types for the `KinesisAnalyticsV2` service.
2
3/// The [`AWS::KinesisAnalyticsV2::Application`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-application.html) resource type.
4#[derive(Debug, Default)]
5pub struct Application {
6    properties: ApplicationProperties
7}
8
9/// Properties for the `Application` resource.
10#[derive(Debug, Default)]
11pub struct ApplicationProperties {
12    /// Property [`ApplicationConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-application.html#cfn-kinesisanalyticsv2-application-applicationconfiguration).
13    ///
14    /// Update type: _Mutable_.
15    /// AWS CloudFormation doesn't replace the resource when you change this property.
16    pub application_configuration: Option<::Value<self::application::ApplicationConfiguration>>,
17    /// Property [`ApplicationDescription`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-application.html#cfn-kinesisanalyticsv2-application-applicationdescription).
18    ///
19    /// Update type: _Mutable_.
20    /// AWS CloudFormation doesn't replace the resource when you change this property.
21    pub application_description: Option<::Value<String>>,
22    /// Property [`ApplicationMode`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-application.html#cfn-kinesisanalyticsv2-application-applicationmode).
23    ///
24    /// Update type: _Immutable_.
25    /// AWS CloudFormation replaces the resource when you change this property.
26    pub application_mode: Option<::Value<String>>,
27    /// Property [`ApplicationName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-application.html#cfn-kinesisanalyticsv2-application-applicationname).
28    ///
29    /// Update type: _Immutable_.
30    /// AWS CloudFormation replaces the resource when you change this property.
31    pub application_name: Option<::Value<String>>,
32    /// Property [`RuntimeEnvironment`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-application.html#cfn-kinesisanalyticsv2-application-runtimeenvironment).
33    ///
34    /// Update type: _Immutable_.
35    /// AWS CloudFormation replaces the resource when you change this property.
36    pub runtime_environment: ::Value<String>,
37    /// Property [`ServiceExecutionRole`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-application.html#cfn-kinesisanalyticsv2-application-serviceexecutionrole).
38    ///
39    /// Update type: _Mutable_.
40    /// AWS CloudFormation doesn't replace the resource when you change this property.
41    pub service_execution_role: ::Value<String>,
42    /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-application.html#cfn-kinesisanalyticsv2-application-tags).
43    ///
44    /// Update type: _Mutable_.
45    /// AWS CloudFormation doesn't replace the resource when you change this property.
46    pub tags: Option<::ValueList<::Tag>>,
47}
48
49impl ::serde::Serialize for ApplicationProperties {
50    fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
51        let mut map = ::serde::Serializer::serialize_map(s, None)?;
52        if let Some(ref application_configuration) = self.application_configuration {
53            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ApplicationConfiguration", application_configuration)?;
54        }
55        if let Some(ref application_description) = self.application_description {
56            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ApplicationDescription", application_description)?;
57        }
58        if let Some(ref application_mode) = self.application_mode {
59            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ApplicationMode", application_mode)?;
60        }
61        if let Some(ref application_name) = self.application_name {
62            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ApplicationName", application_name)?;
63        }
64        ::serde::ser::SerializeMap::serialize_entry(&mut map, "RuntimeEnvironment", &self.runtime_environment)?;
65        ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServiceExecutionRole", &self.service_execution_role)?;
66        if let Some(ref tags) = self.tags {
67            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?;
68        }
69        ::serde::ser::SerializeMap::end(map)
70    }
71}
72
73impl<'de> ::serde::Deserialize<'de> for ApplicationProperties {
74    fn deserialize<D: ::serde::Deserializer<'de>>(d: D) -> Result<ApplicationProperties, D::Error> {
75        struct Visitor;
76
77        impl<'de> ::serde::de::Visitor<'de> for Visitor {
78            type Value = ApplicationProperties;
79
80            fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
81                write!(f, "a struct of type ApplicationProperties")
82            }
83
84            fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
85                let mut application_configuration: Option<::Value<self::application::ApplicationConfiguration>> = None;
86                let mut application_description: Option<::Value<String>> = None;
87                let mut application_mode: Option<::Value<String>> = None;
88                let mut application_name: Option<::Value<String>> = None;
89                let mut runtime_environment: Option<::Value<String>> = None;
90                let mut service_execution_role: Option<::Value<String>> = None;
91                let mut tags: Option<::ValueList<::Tag>> = None;
92
93                while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
94                    match __cfn_key.as_ref() {
95                        "ApplicationConfiguration" => {
96                            application_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
97                        }
98                        "ApplicationDescription" => {
99                            application_description = ::serde::de::MapAccess::next_value(&mut map)?;
100                        }
101                        "ApplicationMode" => {
102                            application_mode = ::serde::de::MapAccess::next_value(&mut map)?;
103                        }
104                        "ApplicationName" => {
105                            application_name = ::serde::de::MapAccess::next_value(&mut map)?;
106                        }
107                        "RuntimeEnvironment" => {
108                            runtime_environment = ::serde::de::MapAccess::next_value(&mut map)?;
109                        }
110                        "ServiceExecutionRole" => {
111                            service_execution_role = ::serde::de::MapAccess::next_value(&mut map)?;
112                        }
113                        "Tags" => {
114                            tags = ::serde::de::MapAccess::next_value(&mut map)?;
115                        }
116                        _ => {}
117                    }
118                }
119
120                Ok(ApplicationProperties {
121                    application_configuration: application_configuration,
122                    application_description: application_description,
123                    application_mode: application_mode,
124                    application_name: application_name,
125                    runtime_environment: runtime_environment.ok_or(::serde::de::Error::missing_field("RuntimeEnvironment"))?,
126                    service_execution_role: service_execution_role.ok_or(::serde::de::Error::missing_field("ServiceExecutionRole"))?,
127                    tags: tags,
128                })
129            }
130        }
131
132        d.deserialize_map(Visitor)
133    }
134}
135
136impl ::Resource for Application {
137    type Properties = ApplicationProperties;
138    const TYPE: &'static str = "AWS::KinesisAnalyticsV2::Application";
139    fn properties(&self) -> &ApplicationProperties {
140        &self.properties
141    }
142    fn properties_mut(&mut self) -> &mut ApplicationProperties {
143        &mut self.properties
144    }
145}
146
147impl ::private::Sealed for Application {}
148
149impl From<ApplicationProperties> for Application {
150    fn from(properties: ApplicationProperties) -> Application {
151        Application { properties }
152    }
153}
154
155/// The [`AWS::KinesisAnalyticsV2::ApplicationCloudWatchLoggingOption`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-applicationcloudwatchloggingoption.html) resource type.
156#[derive(Debug, Default)]
157pub struct ApplicationCloudWatchLoggingOption {
158    properties: ApplicationCloudWatchLoggingOptionProperties
159}
160
161/// Properties for the `ApplicationCloudWatchLoggingOption` resource.
162#[derive(Debug, Default)]
163pub struct ApplicationCloudWatchLoggingOptionProperties {
164    /// Property [`ApplicationName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-applicationcloudwatchloggingoption.html#cfn-kinesisanalyticsv2-applicationcloudwatchloggingoption-applicationname).
165    ///
166    /// Update type: _Immutable_.
167    /// AWS CloudFormation replaces the resource when you change this property.
168    pub application_name: ::Value<String>,
169    /// Property [`CloudWatchLoggingOption`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-applicationcloudwatchloggingoption.html#cfn-kinesisanalyticsv2-applicationcloudwatchloggingoption-cloudwatchloggingoption).
170    ///
171    /// Update type: _Mutable_.
172    /// AWS CloudFormation doesn't replace the resource when you change this property.
173    pub cloud_watch_logging_option: ::Value<self::application_cloud_watch_logging_option::CloudWatchLoggingOption>,
174}
175
176impl ::serde::Serialize for ApplicationCloudWatchLoggingOptionProperties {
177    fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
178        let mut map = ::serde::Serializer::serialize_map(s, None)?;
179        ::serde::ser::SerializeMap::serialize_entry(&mut map, "ApplicationName", &self.application_name)?;
180        ::serde::ser::SerializeMap::serialize_entry(&mut map, "CloudWatchLoggingOption", &self.cloud_watch_logging_option)?;
181        ::serde::ser::SerializeMap::end(map)
182    }
183}
184
185impl<'de> ::serde::Deserialize<'de> for ApplicationCloudWatchLoggingOptionProperties {
186    fn deserialize<D: ::serde::Deserializer<'de>>(d: D) -> Result<ApplicationCloudWatchLoggingOptionProperties, D::Error> {
187        struct Visitor;
188
189        impl<'de> ::serde::de::Visitor<'de> for Visitor {
190            type Value = ApplicationCloudWatchLoggingOptionProperties;
191
192            fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
193                write!(f, "a struct of type ApplicationCloudWatchLoggingOptionProperties")
194            }
195
196            fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
197                let mut application_name: Option<::Value<String>> = None;
198                let mut cloud_watch_logging_option: Option<::Value<self::application_cloud_watch_logging_option::CloudWatchLoggingOption>> = None;
199
200                while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
201                    match __cfn_key.as_ref() {
202                        "ApplicationName" => {
203                            application_name = ::serde::de::MapAccess::next_value(&mut map)?;
204                        }
205                        "CloudWatchLoggingOption" => {
206                            cloud_watch_logging_option = ::serde::de::MapAccess::next_value(&mut map)?;
207                        }
208                        _ => {}
209                    }
210                }
211
212                Ok(ApplicationCloudWatchLoggingOptionProperties {
213                    application_name: application_name.ok_or(::serde::de::Error::missing_field("ApplicationName"))?,
214                    cloud_watch_logging_option: cloud_watch_logging_option.ok_or(::serde::de::Error::missing_field("CloudWatchLoggingOption"))?,
215                })
216            }
217        }
218
219        d.deserialize_map(Visitor)
220    }
221}
222
223impl ::Resource for ApplicationCloudWatchLoggingOption {
224    type Properties = ApplicationCloudWatchLoggingOptionProperties;
225    const TYPE: &'static str = "AWS::KinesisAnalyticsV2::ApplicationCloudWatchLoggingOption";
226    fn properties(&self) -> &ApplicationCloudWatchLoggingOptionProperties {
227        &self.properties
228    }
229    fn properties_mut(&mut self) -> &mut ApplicationCloudWatchLoggingOptionProperties {
230        &mut self.properties
231    }
232}
233
234impl ::private::Sealed for ApplicationCloudWatchLoggingOption {}
235
236impl From<ApplicationCloudWatchLoggingOptionProperties> for ApplicationCloudWatchLoggingOption {
237    fn from(properties: ApplicationCloudWatchLoggingOptionProperties) -> ApplicationCloudWatchLoggingOption {
238        ApplicationCloudWatchLoggingOption { properties }
239    }
240}
241
242/// The [`AWS::KinesisAnalyticsV2::ApplicationOutput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-applicationoutput.html) resource type.
243#[derive(Debug, Default)]
244pub struct ApplicationOutput {
245    properties: ApplicationOutputProperties
246}
247
248/// Properties for the `ApplicationOutput` resource.
249#[derive(Debug, Default)]
250pub struct ApplicationOutputProperties {
251    /// Property [`ApplicationName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-applicationoutput.html#cfn-kinesisanalyticsv2-applicationoutput-applicationname).
252    ///
253    /// Update type: _Immutable_.
254    /// AWS CloudFormation replaces the resource when you change this property.
255    pub application_name: ::Value<String>,
256    /// Property [`Output`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-applicationoutput.html#cfn-kinesisanalyticsv2-applicationoutput-output).
257    ///
258    /// Update type: _Mutable_.
259    /// AWS CloudFormation doesn't replace the resource when you change this property.
260    pub output: ::Value<self::application_output::Output>,
261}
262
263impl ::serde::Serialize for ApplicationOutputProperties {
264    fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
265        let mut map = ::serde::Serializer::serialize_map(s, None)?;
266        ::serde::ser::SerializeMap::serialize_entry(&mut map, "ApplicationName", &self.application_name)?;
267        ::serde::ser::SerializeMap::serialize_entry(&mut map, "Output", &self.output)?;
268        ::serde::ser::SerializeMap::end(map)
269    }
270}
271
272impl<'de> ::serde::Deserialize<'de> for ApplicationOutputProperties {
273    fn deserialize<D: ::serde::Deserializer<'de>>(d: D) -> Result<ApplicationOutputProperties, D::Error> {
274        struct Visitor;
275
276        impl<'de> ::serde::de::Visitor<'de> for Visitor {
277            type Value = ApplicationOutputProperties;
278
279            fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
280                write!(f, "a struct of type ApplicationOutputProperties")
281            }
282
283            fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
284                let mut application_name: Option<::Value<String>> = None;
285                let mut output: Option<::Value<self::application_output::Output>> = None;
286
287                while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
288                    match __cfn_key.as_ref() {
289                        "ApplicationName" => {
290                            application_name = ::serde::de::MapAccess::next_value(&mut map)?;
291                        }
292                        "Output" => {
293                            output = ::serde::de::MapAccess::next_value(&mut map)?;
294                        }
295                        _ => {}
296                    }
297                }
298
299                Ok(ApplicationOutputProperties {
300                    application_name: application_name.ok_or(::serde::de::Error::missing_field("ApplicationName"))?,
301                    output: output.ok_or(::serde::de::Error::missing_field("Output"))?,
302                })
303            }
304        }
305
306        d.deserialize_map(Visitor)
307    }
308}
309
310impl ::Resource for ApplicationOutput {
311    type Properties = ApplicationOutputProperties;
312    const TYPE: &'static str = "AWS::KinesisAnalyticsV2::ApplicationOutput";
313    fn properties(&self) -> &ApplicationOutputProperties {
314        &self.properties
315    }
316    fn properties_mut(&mut self) -> &mut ApplicationOutputProperties {
317        &mut self.properties
318    }
319}
320
321impl ::private::Sealed for ApplicationOutput {}
322
323impl From<ApplicationOutputProperties> for ApplicationOutput {
324    fn from(properties: ApplicationOutputProperties) -> ApplicationOutput {
325        ApplicationOutput { properties }
326    }
327}
328
329/// The [`AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-applicationreferencedatasource.html) resource type.
330#[derive(Debug, Default)]
331pub struct ApplicationReferenceDataSource {
332    properties: ApplicationReferenceDataSourceProperties
333}
334
335/// Properties for the `ApplicationReferenceDataSource` resource.
336#[derive(Debug, Default)]
337pub struct ApplicationReferenceDataSourceProperties {
338    /// Property [`ApplicationName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-applicationreferencedatasource.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-applicationname).
339    ///
340    /// Update type: _Immutable_.
341    /// AWS CloudFormation replaces the resource when you change this property.
342    pub application_name: ::Value<String>,
343    /// Property [`ReferenceDataSource`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesisanalyticsv2-applicationreferencedatasource.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-referencedatasource).
344    ///
345    /// Update type: _Mutable_.
346    /// AWS CloudFormation doesn't replace the resource when you change this property.
347    pub reference_data_source: ::Value<self::application_reference_data_source::ReferenceDataSource>,
348}
349
350impl ::serde::Serialize for ApplicationReferenceDataSourceProperties {
351    fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
352        let mut map = ::serde::Serializer::serialize_map(s, None)?;
353        ::serde::ser::SerializeMap::serialize_entry(&mut map, "ApplicationName", &self.application_name)?;
354        ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReferenceDataSource", &self.reference_data_source)?;
355        ::serde::ser::SerializeMap::end(map)
356    }
357}
358
359impl<'de> ::serde::Deserialize<'de> for ApplicationReferenceDataSourceProperties {
360    fn deserialize<D: ::serde::Deserializer<'de>>(d: D) -> Result<ApplicationReferenceDataSourceProperties, D::Error> {
361        struct Visitor;
362
363        impl<'de> ::serde::de::Visitor<'de> for Visitor {
364            type Value = ApplicationReferenceDataSourceProperties;
365
366            fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
367                write!(f, "a struct of type ApplicationReferenceDataSourceProperties")
368            }
369
370            fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
371                let mut application_name: Option<::Value<String>> = None;
372                let mut reference_data_source: Option<::Value<self::application_reference_data_source::ReferenceDataSource>> = None;
373
374                while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
375                    match __cfn_key.as_ref() {
376                        "ApplicationName" => {
377                            application_name = ::serde::de::MapAccess::next_value(&mut map)?;
378                        }
379                        "ReferenceDataSource" => {
380                            reference_data_source = ::serde::de::MapAccess::next_value(&mut map)?;
381                        }
382                        _ => {}
383                    }
384                }
385
386                Ok(ApplicationReferenceDataSourceProperties {
387                    application_name: application_name.ok_or(::serde::de::Error::missing_field("ApplicationName"))?,
388                    reference_data_source: reference_data_source.ok_or(::serde::de::Error::missing_field("ReferenceDataSource"))?,
389                })
390            }
391        }
392
393        d.deserialize_map(Visitor)
394    }
395}
396
397impl ::Resource for ApplicationReferenceDataSource {
398    type Properties = ApplicationReferenceDataSourceProperties;
399    const TYPE: &'static str = "AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource";
400    fn properties(&self) -> &ApplicationReferenceDataSourceProperties {
401        &self.properties
402    }
403    fn properties_mut(&mut self) -> &mut ApplicationReferenceDataSourceProperties {
404        &mut self.properties
405    }
406}
407
408impl ::private::Sealed for ApplicationReferenceDataSource {}
409
410impl From<ApplicationReferenceDataSourceProperties> for ApplicationReferenceDataSource {
411    fn from(properties: ApplicationReferenceDataSourceProperties) -> ApplicationReferenceDataSource {
412        ApplicationReferenceDataSource { properties }
413    }
414}
415
416pub mod application {
417    //! Property types for the `Application` resource.
418
419    /// The [`AWS::KinesisAnalyticsV2::Application.ApplicationCodeConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationcodeconfiguration.html) property type.
420    #[derive(Debug, Default)]
421    pub struct ApplicationCodeConfiguration {
422        /// Property [`CodeContent`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationcodeconfiguration.html#cfn-kinesisanalyticsv2-application-applicationcodeconfiguration-codecontent).
423        ///
424        /// Update type: _Mutable_.
425        /// AWS CloudFormation doesn't replace the resource when you change this property.
426        pub code_content: ::Value<CodeContent>,
427        /// Property [`CodeContentType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationcodeconfiguration.html#cfn-kinesisanalyticsv2-application-applicationcodeconfiguration-codecontenttype).
428        ///
429        /// Update type: _Mutable_.
430        /// AWS CloudFormation doesn't replace the resource when you change this property.
431        pub code_content_type: ::Value<String>,
432    }
433
434    impl ::codec::SerializeValue for ApplicationCodeConfiguration {
435        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
436            let mut map = ::serde::Serializer::serialize_map(s, None)?;
437            ::serde::ser::SerializeMap::serialize_entry(&mut map, "CodeContent", &self.code_content)?;
438            ::serde::ser::SerializeMap::serialize_entry(&mut map, "CodeContentType", &self.code_content_type)?;
439            ::serde::ser::SerializeMap::end(map)
440        }
441    }
442
443    impl ::codec::DeserializeValue for ApplicationCodeConfiguration {
444        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ApplicationCodeConfiguration, D::Error> {
445            struct Visitor;
446
447            impl<'de> ::serde::de::Visitor<'de> for Visitor {
448                type Value = ApplicationCodeConfiguration;
449
450                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
451                    write!(f, "a struct of type ApplicationCodeConfiguration")
452                }
453
454                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
455                    let mut code_content: Option<::Value<CodeContent>> = None;
456                    let mut code_content_type: Option<::Value<String>> = None;
457
458                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
459                        match __cfn_key.as_ref() {
460                            "CodeContent" => {
461                                code_content = ::serde::de::MapAccess::next_value(&mut map)?;
462                            }
463                            "CodeContentType" => {
464                                code_content_type = ::serde::de::MapAccess::next_value(&mut map)?;
465                            }
466                            _ => {}
467                        }
468                    }
469
470                    Ok(ApplicationCodeConfiguration {
471                        code_content: code_content.ok_or(::serde::de::Error::missing_field("CodeContent"))?,
472                        code_content_type: code_content_type.ok_or(::serde::de::Error::missing_field("CodeContentType"))?,
473                    })
474                }
475            }
476
477            d.deserialize_map(Visitor)
478        }
479    }
480
481    /// The [`AWS::KinesisAnalyticsV2::Application.ApplicationConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationconfiguration.html) property type.
482    #[derive(Debug, Default)]
483    pub struct ApplicationConfiguration {
484        /// Property [`ApplicationCodeConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationconfiguration.html#cfn-kinesisanalyticsv2-application-applicationconfiguration-applicationcodeconfiguration).
485        ///
486        /// Update type: _Mutable_.
487        /// AWS CloudFormation doesn't replace the resource when you change this property.
488        pub application_code_configuration: Option<::Value<ApplicationCodeConfiguration>>,
489        /// Property [`ApplicationSnapshotConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationconfiguration.html#cfn-kinesisanalyticsv2-application-applicationconfiguration-applicationsnapshotconfiguration).
490        ///
491        /// Update type: _Mutable_.
492        /// AWS CloudFormation doesn't replace the resource when you change this property.
493        pub application_snapshot_configuration: Option<::Value<ApplicationSnapshotConfiguration>>,
494        /// Property [`EnvironmentProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationconfiguration.html#cfn-kinesisanalyticsv2-application-applicationconfiguration-environmentproperties).
495        ///
496        /// Update type: _Mutable_.
497        /// AWS CloudFormation doesn't replace the resource when you change this property.
498        pub environment_properties: Option<::Value<EnvironmentProperties>>,
499        /// Property [`FlinkApplicationConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationconfiguration.html#cfn-kinesisanalyticsv2-application-applicationconfiguration-flinkapplicationconfiguration).
500        ///
501        /// Update type: _Mutable_.
502        /// AWS CloudFormation doesn't replace the resource when you change this property.
503        pub flink_application_configuration: Option<::Value<FlinkApplicationConfiguration>>,
504        /// Property [`SqlApplicationConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationconfiguration.html#cfn-kinesisanalyticsv2-application-applicationconfiguration-sqlapplicationconfiguration).
505        ///
506        /// Update type: _Mutable_.
507        /// AWS CloudFormation doesn't replace the resource when you change this property.
508        pub sql_application_configuration: Option<::Value<SqlApplicationConfiguration>>,
509        /// Property [`ZeppelinApplicationConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationconfiguration.html#cfn-kinesisanalyticsv2-application-applicationconfiguration-zeppelinapplicationconfiguration).
510        ///
511        /// Update type: _Mutable_.
512        /// AWS CloudFormation doesn't replace the resource when you change this property.
513        pub zeppelin_application_configuration: Option<::Value<ZeppelinApplicationConfiguration>>,
514    }
515
516    impl ::codec::SerializeValue for ApplicationConfiguration {
517        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
518            let mut map = ::serde::Serializer::serialize_map(s, None)?;
519            if let Some(ref application_code_configuration) = self.application_code_configuration {
520                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ApplicationCodeConfiguration", application_code_configuration)?;
521            }
522            if let Some(ref application_snapshot_configuration) = self.application_snapshot_configuration {
523                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ApplicationSnapshotConfiguration", application_snapshot_configuration)?;
524            }
525            if let Some(ref environment_properties) = self.environment_properties {
526                ::serde::ser::SerializeMap::serialize_entry(&mut map, "EnvironmentProperties", environment_properties)?;
527            }
528            if let Some(ref flink_application_configuration) = self.flink_application_configuration {
529                ::serde::ser::SerializeMap::serialize_entry(&mut map, "FlinkApplicationConfiguration", flink_application_configuration)?;
530            }
531            if let Some(ref sql_application_configuration) = self.sql_application_configuration {
532                ::serde::ser::SerializeMap::serialize_entry(&mut map, "SqlApplicationConfiguration", sql_application_configuration)?;
533            }
534            if let Some(ref zeppelin_application_configuration) = self.zeppelin_application_configuration {
535                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ZeppelinApplicationConfiguration", zeppelin_application_configuration)?;
536            }
537            ::serde::ser::SerializeMap::end(map)
538        }
539    }
540
541    impl ::codec::DeserializeValue for ApplicationConfiguration {
542        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ApplicationConfiguration, D::Error> {
543            struct Visitor;
544
545            impl<'de> ::serde::de::Visitor<'de> for Visitor {
546                type Value = ApplicationConfiguration;
547
548                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
549                    write!(f, "a struct of type ApplicationConfiguration")
550                }
551
552                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
553                    let mut application_code_configuration: Option<::Value<ApplicationCodeConfiguration>> = None;
554                    let mut application_snapshot_configuration: Option<::Value<ApplicationSnapshotConfiguration>> = None;
555                    let mut environment_properties: Option<::Value<EnvironmentProperties>> = None;
556                    let mut flink_application_configuration: Option<::Value<FlinkApplicationConfiguration>> = None;
557                    let mut sql_application_configuration: Option<::Value<SqlApplicationConfiguration>> = None;
558                    let mut zeppelin_application_configuration: Option<::Value<ZeppelinApplicationConfiguration>> = None;
559
560                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
561                        match __cfn_key.as_ref() {
562                            "ApplicationCodeConfiguration" => {
563                                application_code_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
564                            }
565                            "ApplicationSnapshotConfiguration" => {
566                                application_snapshot_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
567                            }
568                            "EnvironmentProperties" => {
569                                environment_properties = ::serde::de::MapAccess::next_value(&mut map)?;
570                            }
571                            "FlinkApplicationConfiguration" => {
572                                flink_application_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
573                            }
574                            "SqlApplicationConfiguration" => {
575                                sql_application_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
576                            }
577                            "ZeppelinApplicationConfiguration" => {
578                                zeppelin_application_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
579                            }
580                            _ => {}
581                        }
582                    }
583
584                    Ok(ApplicationConfiguration {
585                        application_code_configuration: application_code_configuration,
586                        application_snapshot_configuration: application_snapshot_configuration,
587                        environment_properties: environment_properties,
588                        flink_application_configuration: flink_application_configuration,
589                        sql_application_configuration: sql_application_configuration,
590                        zeppelin_application_configuration: zeppelin_application_configuration,
591                    })
592                }
593            }
594
595            d.deserialize_map(Visitor)
596        }
597    }
598
599    /// The [`AWS::KinesisAnalyticsV2::Application.ApplicationSnapshotConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationsnapshotconfiguration.html) property type.
600    #[derive(Debug, Default)]
601    pub struct ApplicationSnapshotConfiguration {
602        /// Property [`SnapshotsEnabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-applicationsnapshotconfiguration.html#cfn-kinesisanalyticsv2-application-applicationsnapshotconfiguration-snapshotsenabled).
603        ///
604        /// Update type: _Mutable_.
605        /// AWS CloudFormation doesn't replace the resource when you change this property.
606        pub snapshots_enabled: ::Value<bool>,
607    }
608
609    impl ::codec::SerializeValue for ApplicationSnapshotConfiguration {
610        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
611            let mut map = ::serde::Serializer::serialize_map(s, None)?;
612            ::serde::ser::SerializeMap::serialize_entry(&mut map, "SnapshotsEnabled", &self.snapshots_enabled)?;
613            ::serde::ser::SerializeMap::end(map)
614        }
615    }
616
617    impl ::codec::DeserializeValue for ApplicationSnapshotConfiguration {
618        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ApplicationSnapshotConfiguration, D::Error> {
619            struct Visitor;
620
621            impl<'de> ::serde::de::Visitor<'de> for Visitor {
622                type Value = ApplicationSnapshotConfiguration;
623
624                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
625                    write!(f, "a struct of type ApplicationSnapshotConfiguration")
626                }
627
628                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
629                    let mut snapshots_enabled: Option<::Value<bool>> = None;
630
631                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
632                        match __cfn_key.as_ref() {
633                            "SnapshotsEnabled" => {
634                                snapshots_enabled = ::serde::de::MapAccess::next_value(&mut map)?;
635                            }
636                            _ => {}
637                        }
638                    }
639
640                    Ok(ApplicationSnapshotConfiguration {
641                        snapshots_enabled: snapshots_enabled.ok_or(::serde::de::Error::missing_field("SnapshotsEnabled"))?,
642                    })
643                }
644            }
645
646            d.deserialize_map(Visitor)
647        }
648    }
649
650    /// The [`AWS::KinesisAnalyticsV2::Application.CSVMappingParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-csvmappingparameters.html) property type.
651    #[derive(Debug, Default)]
652    pub struct CSVMappingParameters {
653        /// Property [`RecordColumnDelimiter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-csvmappingparameters.html#cfn-kinesisanalyticsv2-application-csvmappingparameters-recordcolumndelimiter).
654        ///
655        /// Update type: _Mutable_.
656        /// AWS CloudFormation doesn't replace the resource when you change this property.
657        pub record_column_delimiter: ::Value<String>,
658        /// Property [`RecordRowDelimiter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-csvmappingparameters.html#cfn-kinesisanalyticsv2-application-csvmappingparameters-recordrowdelimiter).
659        ///
660        /// Update type: _Mutable_.
661        /// AWS CloudFormation doesn't replace the resource when you change this property.
662        pub record_row_delimiter: ::Value<String>,
663    }
664
665    impl ::codec::SerializeValue for CSVMappingParameters {
666        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
667            let mut map = ::serde::Serializer::serialize_map(s, None)?;
668            ::serde::ser::SerializeMap::serialize_entry(&mut map, "RecordColumnDelimiter", &self.record_column_delimiter)?;
669            ::serde::ser::SerializeMap::serialize_entry(&mut map, "RecordRowDelimiter", &self.record_row_delimiter)?;
670            ::serde::ser::SerializeMap::end(map)
671        }
672    }
673
674    impl ::codec::DeserializeValue for CSVMappingParameters {
675        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<CSVMappingParameters, D::Error> {
676            struct Visitor;
677
678            impl<'de> ::serde::de::Visitor<'de> for Visitor {
679                type Value = CSVMappingParameters;
680
681                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
682                    write!(f, "a struct of type CSVMappingParameters")
683                }
684
685                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
686                    let mut record_column_delimiter: Option<::Value<String>> = None;
687                    let mut record_row_delimiter: Option<::Value<String>> = None;
688
689                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
690                        match __cfn_key.as_ref() {
691                            "RecordColumnDelimiter" => {
692                                record_column_delimiter = ::serde::de::MapAccess::next_value(&mut map)?;
693                            }
694                            "RecordRowDelimiter" => {
695                                record_row_delimiter = ::serde::de::MapAccess::next_value(&mut map)?;
696                            }
697                            _ => {}
698                        }
699                    }
700
701                    Ok(CSVMappingParameters {
702                        record_column_delimiter: record_column_delimiter.ok_or(::serde::de::Error::missing_field("RecordColumnDelimiter"))?,
703                        record_row_delimiter: record_row_delimiter.ok_or(::serde::de::Error::missing_field("RecordRowDelimiter"))?,
704                    })
705                }
706            }
707
708            d.deserialize_map(Visitor)
709        }
710    }
711
712    /// The [`AWS::KinesisAnalyticsV2::Application.CatalogConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-catalogconfiguration.html) property type.
713    #[derive(Debug, Default)]
714    pub struct CatalogConfiguration {
715        /// Property [`GlueDataCatalogConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-catalogconfiguration.html#cfn-kinesisanalyticsv2-application-catalogconfiguration-gluedatacatalogconfiguration).
716        ///
717        /// Update type: _Mutable_.
718        /// AWS CloudFormation doesn't replace the resource when you change this property.
719        pub glue_data_catalog_configuration: Option<::Value<GlueDataCatalogConfiguration>>,
720    }
721
722    impl ::codec::SerializeValue for CatalogConfiguration {
723        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
724            let mut map = ::serde::Serializer::serialize_map(s, None)?;
725            if let Some(ref glue_data_catalog_configuration) = self.glue_data_catalog_configuration {
726                ::serde::ser::SerializeMap::serialize_entry(&mut map, "GlueDataCatalogConfiguration", glue_data_catalog_configuration)?;
727            }
728            ::serde::ser::SerializeMap::end(map)
729        }
730    }
731
732    impl ::codec::DeserializeValue for CatalogConfiguration {
733        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<CatalogConfiguration, D::Error> {
734            struct Visitor;
735
736            impl<'de> ::serde::de::Visitor<'de> for Visitor {
737                type Value = CatalogConfiguration;
738
739                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
740                    write!(f, "a struct of type CatalogConfiguration")
741                }
742
743                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
744                    let mut glue_data_catalog_configuration: Option<::Value<GlueDataCatalogConfiguration>> = None;
745
746                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
747                        match __cfn_key.as_ref() {
748                            "GlueDataCatalogConfiguration" => {
749                                glue_data_catalog_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
750                            }
751                            _ => {}
752                        }
753                    }
754
755                    Ok(CatalogConfiguration {
756                        glue_data_catalog_configuration: glue_data_catalog_configuration,
757                    })
758                }
759            }
760
761            d.deserialize_map(Visitor)
762        }
763    }
764
765    /// The [`AWS::KinesisAnalyticsV2::Application.CheckpointConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-checkpointconfiguration.html) property type.
766    #[derive(Debug, Default)]
767    pub struct CheckpointConfiguration {
768        /// Property [`CheckpointInterval`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-checkpointconfiguration.html#cfn-kinesisanalyticsv2-application-checkpointconfiguration-checkpointinterval).
769        ///
770        /// Update type: _Mutable_.
771        /// AWS CloudFormation doesn't replace the resource when you change this property.
772        pub checkpoint_interval: Option<::Value<u32>>,
773        /// Property [`CheckpointingEnabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-checkpointconfiguration.html#cfn-kinesisanalyticsv2-application-checkpointconfiguration-checkpointingenabled).
774        ///
775        /// Update type: _Mutable_.
776        /// AWS CloudFormation doesn't replace the resource when you change this property.
777        pub checkpointing_enabled: Option<::Value<bool>>,
778        /// Property [`ConfigurationType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-checkpointconfiguration.html#cfn-kinesisanalyticsv2-application-checkpointconfiguration-configurationtype).
779        ///
780        /// Update type: _Mutable_.
781        /// AWS CloudFormation doesn't replace the resource when you change this property.
782        pub configuration_type: ::Value<String>,
783        /// Property [`MinPauseBetweenCheckpoints`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-checkpointconfiguration.html#cfn-kinesisanalyticsv2-application-checkpointconfiguration-minpausebetweencheckpoints).
784        ///
785        /// Update type: _Mutable_.
786        /// AWS CloudFormation doesn't replace the resource when you change this property.
787        pub min_pause_between_checkpoints: Option<::Value<u32>>,
788    }
789
790    impl ::codec::SerializeValue for CheckpointConfiguration {
791        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
792            let mut map = ::serde::Serializer::serialize_map(s, None)?;
793            if let Some(ref checkpoint_interval) = self.checkpoint_interval {
794                ::serde::ser::SerializeMap::serialize_entry(&mut map, "CheckpointInterval", checkpoint_interval)?;
795            }
796            if let Some(ref checkpointing_enabled) = self.checkpointing_enabled {
797                ::serde::ser::SerializeMap::serialize_entry(&mut map, "CheckpointingEnabled", checkpointing_enabled)?;
798            }
799            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConfigurationType", &self.configuration_type)?;
800            if let Some(ref min_pause_between_checkpoints) = self.min_pause_between_checkpoints {
801                ::serde::ser::SerializeMap::serialize_entry(&mut map, "MinPauseBetweenCheckpoints", min_pause_between_checkpoints)?;
802            }
803            ::serde::ser::SerializeMap::end(map)
804        }
805    }
806
807    impl ::codec::DeserializeValue for CheckpointConfiguration {
808        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<CheckpointConfiguration, D::Error> {
809            struct Visitor;
810
811            impl<'de> ::serde::de::Visitor<'de> for Visitor {
812                type Value = CheckpointConfiguration;
813
814                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
815                    write!(f, "a struct of type CheckpointConfiguration")
816                }
817
818                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
819                    let mut checkpoint_interval: Option<::Value<u32>> = None;
820                    let mut checkpointing_enabled: Option<::Value<bool>> = None;
821                    let mut configuration_type: Option<::Value<String>> = None;
822                    let mut min_pause_between_checkpoints: Option<::Value<u32>> = None;
823
824                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
825                        match __cfn_key.as_ref() {
826                            "CheckpointInterval" => {
827                                checkpoint_interval = ::serde::de::MapAccess::next_value(&mut map)?;
828                            }
829                            "CheckpointingEnabled" => {
830                                checkpointing_enabled = ::serde::de::MapAccess::next_value(&mut map)?;
831                            }
832                            "ConfigurationType" => {
833                                configuration_type = ::serde::de::MapAccess::next_value(&mut map)?;
834                            }
835                            "MinPauseBetweenCheckpoints" => {
836                                min_pause_between_checkpoints = ::serde::de::MapAccess::next_value(&mut map)?;
837                            }
838                            _ => {}
839                        }
840                    }
841
842                    Ok(CheckpointConfiguration {
843                        checkpoint_interval: checkpoint_interval,
844                        checkpointing_enabled: checkpointing_enabled,
845                        configuration_type: configuration_type.ok_or(::serde::de::Error::missing_field("ConfigurationType"))?,
846                        min_pause_between_checkpoints: min_pause_between_checkpoints,
847                    })
848                }
849            }
850
851            d.deserialize_map(Visitor)
852        }
853    }
854
855    /// The [`AWS::KinesisAnalyticsV2::Application.CodeContent`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-codecontent.html) property type.
856    #[derive(Debug, Default)]
857    pub struct CodeContent {
858        /// Property [`S3ContentLocation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-codecontent.html#cfn-kinesisanalyticsv2-application-codecontent-s3contentlocation).
859        ///
860        /// Update type: _Mutable_.
861        /// AWS CloudFormation doesn't replace the resource when you change this property.
862        pub s3_content_location: Option<::Value<S3ContentLocation>>,
863        /// Property [`TextContent`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-codecontent.html#cfn-kinesisanalyticsv2-application-codecontent-textcontent).
864        ///
865        /// Update type: _Mutable_.
866        /// AWS CloudFormation doesn't replace the resource when you change this property.
867        pub text_content: Option<::Value<String>>,
868        /// Property [`ZipFileContent`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-codecontent.html#cfn-kinesisanalyticsv2-application-codecontent-zipfilecontent).
869        ///
870        /// Update type: _Mutable_.
871        /// AWS CloudFormation doesn't replace the resource when you change this property.
872        pub zip_file_content: Option<::Value<String>>,
873    }
874
875    impl ::codec::SerializeValue for CodeContent {
876        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
877            let mut map = ::serde::Serializer::serialize_map(s, None)?;
878            if let Some(ref s3_content_location) = self.s3_content_location {
879                ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3ContentLocation", s3_content_location)?;
880            }
881            if let Some(ref text_content) = self.text_content {
882                ::serde::ser::SerializeMap::serialize_entry(&mut map, "TextContent", text_content)?;
883            }
884            if let Some(ref zip_file_content) = self.zip_file_content {
885                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ZipFileContent", zip_file_content)?;
886            }
887            ::serde::ser::SerializeMap::end(map)
888        }
889    }
890
891    impl ::codec::DeserializeValue for CodeContent {
892        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<CodeContent, D::Error> {
893            struct Visitor;
894
895            impl<'de> ::serde::de::Visitor<'de> for Visitor {
896                type Value = CodeContent;
897
898                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
899                    write!(f, "a struct of type CodeContent")
900                }
901
902                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
903                    let mut s3_content_location: Option<::Value<S3ContentLocation>> = None;
904                    let mut text_content: Option<::Value<String>> = None;
905                    let mut zip_file_content: Option<::Value<String>> = None;
906
907                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
908                        match __cfn_key.as_ref() {
909                            "S3ContentLocation" => {
910                                s3_content_location = ::serde::de::MapAccess::next_value(&mut map)?;
911                            }
912                            "TextContent" => {
913                                text_content = ::serde::de::MapAccess::next_value(&mut map)?;
914                            }
915                            "ZipFileContent" => {
916                                zip_file_content = ::serde::de::MapAccess::next_value(&mut map)?;
917                            }
918                            _ => {}
919                        }
920                    }
921
922                    Ok(CodeContent {
923                        s3_content_location: s3_content_location,
924                        text_content: text_content,
925                        zip_file_content: zip_file_content,
926                    })
927                }
928            }
929
930            d.deserialize_map(Visitor)
931        }
932    }
933
934    /// The [`AWS::KinesisAnalyticsV2::Application.CustomArtifactConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-customartifactconfiguration.html) property type.
935    #[derive(Debug, Default)]
936    pub struct CustomArtifactConfiguration {
937        /// Property [`ArtifactType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-customartifactconfiguration.html#cfn-kinesisanalyticsv2-application-customartifactconfiguration-artifacttype).
938        ///
939        /// Update type: _Mutable_.
940        /// AWS CloudFormation doesn't replace the resource when you change this property.
941        pub artifact_type: ::Value<String>,
942        /// Property [`MavenReference`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-customartifactconfiguration.html#cfn-kinesisanalyticsv2-application-customartifactconfiguration-mavenreference).
943        ///
944        /// Update type: _Mutable_.
945        /// AWS CloudFormation doesn't replace the resource when you change this property.
946        pub maven_reference: Option<::Value<MavenReference>>,
947        /// Property [`S3ContentLocation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-customartifactconfiguration.html#cfn-kinesisanalyticsv2-application-customartifactconfiguration-s3contentlocation).
948        ///
949        /// Update type: _Mutable_.
950        /// AWS CloudFormation doesn't replace the resource when you change this property.
951        pub s3_content_location: Option<::Value<S3ContentLocation>>,
952    }
953
954    impl ::codec::SerializeValue for CustomArtifactConfiguration {
955        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
956            let mut map = ::serde::Serializer::serialize_map(s, None)?;
957            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ArtifactType", &self.artifact_type)?;
958            if let Some(ref maven_reference) = self.maven_reference {
959                ::serde::ser::SerializeMap::serialize_entry(&mut map, "MavenReference", maven_reference)?;
960            }
961            if let Some(ref s3_content_location) = self.s3_content_location {
962                ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3ContentLocation", s3_content_location)?;
963            }
964            ::serde::ser::SerializeMap::end(map)
965        }
966    }
967
968    impl ::codec::DeserializeValue for CustomArtifactConfiguration {
969        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<CustomArtifactConfiguration, D::Error> {
970            struct Visitor;
971
972            impl<'de> ::serde::de::Visitor<'de> for Visitor {
973                type Value = CustomArtifactConfiguration;
974
975                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
976                    write!(f, "a struct of type CustomArtifactConfiguration")
977                }
978
979                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
980                    let mut artifact_type: Option<::Value<String>> = None;
981                    let mut maven_reference: Option<::Value<MavenReference>> = None;
982                    let mut s3_content_location: Option<::Value<S3ContentLocation>> = None;
983
984                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
985                        match __cfn_key.as_ref() {
986                            "ArtifactType" => {
987                                artifact_type = ::serde::de::MapAccess::next_value(&mut map)?;
988                            }
989                            "MavenReference" => {
990                                maven_reference = ::serde::de::MapAccess::next_value(&mut map)?;
991                            }
992                            "S3ContentLocation" => {
993                                s3_content_location = ::serde::de::MapAccess::next_value(&mut map)?;
994                            }
995                            _ => {}
996                        }
997                    }
998
999                    Ok(CustomArtifactConfiguration {
1000                        artifact_type: artifact_type.ok_or(::serde::de::Error::missing_field("ArtifactType"))?,
1001                        maven_reference: maven_reference,
1002                        s3_content_location: s3_content_location,
1003                    })
1004                }
1005            }
1006
1007            d.deserialize_map(Visitor)
1008        }
1009    }
1010
1011    /// The [`AWS::KinesisAnalyticsV2::Application.CustomArtifactsConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-customartifactsconfiguration.html) property type.
1012    #[derive(Debug, Default)]
1013    pub struct CustomArtifactsConfiguration {
1014    }
1015
1016    impl ::codec::SerializeValue for CustomArtifactsConfiguration {
1017        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1018            let map = ::serde::Serializer::serialize_map(s, None)?;
1019            ::serde::ser::SerializeMap::end(map)
1020        }
1021    }
1022
1023    impl ::codec::DeserializeValue for CustomArtifactsConfiguration {
1024        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<CustomArtifactsConfiguration, D::Error> {
1025            struct Visitor;
1026
1027            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1028                type Value = CustomArtifactsConfiguration;
1029
1030                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1031                    write!(f, "a struct of type CustomArtifactsConfiguration")
1032                }
1033
1034                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, _map: A) -> Result<Self::Value, A::Error> {
1035                    Ok(CustomArtifactsConfiguration {})
1036                }
1037            }
1038
1039            d.deserialize_map(Visitor)
1040        }
1041    }
1042
1043    /// The [`AWS::KinesisAnalyticsV2::Application.DeployAsApplicationConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-deployasapplicationconfiguration.html) property type.
1044    #[derive(Debug, Default)]
1045    pub struct DeployAsApplicationConfiguration {
1046        /// Property [`S3ContentLocation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-deployasapplicationconfiguration.html#cfn-kinesisanalyticsv2-application-deployasapplicationconfiguration-s3contentlocation).
1047        ///
1048        /// Update type: _Mutable_.
1049        /// AWS CloudFormation doesn't replace the resource when you change this property.
1050        pub s3_content_location: ::Value<S3ContentBaseLocation>,
1051    }
1052
1053    impl ::codec::SerializeValue for DeployAsApplicationConfiguration {
1054        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1055            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1056            ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3ContentLocation", &self.s3_content_location)?;
1057            ::serde::ser::SerializeMap::end(map)
1058        }
1059    }
1060
1061    impl ::codec::DeserializeValue for DeployAsApplicationConfiguration {
1062        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<DeployAsApplicationConfiguration, D::Error> {
1063            struct Visitor;
1064
1065            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1066                type Value = DeployAsApplicationConfiguration;
1067
1068                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1069                    write!(f, "a struct of type DeployAsApplicationConfiguration")
1070                }
1071
1072                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1073                    let mut s3_content_location: Option<::Value<S3ContentBaseLocation>> = None;
1074
1075                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1076                        match __cfn_key.as_ref() {
1077                            "S3ContentLocation" => {
1078                                s3_content_location = ::serde::de::MapAccess::next_value(&mut map)?;
1079                            }
1080                            _ => {}
1081                        }
1082                    }
1083
1084                    Ok(DeployAsApplicationConfiguration {
1085                        s3_content_location: s3_content_location.ok_or(::serde::de::Error::missing_field("S3ContentLocation"))?,
1086                    })
1087                }
1088            }
1089
1090            d.deserialize_map(Visitor)
1091        }
1092    }
1093
1094    /// The [`AWS::KinesisAnalyticsV2::Application.EnvironmentProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-environmentproperties.html) property type.
1095    #[derive(Debug, Default)]
1096    pub struct EnvironmentProperties {
1097        /// Property [`PropertyGroups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-environmentproperties.html#cfn-kinesisanalyticsv2-application-environmentproperties-propertygroups).
1098        ///
1099        /// Update type: _Mutable_.
1100        /// AWS CloudFormation doesn't replace the resource when you change this property.
1101        pub property_groups: Option<::ValueList<PropertyGroup>>,
1102    }
1103
1104    impl ::codec::SerializeValue for EnvironmentProperties {
1105        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1106            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1107            if let Some(ref property_groups) = self.property_groups {
1108                ::serde::ser::SerializeMap::serialize_entry(&mut map, "PropertyGroups", property_groups)?;
1109            }
1110            ::serde::ser::SerializeMap::end(map)
1111        }
1112    }
1113
1114    impl ::codec::DeserializeValue for EnvironmentProperties {
1115        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<EnvironmentProperties, D::Error> {
1116            struct Visitor;
1117
1118            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1119                type Value = EnvironmentProperties;
1120
1121                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1122                    write!(f, "a struct of type EnvironmentProperties")
1123                }
1124
1125                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1126                    let mut property_groups: Option<::ValueList<PropertyGroup>> = None;
1127
1128                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1129                        match __cfn_key.as_ref() {
1130                            "PropertyGroups" => {
1131                                property_groups = ::serde::de::MapAccess::next_value(&mut map)?;
1132                            }
1133                            _ => {}
1134                        }
1135                    }
1136
1137                    Ok(EnvironmentProperties {
1138                        property_groups: property_groups,
1139                    })
1140                }
1141            }
1142
1143            d.deserialize_map(Visitor)
1144        }
1145    }
1146
1147    /// The [`AWS::KinesisAnalyticsV2::Application.FlinkApplicationConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-flinkapplicationconfiguration.html) property type.
1148    #[derive(Debug, Default)]
1149    pub struct FlinkApplicationConfiguration {
1150        /// Property [`CheckpointConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-flinkapplicationconfiguration.html#cfn-kinesisanalyticsv2-application-flinkapplicationconfiguration-checkpointconfiguration).
1151        ///
1152        /// Update type: _Mutable_.
1153        /// AWS CloudFormation doesn't replace the resource when you change this property.
1154        pub checkpoint_configuration: Option<::Value<CheckpointConfiguration>>,
1155        /// Property [`MonitoringConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-flinkapplicationconfiguration.html#cfn-kinesisanalyticsv2-application-flinkapplicationconfiguration-monitoringconfiguration).
1156        ///
1157        /// Update type: _Mutable_.
1158        /// AWS CloudFormation doesn't replace the resource when you change this property.
1159        pub monitoring_configuration: Option<::Value<MonitoringConfiguration>>,
1160        /// Property [`ParallelismConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-flinkapplicationconfiguration.html#cfn-kinesisanalyticsv2-application-flinkapplicationconfiguration-parallelismconfiguration).
1161        ///
1162        /// Update type: _Mutable_.
1163        /// AWS CloudFormation doesn't replace the resource when you change this property.
1164        pub parallelism_configuration: Option<::Value<ParallelismConfiguration>>,
1165    }
1166
1167    impl ::codec::SerializeValue for FlinkApplicationConfiguration {
1168        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1169            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1170            if let Some(ref checkpoint_configuration) = self.checkpoint_configuration {
1171                ::serde::ser::SerializeMap::serialize_entry(&mut map, "CheckpointConfiguration", checkpoint_configuration)?;
1172            }
1173            if let Some(ref monitoring_configuration) = self.monitoring_configuration {
1174                ::serde::ser::SerializeMap::serialize_entry(&mut map, "MonitoringConfiguration", monitoring_configuration)?;
1175            }
1176            if let Some(ref parallelism_configuration) = self.parallelism_configuration {
1177                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ParallelismConfiguration", parallelism_configuration)?;
1178            }
1179            ::serde::ser::SerializeMap::end(map)
1180        }
1181    }
1182
1183    impl ::codec::DeserializeValue for FlinkApplicationConfiguration {
1184        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<FlinkApplicationConfiguration, D::Error> {
1185            struct Visitor;
1186
1187            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1188                type Value = FlinkApplicationConfiguration;
1189
1190                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1191                    write!(f, "a struct of type FlinkApplicationConfiguration")
1192                }
1193
1194                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1195                    let mut checkpoint_configuration: Option<::Value<CheckpointConfiguration>> = None;
1196                    let mut monitoring_configuration: Option<::Value<MonitoringConfiguration>> = None;
1197                    let mut parallelism_configuration: Option<::Value<ParallelismConfiguration>> = None;
1198
1199                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1200                        match __cfn_key.as_ref() {
1201                            "CheckpointConfiguration" => {
1202                                checkpoint_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
1203                            }
1204                            "MonitoringConfiguration" => {
1205                                monitoring_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
1206                            }
1207                            "ParallelismConfiguration" => {
1208                                parallelism_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
1209                            }
1210                            _ => {}
1211                        }
1212                    }
1213
1214                    Ok(FlinkApplicationConfiguration {
1215                        checkpoint_configuration: checkpoint_configuration,
1216                        monitoring_configuration: monitoring_configuration,
1217                        parallelism_configuration: parallelism_configuration,
1218                    })
1219                }
1220            }
1221
1222            d.deserialize_map(Visitor)
1223        }
1224    }
1225
1226    /// The [`AWS::KinesisAnalyticsV2::Application.GlueDataCatalogConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-gluedatacatalogconfiguration.html) property type.
1227    #[derive(Debug, Default)]
1228    pub struct GlueDataCatalogConfiguration {
1229        /// Property [`DatabaseARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-gluedatacatalogconfiguration.html#cfn-kinesisanalyticsv2-application-gluedatacatalogconfiguration-databasearn).
1230        ///
1231        /// Update type: _Mutable_.
1232        /// AWS CloudFormation doesn't replace the resource when you change this property.
1233        pub database_arn: Option<::Value<String>>,
1234    }
1235
1236    impl ::codec::SerializeValue for GlueDataCatalogConfiguration {
1237        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1238            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1239            if let Some(ref database_arn) = self.database_arn {
1240                ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatabaseARN", database_arn)?;
1241            }
1242            ::serde::ser::SerializeMap::end(map)
1243        }
1244    }
1245
1246    impl ::codec::DeserializeValue for GlueDataCatalogConfiguration {
1247        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<GlueDataCatalogConfiguration, D::Error> {
1248            struct Visitor;
1249
1250            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1251                type Value = GlueDataCatalogConfiguration;
1252
1253                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1254                    write!(f, "a struct of type GlueDataCatalogConfiguration")
1255                }
1256
1257                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1258                    let mut database_arn: Option<::Value<String>> = None;
1259
1260                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1261                        match __cfn_key.as_ref() {
1262                            "DatabaseARN" => {
1263                                database_arn = ::serde::de::MapAccess::next_value(&mut map)?;
1264                            }
1265                            _ => {}
1266                        }
1267                    }
1268
1269                    Ok(GlueDataCatalogConfiguration {
1270                        database_arn: database_arn,
1271                    })
1272                }
1273            }
1274
1275            d.deserialize_map(Visitor)
1276        }
1277    }
1278
1279    /// The [`AWS::KinesisAnalyticsV2::Application.Input`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-input.html) property type.
1280    #[derive(Debug, Default)]
1281    pub struct Input {
1282        /// Property [`InputParallelism`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-input.html#cfn-kinesisanalyticsv2-application-input-inputparallelism).
1283        ///
1284        /// Update type: _Mutable_.
1285        /// AWS CloudFormation doesn't replace the resource when you change this property.
1286        pub input_parallelism: Option<::Value<InputParallelism>>,
1287        /// Property [`InputProcessingConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-input.html#cfn-kinesisanalyticsv2-application-input-inputprocessingconfiguration).
1288        ///
1289        /// Update type: _Mutable_.
1290        /// AWS CloudFormation doesn't replace the resource when you change this property.
1291        pub input_processing_configuration: Option<::Value<InputProcessingConfiguration>>,
1292        /// Property [`InputSchema`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-input.html#cfn-kinesisanalyticsv2-application-input-inputschema).
1293        ///
1294        /// Update type: _Mutable_.
1295        /// AWS CloudFormation doesn't replace the resource when you change this property.
1296        pub input_schema: ::Value<InputSchema>,
1297        /// Property [`KinesisFirehoseInput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-input.html#cfn-kinesisanalyticsv2-application-input-kinesisfirehoseinput).
1298        ///
1299        /// Update type: _Mutable_.
1300        /// AWS CloudFormation doesn't replace the resource when you change this property.
1301        pub kinesis_firehose_input: Option<::Value<KinesisFirehoseInput>>,
1302        /// Property [`KinesisStreamsInput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-input.html#cfn-kinesisanalyticsv2-application-input-kinesisstreamsinput).
1303        ///
1304        /// Update type: _Mutable_.
1305        /// AWS CloudFormation doesn't replace the resource when you change this property.
1306        pub kinesis_streams_input: Option<::Value<KinesisStreamsInput>>,
1307        /// Property [`NamePrefix`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-input.html#cfn-kinesisanalyticsv2-application-input-nameprefix).
1308        ///
1309        /// Update type: _Mutable_.
1310        /// AWS CloudFormation doesn't replace the resource when you change this property.
1311        pub name_prefix: ::Value<String>,
1312    }
1313
1314    impl ::codec::SerializeValue for Input {
1315        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1316            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1317            if let Some(ref input_parallelism) = self.input_parallelism {
1318                ::serde::ser::SerializeMap::serialize_entry(&mut map, "InputParallelism", input_parallelism)?;
1319            }
1320            if let Some(ref input_processing_configuration) = self.input_processing_configuration {
1321                ::serde::ser::SerializeMap::serialize_entry(&mut map, "InputProcessingConfiguration", input_processing_configuration)?;
1322            }
1323            ::serde::ser::SerializeMap::serialize_entry(&mut map, "InputSchema", &self.input_schema)?;
1324            if let Some(ref kinesis_firehose_input) = self.kinesis_firehose_input {
1325                ::serde::ser::SerializeMap::serialize_entry(&mut map, "KinesisFirehoseInput", kinesis_firehose_input)?;
1326            }
1327            if let Some(ref kinesis_streams_input) = self.kinesis_streams_input {
1328                ::serde::ser::SerializeMap::serialize_entry(&mut map, "KinesisStreamsInput", kinesis_streams_input)?;
1329            }
1330            ::serde::ser::SerializeMap::serialize_entry(&mut map, "NamePrefix", &self.name_prefix)?;
1331            ::serde::ser::SerializeMap::end(map)
1332        }
1333    }
1334
1335    impl ::codec::DeserializeValue for Input {
1336        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<Input, D::Error> {
1337            struct Visitor;
1338
1339            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1340                type Value = Input;
1341
1342                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1343                    write!(f, "a struct of type Input")
1344                }
1345
1346                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1347                    let mut input_parallelism: Option<::Value<InputParallelism>> = None;
1348                    let mut input_processing_configuration: Option<::Value<InputProcessingConfiguration>> = None;
1349                    let mut input_schema: Option<::Value<InputSchema>> = None;
1350                    let mut kinesis_firehose_input: Option<::Value<KinesisFirehoseInput>> = None;
1351                    let mut kinesis_streams_input: Option<::Value<KinesisStreamsInput>> = None;
1352                    let mut name_prefix: Option<::Value<String>> = None;
1353
1354                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1355                        match __cfn_key.as_ref() {
1356                            "InputParallelism" => {
1357                                input_parallelism = ::serde::de::MapAccess::next_value(&mut map)?;
1358                            }
1359                            "InputProcessingConfiguration" => {
1360                                input_processing_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
1361                            }
1362                            "InputSchema" => {
1363                                input_schema = ::serde::de::MapAccess::next_value(&mut map)?;
1364                            }
1365                            "KinesisFirehoseInput" => {
1366                                kinesis_firehose_input = ::serde::de::MapAccess::next_value(&mut map)?;
1367                            }
1368                            "KinesisStreamsInput" => {
1369                                kinesis_streams_input = ::serde::de::MapAccess::next_value(&mut map)?;
1370                            }
1371                            "NamePrefix" => {
1372                                name_prefix = ::serde::de::MapAccess::next_value(&mut map)?;
1373                            }
1374                            _ => {}
1375                        }
1376                    }
1377
1378                    Ok(Input {
1379                        input_parallelism: input_parallelism,
1380                        input_processing_configuration: input_processing_configuration,
1381                        input_schema: input_schema.ok_or(::serde::de::Error::missing_field("InputSchema"))?,
1382                        kinesis_firehose_input: kinesis_firehose_input,
1383                        kinesis_streams_input: kinesis_streams_input,
1384                        name_prefix: name_prefix.ok_or(::serde::de::Error::missing_field("NamePrefix"))?,
1385                    })
1386                }
1387            }
1388
1389            d.deserialize_map(Visitor)
1390        }
1391    }
1392
1393    /// The [`AWS::KinesisAnalyticsV2::Application.InputLambdaProcessor`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-inputlambdaprocessor.html) property type.
1394    #[derive(Debug, Default)]
1395    pub struct InputLambdaProcessor {
1396        /// Property [`ResourceARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-inputlambdaprocessor.html#cfn-kinesisanalyticsv2-application-inputlambdaprocessor-resourcearn).
1397        ///
1398        /// Update type: _Mutable_.
1399        /// AWS CloudFormation doesn't replace the resource when you change this property.
1400        pub resource_arn: ::Value<String>,
1401    }
1402
1403    impl ::codec::SerializeValue for InputLambdaProcessor {
1404        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1405            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1406            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceARN", &self.resource_arn)?;
1407            ::serde::ser::SerializeMap::end(map)
1408        }
1409    }
1410
1411    impl ::codec::DeserializeValue for InputLambdaProcessor {
1412        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<InputLambdaProcessor, D::Error> {
1413            struct Visitor;
1414
1415            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1416                type Value = InputLambdaProcessor;
1417
1418                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1419                    write!(f, "a struct of type InputLambdaProcessor")
1420                }
1421
1422                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1423                    let mut resource_arn: Option<::Value<String>> = None;
1424
1425                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1426                        match __cfn_key.as_ref() {
1427                            "ResourceARN" => {
1428                                resource_arn = ::serde::de::MapAccess::next_value(&mut map)?;
1429                            }
1430                            _ => {}
1431                        }
1432                    }
1433
1434                    Ok(InputLambdaProcessor {
1435                        resource_arn: resource_arn.ok_or(::serde::de::Error::missing_field("ResourceARN"))?,
1436                    })
1437                }
1438            }
1439
1440            d.deserialize_map(Visitor)
1441        }
1442    }
1443
1444    /// The [`AWS::KinesisAnalyticsV2::Application.InputParallelism`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-inputparallelism.html) property type.
1445    #[derive(Debug, Default)]
1446    pub struct InputParallelism {
1447        /// Property [`Count`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-inputparallelism.html#cfn-kinesisanalyticsv2-application-inputparallelism-count).
1448        ///
1449        /// Update type: _Mutable_.
1450        /// AWS CloudFormation doesn't replace the resource when you change this property.
1451        pub count: Option<::Value<u32>>,
1452    }
1453
1454    impl ::codec::SerializeValue for InputParallelism {
1455        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1456            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1457            if let Some(ref count) = self.count {
1458                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Count", count)?;
1459            }
1460            ::serde::ser::SerializeMap::end(map)
1461        }
1462    }
1463
1464    impl ::codec::DeserializeValue for InputParallelism {
1465        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<InputParallelism, D::Error> {
1466            struct Visitor;
1467
1468            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1469                type Value = InputParallelism;
1470
1471                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1472                    write!(f, "a struct of type InputParallelism")
1473                }
1474
1475                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1476                    let mut count: Option<::Value<u32>> = None;
1477
1478                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1479                        match __cfn_key.as_ref() {
1480                            "Count" => {
1481                                count = ::serde::de::MapAccess::next_value(&mut map)?;
1482                            }
1483                            _ => {}
1484                        }
1485                    }
1486
1487                    Ok(InputParallelism {
1488                        count: count,
1489                    })
1490                }
1491            }
1492
1493            d.deserialize_map(Visitor)
1494        }
1495    }
1496
1497    /// The [`AWS::KinesisAnalyticsV2::Application.InputProcessingConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-inputprocessingconfiguration.html) property type.
1498    #[derive(Debug, Default)]
1499    pub struct InputProcessingConfiguration {
1500        /// Property [`InputLambdaProcessor`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-inputprocessingconfiguration.html#cfn-kinesisanalyticsv2-application-inputprocessingconfiguration-inputlambdaprocessor).
1501        ///
1502        /// Update type: _Mutable_.
1503        /// AWS CloudFormation doesn't replace the resource when you change this property.
1504        pub input_lambda_processor: Option<::Value<InputLambdaProcessor>>,
1505    }
1506
1507    impl ::codec::SerializeValue for InputProcessingConfiguration {
1508        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1509            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1510            if let Some(ref input_lambda_processor) = self.input_lambda_processor {
1511                ::serde::ser::SerializeMap::serialize_entry(&mut map, "InputLambdaProcessor", input_lambda_processor)?;
1512            }
1513            ::serde::ser::SerializeMap::end(map)
1514        }
1515    }
1516
1517    impl ::codec::DeserializeValue for InputProcessingConfiguration {
1518        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<InputProcessingConfiguration, D::Error> {
1519            struct Visitor;
1520
1521            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1522                type Value = InputProcessingConfiguration;
1523
1524                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1525                    write!(f, "a struct of type InputProcessingConfiguration")
1526                }
1527
1528                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1529                    let mut input_lambda_processor: Option<::Value<InputLambdaProcessor>> = None;
1530
1531                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1532                        match __cfn_key.as_ref() {
1533                            "InputLambdaProcessor" => {
1534                                input_lambda_processor = ::serde::de::MapAccess::next_value(&mut map)?;
1535                            }
1536                            _ => {}
1537                        }
1538                    }
1539
1540                    Ok(InputProcessingConfiguration {
1541                        input_lambda_processor: input_lambda_processor,
1542                    })
1543                }
1544            }
1545
1546            d.deserialize_map(Visitor)
1547        }
1548    }
1549
1550    /// The [`AWS::KinesisAnalyticsV2::Application.InputSchema`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-inputschema.html) property type.
1551    #[derive(Debug, Default)]
1552    pub struct InputSchema {
1553        /// Property [`RecordColumns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-inputschema.html#cfn-kinesisanalyticsv2-application-inputschema-recordcolumns).
1554        ///
1555        /// Update type: _Mutable_.
1556        /// AWS CloudFormation doesn't replace the resource when you change this property.
1557        pub record_columns: ::ValueList<RecordColumn>,
1558        /// Property [`RecordEncoding`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-inputschema.html#cfn-kinesisanalyticsv2-application-inputschema-recordencoding).
1559        ///
1560        /// Update type: _Mutable_.
1561        /// AWS CloudFormation doesn't replace the resource when you change this property.
1562        pub record_encoding: Option<::Value<String>>,
1563        /// Property [`RecordFormat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-inputschema.html#cfn-kinesisanalyticsv2-application-inputschema-recordformat).
1564        ///
1565        /// Update type: _Mutable_.
1566        /// AWS CloudFormation doesn't replace the resource when you change this property.
1567        pub record_format: ::Value<RecordFormat>,
1568    }
1569
1570    impl ::codec::SerializeValue for InputSchema {
1571        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1572            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1573            ::serde::ser::SerializeMap::serialize_entry(&mut map, "RecordColumns", &self.record_columns)?;
1574            if let Some(ref record_encoding) = self.record_encoding {
1575                ::serde::ser::SerializeMap::serialize_entry(&mut map, "RecordEncoding", record_encoding)?;
1576            }
1577            ::serde::ser::SerializeMap::serialize_entry(&mut map, "RecordFormat", &self.record_format)?;
1578            ::serde::ser::SerializeMap::end(map)
1579        }
1580    }
1581
1582    impl ::codec::DeserializeValue for InputSchema {
1583        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<InputSchema, D::Error> {
1584            struct Visitor;
1585
1586            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1587                type Value = InputSchema;
1588
1589                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1590                    write!(f, "a struct of type InputSchema")
1591                }
1592
1593                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1594                    let mut record_columns: Option<::ValueList<RecordColumn>> = None;
1595                    let mut record_encoding: Option<::Value<String>> = None;
1596                    let mut record_format: Option<::Value<RecordFormat>> = None;
1597
1598                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1599                        match __cfn_key.as_ref() {
1600                            "RecordColumns" => {
1601                                record_columns = ::serde::de::MapAccess::next_value(&mut map)?;
1602                            }
1603                            "RecordEncoding" => {
1604                                record_encoding = ::serde::de::MapAccess::next_value(&mut map)?;
1605                            }
1606                            "RecordFormat" => {
1607                                record_format = ::serde::de::MapAccess::next_value(&mut map)?;
1608                            }
1609                            _ => {}
1610                        }
1611                    }
1612
1613                    Ok(InputSchema {
1614                        record_columns: record_columns.ok_or(::serde::de::Error::missing_field("RecordColumns"))?,
1615                        record_encoding: record_encoding,
1616                        record_format: record_format.ok_or(::serde::de::Error::missing_field("RecordFormat"))?,
1617                    })
1618                }
1619            }
1620
1621            d.deserialize_map(Visitor)
1622        }
1623    }
1624
1625    /// The [`AWS::KinesisAnalyticsV2::Application.JSONMappingParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-jsonmappingparameters.html) property type.
1626    #[derive(Debug, Default)]
1627    pub struct JSONMappingParameters {
1628        /// Property [`RecordRowPath`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-jsonmappingparameters.html#cfn-kinesisanalyticsv2-application-jsonmappingparameters-recordrowpath).
1629        ///
1630        /// Update type: _Mutable_.
1631        /// AWS CloudFormation doesn't replace the resource when you change this property.
1632        pub record_row_path: ::Value<String>,
1633    }
1634
1635    impl ::codec::SerializeValue for JSONMappingParameters {
1636        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1637            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1638            ::serde::ser::SerializeMap::serialize_entry(&mut map, "RecordRowPath", &self.record_row_path)?;
1639            ::serde::ser::SerializeMap::end(map)
1640        }
1641    }
1642
1643    impl ::codec::DeserializeValue for JSONMappingParameters {
1644        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<JSONMappingParameters, D::Error> {
1645            struct Visitor;
1646
1647            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1648                type Value = JSONMappingParameters;
1649
1650                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1651                    write!(f, "a struct of type JSONMappingParameters")
1652                }
1653
1654                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1655                    let mut record_row_path: Option<::Value<String>> = None;
1656
1657                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1658                        match __cfn_key.as_ref() {
1659                            "RecordRowPath" => {
1660                                record_row_path = ::serde::de::MapAccess::next_value(&mut map)?;
1661                            }
1662                            _ => {}
1663                        }
1664                    }
1665
1666                    Ok(JSONMappingParameters {
1667                        record_row_path: record_row_path.ok_or(::serde::de::Error::missing_field("RecordRowPath"))?,
1668                    })
1669                }
1670            }
1671
1672            d.deserialize_map(Visitor)
1673        }
1674    }
1675
1676    /// The [`AWS::KinesisAnalyticsV2::Application.KinesisFirehoseInput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-kinesisfirehoseinput.html) property type.
1677    #[derive(Debug, Default)]
1678    pub struct KinesisFirehoseInput {
1679        /// Property [`ResourceARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-kinesisfirehoseinput.html#cfn-kinesisanalyticsv2-application-kinesisfirehoseinput-resourcearn).
1680        ///
1681        /// Update type: _Mutable_.
1682        /// AWS CloudFormation doesn't replace the resource when you change this property.
1683        pub resource_arn: ::Value<String>,
1684    }
1685
1686    impl ::codec::SerializeValue for KinesisFirehoseInput {
1687        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1688            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1689            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceARN", &self.resource_arn)?;
1690            ::serde::ser::SerializeMap::end(map)
1691        }
1692    }
1693
1694    impl ::codec::DeserializeValue for KinesisFirehoseInput {
1695        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<KinesisFirehoseInput, D::Error> {
1696            struct Visitor;
1697
1698            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1699                type Value = KinesisFirehoseInput;
1700
1701                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1702                    write!(f, "a struct of type KinesisFirehoseInput")
1703                }
1704
1705                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1706                    let mut resource_arn: Option<::Value<String>> = None;
1707
1708                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1709                        match __cfn_key.as_ref() {
1710                            "ResourceARN" => {
1711                                resource_arn = ::serde::de::MapAccess::next_value(&mut map)?;
1712                            }
1713                            _ => {}
1714                        }
1715                    }
1716
1717                    Ok(KinesisFirehoseInput {
1718                        resource_arn: resource_arn.ok_or(::serde::de::Error::missing_field("ResourceARN"))?,
1719                    })
1720                }
1721            }
1722
1723            d.deserialize_map(Visitor)
1724        }
1725    }
1726
1727    /// The [`AWS::KinesisAnalyticsV2::Application.KinesisStreamsInput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-kinesisstreamsinput.html) property type.
1728    #[derive(Debug, Default)]
1729    pub struct KinesisStreamsInput {
1730        /// Property [`ResourceARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-kinesisstreamsinput.html#cfn-kinesisanalyticsv2-application-kinesisstreamsinput-resourcearn).
1731        ///
1732        /// Update type: _Mutable_.
1733        /// AWS CloudFormation doesn't replace the resource when you change this property.
1734        pub resource_arn: ::Value<String>,
1735    }
1736
1737    impl ::codec::SerializeValue for KinesisStreamsInput {
1738        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1739            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1740            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceARN", &self.resource_arn)?;
1741            ::serde::ser::SerializeMap::end(map)
1742        }
1743    }
1744
1745    impl ::codec::DeserializeValue for KinesisStreamsInput {
1746        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<KinesisStreamsInput, D::Error> {
1747            struct Visitor;
1748
1749            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1750                type Value = KinesisStreamsInput;
1751
1752                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1753                    write!(f, "a struct of type KinesisStreamsInput")
1754                }
1755
1756                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1757                    let mut resource_arn: Option<::Value<String>> = None;
1758
1759                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1760                        match __cfn_key.as_ref() {
1761                            "ResourceARN" => {
1762                                resource_arn = ::serde::de::MapAccess::next_value(&mut map)?;
1763                            }
1764                            _ => {}
1765                        }
1766                    }
1767
1768                    Ok(KinesisStreamsInput {
1769                        resource_arn: resource_arn.ok_or(::serde::de::Error::missing_field("ResourceARN"))?,
1770                    })
1771                }
1772            }
1773
1774            d.deserialize_map(Visitor)
1775        }
1776    }
1777
1778    /// The [`AWS::KinesisAnalyticsV2::Application.MappingParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-mappingparameters.html) property type.
1779    #[derive(Debug, Default)]
1780    pub struct MappingParameters {
1781        /// Property [`CSVMappingParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-mappingparameters.html#cfn-kinesisanalyticsv2-application-mappingparameters-csvmappingparameters).
1782        ///
1783        /// Update type: _Mutable_.
1784        /// AWS CloudFormation doesn't replace the resource when you change this property.
1785        pub csv_mapping_parameters: Option<::Value<CSVMappingParameters>>,
1786        /// Property [`JSONMappingParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-mappingparameters.html#cfn-kinesisanalyticsv2-application-mappingparameters-jsonmappingparameters).
1787        ///
1788        /// Update type: _Mutable_.
1789        /// AWS CloudFormation doesn't replace the resource when you change this property.
1790        pub json_mapping_parameters: Option<::Value<JSONMappingParameters>>,
1791    }
1792
1793    impl ::codec::SerializeValue for MappingParameters {
1794        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1795            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1796            if let Some(ref csv_mapping_parameters) = self.csv_mapping_parameters {
1797                ::serde::ser::SerializeMap::serialize_entry(&mut map, "CSVMappingParameters", csv_mapping_parameters)?;
1798            }
1799            if let Some(ref json_mapping_parameters) = self.json_mapping_parameters {
1800                ::serde::ser::SerializeMap::serialize_entry(&mut map, "JSONMappingParameters", json_mapping_parameters)?;
1801            }
1802            ::serde::ser::SerializeMap::end(map)
1803        }
1804    }
1805
1806    impl ::codec::DeserializeValue for MappingParameters {
1807        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<MappingParameters, D::Error> {
1808            struct Visitor;
1809
1810            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1811                type Value = MappingParameters;
1812
1813                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1814                    write!(f, "a struct of type MappingParameters")
1815                }
1816
1817                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1818                    let mut csv_mapping_parameters: Option<::Value<CSVMappingParameters>> = None;
1819                    let mut json_mapping_parameters: Option<::Value<JSONMappingParameters>> = None;
1820
1821                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1822                        match __cfn_key.as_ref() {
1823                            "CSVMappingParameters" => {
1824                                csv_mapping_parameters = ::serde::de::MapAccess::next_value(&mut map)?;
1825                            }
1826                            "JSONMappingParameters" => {
1827                                json_mapping_parameters = ::serde::de::MapAccess::next_value(&mut map)?;
1828                            }
1829                            _ => {}
1830                        }
1831                    }
1832
1833                    Ok(MappingParameters {
1834                        csv_mapping_parameters: csv_mapping_parameters,
1835                        json_mapping_parameters: json_mapping_parameters,
1836                    })
1837                }
1838            }
1839
1840            d.deserialize_map(Visitor)
1841        }
1842    }
1843
1844    /// The [`AWS::KinesisAnalyticsV2::Application.MavenReference`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-mavenreference.html) property type.
1845    #[derive(Debug, Default)]
1846    pub struct MavenReference {
1847        /// Property [`ArtifactId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-mavenreference.html#cfn-kinesisanalyticsv2-application-mavenreference-artifactid).
1848        ///
1849        /// Update type: _Mutable_.
1850        /// AWS CloudFormation doesn't replace the resource when you change this property.
1851        pub artifact_id: ::Value<String>,
1852        /// Property [`GroupId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-mavenreference.html#cfn-kinesisanalyticsv2-application-mavenreference-groupid).
1853        ///
1854        /// Update type: _Mutable_.
1855        /// AWS CloudFormation doesn't replace the resource when you change this property.
1856        pub group_id: ::Value<String>,
1857        /// Property [`Version`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-mavenreference.html#cfn-kinesisanalyticsv2-application-mavenreference-version).
1858        ///
1859        /// Update type: _Mutable_.
1860        /// AWS CloudFormation doesn't replace the resource when you change this property.
1861        pub version: ::Value<String>,
1862    }
1863
1864    impl ::codec::SerializeValue for MavenReference {
1865        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1866            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1867            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ArtifactId", &self.artifact_id)?;
1868            ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupId", &self.group_id)?;
1869            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Version", &self.version)?;
1870            ::serde::ser::SerializeMap::end(map)
1871        }
1872    }
1873
1874    impl ::codec::DeserializeValue for MavenReference {
1875        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<MavenReference, D::Error> {
1876            struct Visitor;
1877
1878            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1879                type Value = MavenReference;
1880
1881                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1882                    write!(f, "a struct of type MavenReference")
1883                }
1884
1885                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1886                    let mut artifact_id: Option<::Value<String>> = None;
1887                    let mut group_id: Option<::Value<String>> = None;
1888                    let mut version: Option<::Value<String>> = None;
1889
1890                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1891                        match __cfn_key.as_ref() {
1892                            "ArtifactId" => {
1893                                artifact_id = ::serde::de::MapAccess::next_value(&mut map)?;
1894                            }
1895                            "GroupId" => {
1896                                group_id = ::serde::de::MapAccess::next_value(&mut map)?;
1897                            }
1898                            "Version" => {
1899                                version = ::serde::de::MapAccess::next_value(&mut map)?;
1900                            }
1901                            _ => {}
1902                        }
1903                    }
1904
1905                    Ok(MavenReference {
1906                        artifact_id: artifact_id.ok_or(::serde::de::Error::missing_field("ArtifactId"))?,
1907                        group_id: group_id.ok_or(::serde::de::Error::missing_field("GroupId"))?,
1908                        version: version.ok_or(::serde::de::Error::missing_field("Version"))?,
1909                    })
1910                }
1911            }
1912
1913            d.deserialize_map(Visitor)
1914        }
1915    }
1916
1917    /// The [`AWS::KinesisAnalyticsV2::Application.MonitoringConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-monitoringconfiguration.html) property type.
1918    #[derive(Debug, Default)]
1919    pub struct MonitoringConfiguration {
1920        /// Property [`ConfigurationType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-monitoringconfiguration.html#cfn-kinesisanalyticsv2-application-monitoringconfiguration-configurationtype).
1921        ///
1922        /// Update type: _Mutable_.
1923        /// AWS CloudFormation doesn't replace the resource when you change this property.
1924        pub configuration_type: ::Value<String>,
1925        /// Property [`LogLevel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-monitoringconfiguration.html#cfn-kinesisanalyticsv2-application-monitoringconfiguration-loglevel).
1926        ///
1927        /// Update type: _Mutable_.
1928        /// AWS CloudFormation doesn't replace the resource when you change this property.
1929        pub log_level: Option<::Value<String>>,
1930        /// Property [`MetricsLevel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-monitoringconfiguration.html#cfn-kinesisanalyticsv2-application-monitoringconfiguration-metricslevel).
1931        ///
1932        /// Update type: _Mutable_.
1933        /// AWS CloudFormation doesn't replace the resource when you change this property.
1934        pub metrics_level: Option<::Value<String>>,
1935    }
1936
1937    impl ::codec::SerializeValue for MonitoringConfiguration {
1938        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1939            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1940            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConfigurationType", &self.configuration_type)?;
1941            if let Some(ref log_level) = self.log_level {
1942                ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogLevel", log_level)?;
1943            }
1944            if let Some(ref metrics_level) = self.metrics_level {
1945                ::serde::ser::SerializeMap::serialize_entry(&mut map, "MetricsLevel", metrics_level)?;
1946            }
1947            ::serde::ser::SerializeMap::end(map)
1948        }
1949    }
1950
1951    impl ::codec::DeserializeValue for MonitoringConfiguration {
1952        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<MonitoringConfiguration, D::Error> {
1953            struct Visitor;
1954
1955            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1956                type Value = MonitoringConfiguration;
1957
1958                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1959                    write!(f, "a struct of type MonitoringConfiguration")
1960                }
1961
1962                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1963                    let mut configuration_type: Option<::Value<String>> = None;
1964                    let mut log_level: Option<::Value<String>> = None;
1965                    let mut metrics_level: Option<::Value<String>> = None;
1966
1967                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1968                        match __cfn_key.as_ref() {
1969                            "ConfigurationType" => {
1970                                configuration_type = ::serde::de::MapAccess::next_value(&mut map)?;
1971                            }
1972                            "LogLevel" => {
1973                                log_level = ::serde::de::MapAccess::next_value(&mut map)?;
1974                            }
1975                            "MetricsLevel" => {
1976                                metrics_level = ::serde::de::MapAccess::next_value(&mut map)?;
1977                            }
1978                            _ => {}
1979                        }
1980                    }
1981
1982                    Ok(MonitoringConfiguration {
1983                        configuration_type: configuration_type.ok_or(::serde::de::Error::missing_field("ConfigurationType"))?,
1984                        log_level: log_level,
1985                        metrics_level: metrics_level,
1986                    })
1987                }
1988            }
1989
1990            d.deserialize_map(Visitor)
1991        }
1992    }
1993
1994    /// The [`AWS::KinesisAnalyticsV2::Application.ParallelismConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-parallelismconfiguration.html) property type.
1995    #[derive(Debug, Default)]
1996    pub struct ParallelismConfiguration {
1997        /// Property [`AutoScalingEnabled`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-parallelismconfiguration.html#cfn-kinesisanalyticsv2-application-parallelismconfiguration-autoscalingenabled).
1998        ///
1999        /// Update type: _Mutable_.
2000        /// AWS CloudFormation doesn't replace the resource when you change this property.
2001        pub auto_scaling_enabled: Option<::Value<bool>>,
2002        /// Property [`ConfigurationType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-parallelismconfiguration.html#cfn-kinesisanalyticsv2-application-parallelismconfiguration-configurationtype).
2003        ///
2004        /// Update type: _Mutable_.
2005        /// AWS CloudFormation doesn't replace the resource when you change this property.
2006        pub configuration_type: ::Value<String>,
2007        /// Property [`Parallelism`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-parallelismconfiguration.html#cfn-kinesisanalyticsv2-application-parallelismconfiguration-parallelism).
2008        ///
2009        /// Update type: _Mutable_.
2010        /// AWS CloudFormation doesn't replace the resource when you change this property.
2011        pub parallelism: Option<::Value<u32>>,
2012        /// Property [`ParallelismPerKPU`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-parallelismconfiguration.html#cfn-kinesisanalyticsv2-application-parallelismconfiguration-parallelismperkpu).
2013        ///
2014        /// Update type: _Mutable_.
2015        /// AWS CloudFormation doesn't replace the resource when you change this property.
2016        pub parallelism_per_kpu: Option<::Value<u32>>,
2017    }
2018
2019    impl ::codec::SerializeValue for ParallelismConfiguration {
2020        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2021            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2022            if let Some(ref auto_scaling_enabled) = self.auto_scaling_enabled {
2023                ::serde::ser::SerializeMap::serialize_entry(&mut map, "AutoScalingEnabled", auto_scaling_enabled)?;
2024            }
2025            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConfigurationType", &self.configuration_type)?;
2026            if let Some(ref parallelism) = self.parallelism {
2027                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Parallelism", parallelism)?;
2028            }
2029            if let Some(ref parallelism_per_kpu) = self.parallelism_per_kpu {
2030                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ParallelismPerKPU", parallelism_per_kpu)?;
2031            }
2032            ::serde::ser::SerializeMap::end(map)
2033        }
2034    }
2035
2036    impl ::codec::DeserializeValue for ParallelismConfiguration {
2037        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ParallelismConfiguration, D::Error> {
2038            struct Visitor;
2039
2040            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2041                type Value = ParallelismConfiguration;
2042
2043                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2044                    write!(f, "a struct of type ParallelismConfiguration")
2045                }
2046
2047                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2048                    let mut auto_scaling_enabled: Option<::Value<bool>> = None;
2049                    let mut configuration_type: Option<::Value<String>> = None;
2050                    let mut parallelism: Option<::Value<u32>> = None;
2051                    let mut parallelism_per_kpu: Option<::Value<u32>> = None;
2052
2053                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2054                        match __cfn_key.as_ref() {
2055                            "AutoScalingEnabled" => {
2056                                auto_scaling_enabled = ::serde::de::MapAccess::next_value(&mut map)?;
2057                            }
2058                            "ConfigurationType" => {
2059                                configuration_type = ::serde::de::MapAccess::next_value(&mut map)?;
2060                            }
2061                            "Parallelism" => {
2062                                parallelism = ::serde::de::MapAccess::next_value(&mut map)?;
2063                            }
2064                            "ParallelismPerKPU" => {
2065                                parallelism_per_kpu = ::serde::de::MapAccess::next_value(&mut map)?;
2066                            }
2067                            _ => {}
2068                        }
2069                    }
2070
2071                    Ok(ParallelismConfiguration {
2072                        auto_scaling_enabled: auto_scaling_enabled,
2073                        configuration_type: configuration_type.ok_or(::serde::de::Error::missing_field("ConfigurationType"))?,
2074                        parallelism: parallelism,
2075                        parallelism_per_kpu: parallelism_per_kpu,
2076                    })
2077                }
2078            }
2079
2080            d.deserialize_map(Visitor)
2081        }
2082    }
2083
2084    /// The [`AWS::KinesisAnalyticsV2::Application.PropertyGroup`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-propertygroup.html) property type.
2085    #[derive(Debug, Default)]
2086    pub struct PropertyGroup {
2087        /// Property [`PropertyGroupId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-propertygroup.html#cfn-kinesisanalyticsv2-application-propertygroup-propertygroupid).
2088        ///
2089        /// Update type: _Mutable_.
2090        /// AWS CloudFormation doesn't replace the resource when you change this property.
2091        pub property_group_id: Option<::Value<String>>,
2092        /// Property [`PropertyMap`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-propertygroup.html#cfn-kinesisanalyticsv2-application-propertygroup-propertymap).
2093        ///
2094        /// Update type: _Mutable_.
2095        /// AWS CloudFormation doesn't replace the resource when you change this property.
2096        pub property_map: Option<::Value<::json::Value>>,
2097    }
2098
2099    impl ::codec::SerializeValue for PropertyGroup {
2100        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2101            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2102            if let Some(ref property_group_id) = self.property_group_id {
2103                ::serde::ser::SerializeMap::serialize_entry(&mut map, "PropertyGroupId", property_group_id)?;
2104            }
2105            if let Some(ref property_map) = self.property_map {
2106                ::serde::ser::SerializeMap::serialize_entry(&mut map, "PropertyMap", property_map)?;
2107            }
2108            ::serde::ser::SerializeMap::end(map)
2109        }
2110    }
2111
2112    impl ::codec::DeserializeValue for PropertyGroup {
2113        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<PropertyGroup, D::Error> {
2114            struct Visitor;
2115
2116            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2117                type Value = PropertyGroup;
2118
2119                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2120                    write!(f, "a struct of type PropertyGroup")
2121                }
2122
2123                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2124                    let mut property_group_id: Option<::Value<String>> = None;
2125                    let mut property_map: Option<::Value<::json::Value>> = None;
2126
2127                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2128                        match __cfn_key.as_ref() {
2129                            "PropertyGroupId" => {
2130                                property_group_id = ::serde::de::MapAccess::next_value(&mut map)?;
2131                            }
2132                            "PropertyMap" => {
2133                                property_map = ::serde::de::MapAccess::next_value(&mut map)?;
2134                            }
2135                            _ => {}
2136                        }
2137                    }
2138
2139                    Ok(PropertyGroup {
2140                        property_group_id: property_group_id,
2141                        property_map: property_map,
2142                    })
2143                }
2144            }
2145
2146            d.deserialize_map(Visitor)
2147        }
2148    }
2149
2150    /// The [`AWS::KinesisAnalyticsV2::Application.RecordColumn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-recordcolumn.html) property type.
2151    #[derive(Debug, Default)]
2152    pub struct RecordColumn {
2153        /// Property [`Mapping`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-recordcolumn.html#cfn-kinesisanalyticsv2-application-recordcolumn-mapping).
2154        ///
2155        /// Update type: _Mutable_.
2156        /// AWS CloudFormation doesn't replace the resource when you change this property.
2157        pub mapping: Option<::Value<String>>,
2158        /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-recordcolumn.html#cfn-kinesisanalyticsv2-application-recordcolumn-name).
2159        ///
2160        /// Update type: _Mutable_.
2161        /// AWS CloudFormation doesn't replace the resource when you change this property.
2162        pub name: ::Value<String>,
2163        /// Property [`SqlType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-recordcolumn.html#cfn-kinesisanalyticsv2-application-recordcolumn-sqltype).
2164        ///
2165        /// Update type: _Mutable_.
2166        /// AWS CloudFormation doesn't replace the resource when you change this property.
2167        pub sql_type: ::Value<String>,
2168    }
2169
2170    impl ::codec::SerializeValue for RecordColumn {
2171        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2172            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2173            if let Some(ref mapping) = self.mapping {
2174                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Mapping", mapping)?;
2175            }
2176            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?;
2177            ::serde::ser::SerializeMap::serialize_entry(&mut map, "SqlType", &self.sql_type)?;
2178            ::serde::ser::SerializeMap::end(map)
2179        }
2180    }
2181
2182    impl ::codec::DeserializeValue for RecordColumn {
2183        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<RecordColumn, D::Error> {
2184            struct Visitor;
2185
2186            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2187                type Value = RecordColumn;
2188
2189                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2190                    write!(f, "a struct of type RecordColumn")
2191                }
2192
2193                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2194                    let mut mapping: Option<::Value<String>> = None;
2195                    let mut name: Option<::Value<String>> = None;
2196                    let mut sql_type: Option<::Value<String>> = None;
2197
2198                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2199                        match __cfn_key.as_ref() {
2200                            "Mapping" => {
2201                                mapping = ::serde::de::MapAccess::next_value(&mut map)?;
2202                            }
2203                            "Name" => {
2204                                name = ::serde::de::MapAccess::next_value(&mut map)?;
2205                            }
2206                            "SqlType" => {
2207                                sql_type = ::serde::de::MapAccess::next_value(&mut map)?;
2208                            }
2209                            _ => {}
2210                        }
2211                    }
2212
2213                    Ok(RecordColumn {
2214                        mapping: mapping,
2215                        name: name.ok_or(::serde::de::Error::missing_field("Name"))?,
2216                        sql_type: sql_type.ok_or(::serde::de::Error::missing_field("SqlType"))?,
2217                    })
2218                }
2219            }
2220
2221            d.deserialize_map(Visitor)
2222        }
2223    }
2224
2225    /// The [`AWS::KinesisAnalyticsV2::Application.RecordFormat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-recordformat.html) property type.
2226    #[derive(Debug, Default)]
2227    pub struct RecordFormat {
2228        /// Property [`MappingParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-recordformat.html#cfn-kinesisanalyticsv2-application-recordformat-mappingparameters).
2229        ///
2230        /// Update type: _Mutable_.
2231        /// AWS CloudFormation doesn't replace the resource when you change this property.
2232        pub mapping_parameters: Option<::Value<MappingParameters>>,
2233        /// Property [`RecordFormatType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-recordformat.html#cfn-kinesisanalyticsv2-application-recordformat-recordformattype).
2234        ///
2235        /// Update type: _Mutable_.
2236        /// AWS CloudFormation doesn't replace the resource when you change this property.
2237        pub record_format_type: ::Value<String>,
2238    }
2239
2240    impl ::codec::SerializeValue for RecordFormat {
2241        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2242            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2243            if let Some(ref mapping_parameters) = self.mapping_parameters {
2244                ::serde::ser::SerializeMap::serialize_entry(&mut map, "MappingParameters", mapping_parameters)?;
2245            }
2246            ::serde::ser::SerializeMap::serialize_entry(&mut map, "RecordFormatType", &self.record_format_type)?;
2247            ::serde::ser::SerializeMap::end(map)
2248        }
2249    }
2250
2251    impl ::codec::DeserializeValue for RecordFormat {
2252        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<RecordFormat, D::Error> {
2253            struct Visitor;
2254
2255            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2256                type Value = RecordFormat;
2257
2258                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2259                    write!(f, "a struct of type RecordFormat")
2260                }
2261
2262                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2263                    let mut mapping_parameters: Option<::Value<MappingParameters>> = None;
2264                    let mut record_format_type: Option<::Value<String>> = None;
2265
2266                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2267                        match __cfn_key.as_ref() {
2268                            "MappingParameters" => {
2269                                mapping_parameters = ::serde::de::MapAccess::next_value(&mut map)?;
2270                            }
2271                            "RecordFormatType" => {
2272                                record_format_type = ::serde::de::MapAccess::next_value(&mut map)?;
2273                            }
2274                            _ => {}
2275                        }
2276                    }
2277
2278                    Ok(RecordFormat {
2279                        mapping_parameters: mapping_parameters,
2280                        record_format_type: record_format_type.ok_or(::serde::de::Error::missing_field("RecordFormatType"))?,
2281                    })
2282                }
2283            }
2284
2285            d.deserialize_map(Visitor)
2286        }
2287    }
2288
2289    /// The [`AWS::KinesisAnalyticsV2::Application.S3ContentBaseLocation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-s3contentbaselocation.html) property type.
2290    #[derive(Debug, Default)]
2291    pub struct S3ContentBaseLocation {
2292        /// Property [`BasePath`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-s3contentbaselocation.html#cfn-kinesisanalyticsv2-application-s3contentbaselocation-basepath).
2293        ///
2294        /// Update type: _Mutable_.
2295        /// AWS CloudFormation doesn't replace the resource when you change this property.
2296        pub base_path: ::Value<String>,
2297        /// Property [`BucketARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-s3contentbaselocation.html#cfn-kinesisanalyticsv2-application-s3contentbaselocation-bucketarn).
2298        ///
2299        /// Update type: _Mutable_.
2300        /// AWS CloudFormation doesn't replace the resource when you change this property.
2301        pub bucket_arn: ::Value<String>,
2302    }
2303
2304    impl ::codec::SerializeValue for S3ContentBaseLocation {
2305        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2306            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2307            ::serde::ser::SerializeMap::serialize_entry(&mut map, "BasePath", &self.base_path)?;
2308            ::serde::ser::SerializeMap::serialize_entry(&mut map, "BucketARN", &self.bucket_arn)?;
2309            ::serde::ser::SerializeMap::end(map)
2310        }
2311    }
2312
2313    impl ::codec::DeserializeValue for S3ContentBaseLocation {
2314        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<S3ContentBaseLocation, D::Error> {
2315            struct Visitor;
2316
2317            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2318                type Value = S3ContentBaseLocation;
2319
2320                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2321                    write!(f, "a struct of type S3ContentBaseLocation")
2322                }
2323
2324                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2325                    let mut base_path: Option<::Value<String>> = None;
2326                    let mut bucket_arn: Option<::Value<String>> = None;
2327
2328                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2329                        match __cfn_key.as_ref() {
2330                            "BasePath" => {
2331                                base_path = ::serde::de::MapAccess::next_value(&mut map)?;
2332                            }
2333                            "BucketARN" => {
2334                                bucket_arn = ::serde::de::MapAccess::next_value(&mut map)?;
2335                            }
2336                            _ => {}
2337                        }
2338                    }
2339
2340                    Ok(S3ContentBaseLocation {
2341                        base_path: base_path.ok_or(::serde::de::Error::missing_field("BasePath"))?,
2342                        bucket_arn: bucket_arn.ok_or(::serde::de::Error::missing_field("BucketARN"))?,
2343                    })
2344                }
2345            }
2346
2347            d.deserialize_map(Visitor)
2348        }
2349    }
2350
2351    /// The [`AWS::KinesisAnalyticsV2::Application.S3ContentLocation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-s3contentlocation.html) property type.
2352    #[derive(Debug, Default)]
2353    pub struct S3ContentLocation {
2354        /// Property [`BucketARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-s3contentlocation.html#cfn-kinesisanalyticsv2-application-s3contentlocation-bucketarn).
2355        ///
2356        /// Update type: _Mutable_.
2357        /// AWS CloudFormation doesn't replace the resource when you change this property.
2358        pub bucket_arn: Option<::Value<String>>,
2359        /// Property [`FileKey`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-s3contentlocation.html#cfn-kinesisanalyticsv2-application-s3contentlocation-filekey).
2360        ///
2361        /// Update type: _Mutable_.
2362        /// AWS CloudFormation doesn't replace the resource when you change this property.
2363        pub file_key: Option<::Value<String>>,
2364        /// Property [`ObjectVersion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-s3contentlocation.html#cfn-kinesisanalyticsv2-application-s3contentlocation-objectversion).
2365        ///
2366        /// Update type: _Mutable_.
2367        /// AWS CloudFormation doesn't replace the resource when you change this property.
2368        pub object_version: Option<::Value<String>>,
2369    }
2370
2371    impl ::codec::SerializeValue for S3ContentLocation {
2372        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2373            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2374            if let Some(ref bucket_arn) = self.bucket_arn {
2375                ::serde::ser::SerializeMap::serialize_entry(&mut map, "BucketARN", bucket_arn)?;
2376            }
2377            if let Some(ref file_key) = self.file_key {
2378                ::serde::ser::SerializeMap::serialize_entry(&mut map, "FileKey", file_key)?;
2379            }
2380            if let Some(ref object_version) = self.object_version {
2381                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ObjectVersion", object_version)?;
2382            }
2383            ::serde::ser::SerializeMap::end(map)
2384        }
2385    }
2386
2387    impl ::codec::DeserializeValue for S3ContentLocation {
2388        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<S3ContentLocation, D::Error> {
2389            struct Visitor;
2390
2391            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2392                type Value = S3ContentLocation;
2393
2394                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2395                    write!(f, "a struct of type S3ContentLocation")
2396                }
2397
2398                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2399                    let mut bucket_arn: Option<::Value<String>> = None;
2400                    let mut file_key: Option<::Value<String>> = None;
2401                    let mut object_version: Option<::Value<String>> = None;
2402
2403                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2404                        match __cfn_key.as_ref() {
2405                            "BucketARN" => {
2406                                bucket_arn = ::serde::de::MapAccess::next_value(&mut map)?;
2407                            }
2408                            "FileKey" => {
2409                                file_key = ::serde::de::MapAccess::next_value(&mut map)?;
2410                            }
2411                            "ObjectVersion" => {
2412                                object_version = ::serde::de::MapAccess::next_value(&mut map)?;
2413                            }
2414                            _ => {}
2415                        }
2416                    }
2417
2418                    Ok(S3ContentLocation {
2419                        bucket_arn: bucket_arn,
2420                        file_key: file_key,
2421                        object_version: object_version,
2422                    })
2423                }
2424            }
2425
2426            d.deserialize_map(Visitor)
2427        }
2428    }
2429
2430    /// The [`AWS::KinesisAnalyticsV2::Application.SqlApplicationConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-sqlapplicationconfiguration.html) property type.
2431    #[derive(Debug, Default)]
2432    pub struct SqlApplicationConfiguration {
2433        /// Property [`Inputs`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-sqlapplicationconfiguration.html#cfn-kinesisanalyticsv2-application-sqlapplicationconfiguration-inputs).
2434        ///
2435        /// Update type: _Mutable_.
2436        /// AWS CloudFormation doesn't replace the resource when you change this property.
2437        pub inputs: Option<::ValueList<Input>>,
2438    }
2439
2440    impl ::codec::SerializeValue for SqlApplicationConfiguration {
2441        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2442            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2443            if let Some(ref inputs) = self.inputs {
2444                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Inputs", inputs)?;
2445            }
2446            ::serde::ser::SerializeMap::end(map)
2447        }
2448    }
2449
2450    impl ::codec::DeserializeValue for SqlApplicationConfiguration {
2451        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<SqlApplicationConfiguration, D::Error> {
2452            struct Visitor;
2453
2454            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2455                type Value = SqlApplicationConfiguration;
2456
2457                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2458                    write!(f, "a struct of type SqlApplicationConfiguration")
2459                }
2460
2461                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2462                    let mut inputs: Option<::ValueList<Input>> = None;
2463
2464                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2465                        match __cfn_key.as_ref() {
2466                            "Inputs" => {
2467                                inputs = ::serde::de::MapAccess::next_value(&mut map)?;
2468                            }
2469                            _ => {}
2470                        }
2471                    }
2472
2473                    Ok(SqlApplicationConfiguration {
2474                        inputs: inputs,
2475                    })
2476                }
2477            }
2478
2479            d.deserialize_map(Visitor)
2480        }
2481    }
2482
2483    /// The [`AWS::KinesisAnalyticsV2::Application.ZeppelinApplicationConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-zeppelinapplicationconfiguration.html) property type.
2484    #[derive(Debug, Default)]
2485    pub struct ZeppelinApplicationConfiguration {
2486        /// Property [`CatalogConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-zeppelinapplicationconfiguration.html#cfn-kinesisanalyticsv2-application-zeppelinapplicationconfiguration-catalogconfiguration).
2487        ///
2488        /// Update type: _Mutable_.
2489        /// AWS CloudFormation doesn't replace the resource when you change this property.
2490        pub catalog_configuration: Option<::Value<CatalogConfiguration>>,
2491        /// Property [`CustomArtifactsConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-zeppelinapplicationconfiguration.html#cfn-kinesisanalyticsv2-application-zeppelinapplicationconfiguration-customartifactsconfiguration).
2492        ///
2493        /// Update type: _Mutable_.
2494        /// AWS CloudFormation doesn't replace the resource when you change this property.
2495        pub custom_artifacts_configuration: Option<::Value<CustomArtifactsConfiguration>>,
2496        /// Property [`DeployAsApplicationConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-zeppelinapplicationconfiguration.html#cfn-kinesisanalyticsv2-application-zeppelinapplicationconfiguration-deployasapplicationconfiguration).
2497        ///
2498        /// Update type: _Mutable_.
2499        /// AWS CloudFormation doesn't replace the resource when you change this property.
2500        pub deploy_as_application_configuration: Option<::Value<DeployAsApplicationConfiguration>>,
2501        /// Property [`MonitoringConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-zeppelinapplicationconfiguration.html#cfn-kinesisanalyticsv2-application-zeppelinapplicationconfiguration-monitoringconfiguration).
2502        ///
2503        /// Update type: _Mutable_.
2504        /// AWS CloudFormation doesn't replace the resource when you change this property.
2505        pub monitoring_configuration: Option<::Value<ZeppelinMonitoringConfiguration>>,
2506    }
2507
2508    impl ::codec::SerializeValue for ZeppelinApplicationConfiguration {
2509        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2510            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2511            if let Some(ref catalog_configuration) = self.catalog_configuration {
2512                ::serde::ser::SerializeMap::serialize_entry(&mut map, "CatalogConfiguration", catalog_configuration)?;
2513            }
2514            if let Some(ref custom_artifacts_configuration) = self.custom_artifacts_configuration {
2515                ::serde::ser::SerializeMap::serialize_entry(&mut map, "CustomArtifactsConfiguration", custom_artifacts_configuration)?;
2516            }
2517            if let Some(ref deploy_as_application_configuration) = self.deploy_as_application_configuration {
2518                ::serde::ser::SerializeMap::serialize_entry(&mut map, "DeployAsApplicationConfiguration", deploy_as_application_configuration)?;
2519            }
2520            if let Some(ref monitoring_configuration) = self.monitoring_configuration {
2521                ::serde::ser::SerializeMap::serialize_entry(&mut map, "MonitoringConfiguration", monitoring_configuration)?;
2522            }
2523            ::serde::ser::SerializeMap::end(map)
2524        }
2525    }
2526
2527    impl ::codec::DeserializeValue for ZeppelinApplicationConfiguration {
2528        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ZeppelinApplicationConfiguration, D::Error> {
2529            struct Visitor;
2530
2531            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2532                type Value = ZeppelinApplicationConfiguration;
2533
2534                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2535                    write!(f, "a struct of type ZeppelinApplicationConfiguration")
2536                }
2537
2538                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2539                    let mut catalog_configuration: Option<::Value<CatalogConfiguration>> = None;
2540                    let mut custom_artifacts_configuration: Option<::Value<CustomArtifactsConfiguration>> = None;
2541                    let mut deploy_as_application_configuration: Option<::Value<DeployAsApplicationConfiguration>> = None;
2542                    let mut monitoring_configuration: Option<::Value<ZeppelinMonitoringConfiguration>> = None;
2543
2544                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2545                        match __cfn_key.as_ref() {
2546                            "CatalogConfiguration" => {
2547                                catalog_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
2548                            }
2549                            "CustomArtifactsConfiguration" => {
2550                                custom_artifacts_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
2551                            }
2552                            "DeployAsApplicationConfiguration" => {
2553                                deploy_as_application_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
2554                            }
2555                            "MonitoringConfiguration" => {
2556                                monitoring_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
2557                            }
2558                            _ => {}
2559                        }
2560                    }
2561
2562                    Ok(ZeppelinApplicationConfiguration {
2563                        catalog_configuration: catalog_configuration,
2564                        custom_artifacts_configuration: custom_artifacts_configuration,
2565                        deploy_as_application_configuration: deploy_as_application_configuration,
2566                        monitoring_configuration: monitoring_configuration,
2567                    })
2568                }
2569            }
2570
2571            d.deserialize_map(Visitor)
2572        }
2573    }
2574
2575    /// The [`AWS::KinesisAnalyticsV2::Application.ZeppelinMonitoringConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-zeppelinmonitoringconfiguration.html) property type.
2576    #[derive(Debug, Default)]
2577    pub struct ZeppelinMonitoringConfiguration {
2578        /// Property [`LogLevel`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-application-zeppelinmonitoringconfiguration.html#cfn-kinesisanalyticsv2-application-zeppelinmonitoringconfiguration-loglevel).
2579        ///
2580        /// Update type: _Mutable_.
2581        /// AWS CloudFormation doesn't replace the resource when you change this property.
2582        pub log_level: Option<::Value<String>>,
2583    }
2584
2585    impl ::codec::SerializeValue for ZeppelinMonitoringConfiguration {
2586        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2587            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2588            if let Some(ref log_level) = self.log_level {
2589                ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogLevel", log_level)?;
2590            }
2591            ::serde::ser::SerializeMap::end(map)
2592        }
2593    }
2594
2595    impl ::codec::DeserializeValue for ZeppelinMonitoringConfiguration {
2596        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ZeppelinMonitoringConfiguration, D::Error> {
2597            struct Visitor;
2598
2599            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2600                type Value = ZeppelinMonitoringConfiguration;
2601
2602                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2603                    write!(f, "a struct of type ZeppelinMonitoringConfiguration")
2604                }
2605
2606                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2607                    let mut log_level: Option<::Value<String>> = None;
2608
2609                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2610                        match __cfn_key.as_ref() {
2611                            "LogLevel" => {
2612                                log_level = ::serde::de::MapAccess::next_value(&mut map)?;
2613                            }
2614                            _ => {}
2615                        }
2616                    }
2617
2618                    Ok(ZeppelinMonitoringConfiguration {
2619                        log_level: log_level,
2620                    })
2621                }
2622            }
2623
2624            d.deserialize_map(Visitor)
2625        }
2626    }
2627}
2628
2629pub mod application_cloud_watch_logging_option {
2630    //! Property types for the `ApplicationCloudWatchLoggingOption` resource.
2631
2632    /// The [`AWS::KinesisAnalyticsV2::ApplicationCloudWatchLoggingOption.CloudWatchLoggingOption`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationcloudwatchloggingoption-cloudwatchloggingoption.html) property type.
2633    #[derive(Debug, Default)]
2634    pub struct CloudWatchLoggingOption {
2635        /// Property [`LogStreamARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationcloudwatchloggingoption-cloudwatchloggingoption.html#cfn-kinesisanalyticsv2-applicationcloudwatchloggingoption-cloudwatchloggingoption-logstreamarn).
2636        ///
2637        /// Update type: _Mutable_.
2638        /// AWS CloudFormation doesn't replace the resource when you change this property.
2639        pub log_stream_arn: ::Value<String>,
2640    }
2641
2642    impl ::codec::SerializeValue for CloudWatchLoggingOption {
2643        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2644            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2645            ::serde::ser::SerializeMap::serialize_entry(&mut map, "LogStreamARN", &self.log_stream_arn)?;
2646            ::serde::ser::SerializeMap::end(map)
2647        }
2648    }
2649
2650    impl ::codec::DeserializeValue for CloudWatchLoggingOption {
2651        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<CloudWatchLoggingOption, D::Error> {
2652            struct Visitor;
2653
2654            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2655                type Value = CloudWatchLoggingOption;
2656
2657                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2658                    write!(f, "a struct of type CloudWatchLoggingOption")
2659                }
2660
2661                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2662                    let mut log_stream_arn: Option<::Value<String>> = None;
2663
2664                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2665                        match __cfn_key.as_ref() {
2666                            "LogStreamARN" => {
2667                                log_stream_arn = ::serde::de::MapAccess::next_value(&mut map)?;
2668                            }
2669                            _ => {}
2670                        }
2671                    }
2672
2673                    Ok(CloudWatchLoggingOption {
2674                        log_stream_arn: log_stream_arn.ok_or(::serde::de::Error::missing_field("LogStreamARN"))?,
2675                    })
2676                }
2677            }
2678
2679            d.deserialize_map(Visitor)
2680        }
2681    }
2682}
2683
2684pub mod application_output {
2685    //! Property types for the `ApplicationOutput` resource.
2686
2687    /// The [`AWS::KinesisAnalyticsV2::ApplicationOutput.DestinationSchema`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-destinationschema.html) property type.
2688    #[derive(Debug, Default)]
2689    pub struct DestinationSchema {
2690        /// Property [`RecordFormatType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-destinationschema.html#cfn-kinesisanalyticsv2-applicationoutput-destinationschema-recordformattype).
2691        ///
2692        /// Update type: _Mutable_.
2693        /// AWS CloudFormation doesn't replace the resource when you change this property.
2694        pub record_format_type: Option<::Value<String>>,
2695    }
2696
2697    impl ::codec::SerializeValue for DestinationSchema {
2698        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2699            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2700            if let Some(ref record_format_type) = self.record_format_type {
2701                ::serde::ser::SerializeMap::serialize_entry(&mut map, "RecordFormatType", record_format_type)?;
2702            }
2703            ::serde::ser::SerializeMap::end(map)
2704        }
2705    }
2706
2707    impl ::codec::DeserializeValue for DestinationSchema {
2708        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<DestinationSchema, D::Error> {
2709            struct Visitor;
2710
2711            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2712                type Value = DestinationSchema;
2713
2714                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2715                    write!(f, "a struct of type DestinationSchema")
2716                }
2717
2718                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2719                    let mut record_format_type: Option<::Value<String>> = None;
2720
2721                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2722                        match __cfn_key.as_ref() {
2723                            "RecordFormatType" => {
2724                                record_format_type = ::serde::de::MapAccess::next_value(&mut map)?;
2725                            }
2726                            _ => {}
2727                        }
2728                    }
2729
2730                    Ok(DestinationSchema {
2731                        record_format_type: record_format_type,
2732                    })
2733                }
2734            }
2735
2736            d.deserialize_map(Visitor)
2737        }
2738    }
2739
2740    /// The [`AWS::KinesisAnalyticsV2::ApplicationOutput.KinesisFirehoseOutput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-kinesisfirehoseoutput.html) property type.
2741    #[derive(Debug, Default)]
2742    pub struct KinesisFirehoseOutput {
2743        /// Property [`ResourceARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-kinesisfirehoseoutput.html#cfn-kinesisanalyticsv2-applicationoutput-kinesisfirehoseoutput-resourcearn).
2744        ///
2745        /// Update type: _Mutable_.
2746        /// AWS CloudFormation doesn't replace the resource when you change this property.
2747        pub resource_arn: ::Value<String>,
2748    }
2749
2750    impl ::codec::SerializeValue for KinesisFirehoseOutput {
2751        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2752            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2753            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceARN", &self.resource_arn)?;
2754            ::serde::ser::SerializeMap::end(map)
2755        }
2756    }
2757
2758    impl ::codec::DeserializeValue for KinesisFirehoseOutput {
2759        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<KinesisFirehoseOutput, D::Error> {
2760            struct Visitor;
2761
2762            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2763                type Value = KinesisFirehoseOutput;
2764
2765                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2766                    write!(f, "a struct of type KinesisFirehoseOutput")
2767                }
2768
2769                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2770                    let mut resource_arn: Option<::Value<String>> = None;
2771
2772                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2773                        match __cfn_key.as_ref() {
2774                            "ResourceARN" => {
2775                                resource_arn = ::serde::de::MapAccess::next_value(&mut map)?;
2776                            }
2777                            _ => {}
2778                        }
2779                    }
2780
2781                    Ok(KinesisFirehoseOutput {
2782                        resource_arn: resource_arn.ok_or(::serde::de::Error::missing_field("ResourceARN"))?,
2783                    })
2784                }
2785            }
2786
2787            d.deserialize_map(Visitor)
2788        }
2789    }
2790
2791    /// The [`AWS::KinesisAnalyticsV2::ApplicationOutput.KinesisStreamsOutput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-kinesisstreamsoutput.html) property type.
2792    #[derive(Debug, Default)]
2793    pub struct KinesisStreamsOutput {
2794        /// Property [`ResourceARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-kinesisstreamsoutput.html#cfn-kinesisanalyticsv2-applicationoutput-kinesisstreamsoutput-resourcearn).
2795        ///
2796        /// Update type: _Mutable_.
2797        /// AWS CloudFormation doesn't replace the resource when you change this property.
2798        pub resource_arn: ::Value<String>,
2799    }
2800
2801    impl ::codec::SerializeValue for KinesisStreamsOutput {
2802        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2803            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2804            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceARN", &self.resource_arn)?;
2805            ::serde::ser::SerializeMap::end(map)
2806        }
2807    }
2808
2809    impl ::codec::DeserializeValue for KinesisStreamsOutput {
2810        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<KinesisStreamsOutput, D::Error> {
2811            struct Visitor;
2812
2813            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2814                type Value = KinesisStreamsOutput;
2815
2816                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2817                    write!(f, "a struct of type KinesisStreamsOutput")
2818                }
2819
2820                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2821                    let mut resource_arn: Option<::Value<String>> = None;
2822
2823                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2824                        match __cfn_key.as_ref() {
2825                            "ResourceARN" => {
2826                                resource_arn = ::serde::de::MapAccess::next_value(&mut map)?;
2827                            }
2828                            _ => {}
2829                        }
2830                    }
2831
2832                    Ok(KinesisStreamsOutput {
2833                        resource_arn: resource_arn.ok_or(::serde::de::Error::missing_field("ResourceARN"))?,
2834                    })
2835                }
2836            }
2837
2838            d.deserialize_map(Visitor)
2839        }
2840    }
2841
2842    /// The [`AWS::KinesisAnalyticsV2::ApplicationOutput.LambdaOutput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-lambdaoutput.html) property type.
2843    #[derive(Debug, Default)]
2844    pub struct LambdaOutput {
2845        /// Property [`ResourceARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-lambdaoutput.html#cfn-kinesisanalyticsv2-applicationoutput-lambdaoutput-resourcearn).
2846        ///
2847        /// Update type: _Mutable_.
2848        /// AWS CloudFormation doesn't replace the resource when you change this property.
2849        pub resource_arn: ::Value<String>,
2850    }
2851
2852    impl ::codec::SerializeValue for LambdaOutput {
2853        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2854            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2855            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ResourceARN", &self.resource_arn)?;
2856            ::serde::ser::SerializeMap::end(map)
2857        }
2858    }
2859
2860    impl ::codec::DeserializeValue for LambdaOutput {
2861        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<LambdaOutput, D::Error> {
2862            struct Visitor;
2863
2864            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2865                type Value = LambdaOutput;
2866
2867                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2868                    write!(f, "a struct of type LambdaOutput")
2869                }
2870
2871                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2872                    let mut resource_arn: Option<::Value<String>> = None;
2873
2874                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2875                        match __cfn_key.as_ref() {
2876                            "ResourceARN" => {
2877                                resource_arn = ::serde::de::MapAccess::next_value(&mut map)?;
2878                            }
2879                            _ => {}
2880                        }
2881                    }
2882
2883                    Ok(LambdaOutput {
2884                        resource_arn: resource_arn.ok_or(::serde::de::Error::missing_field("ResourceARN"))?,
2885                    })
2886                }
2887            }
2888
2889            d.deserialize_map(Visitor)
2890        }
2891    }
2892
2893    /// The [`AWS::KinesisAnalyticsV2::ApplicationOutput.Output`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-output.html) property type.
2894    #[derive(Debug, Default)]
2895    pub struct Output {
2896        /// Property [`DestinationSchema`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-output.html#cfn-kinesisanalyticsv2-applicationoutput-output-destinationschema).
2897        ///
2898        /// Update type: _Mutable_.
2899        /// AWS CloudFormation doesn't replace the resource when you change this property.
2900        pub destination_schema: ::Value<DestinationSchema>,
2901        /// Property [`KinesisFirehoseOutput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-output.html#cfn-kinesisanalyticsv2-applicationoutput-output-kinesisfirehoseoutput).
2902        ///
2903        /// Update type: _Mutable_.
2904        /// AWS CloudFormation doesn't replace the resource when you change this property.
2905        pub kinesis_firehose_output: Option<::Value<KinesisFirehoseOutput>>,
2906        /// Property [`KinesisStreamsOutput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-output.html#cfn-kinesisanalyticsv2-applicationoutput-output-kinesisstreamsoutput).
2907        ///
2908        /// Update type: _Mutable_.
2909        /// AWS CloudFormation doesn't replace the resource when you change this property.
2910        pub kinesis_streams_output: Option<::Value<KinesisStreamsOutput>>,
2911        /// Property [`LambdaOutput`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-output.html#cfn-kinesisanalyticsv2-applicationoutput-output-lambdaoutput).
2912        ///
2913        /// Update type: _Mutable_.
2914        /// AWS CloudFormation doesn't replace the resource when you change this property.
2915        pub lambda_output: Option<::Value<LambdaOutput>>,
2916        /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationoutput-output.html#cfn-kinesisanalyticsv2-applicationoutput-output-name).
2917        ///
2918        /// Update type: _Immutable_.
2919        /// AWS CloudFormation replaces the resource when you change this property.
2920        pub name: Option<::Value<String>>,
2921    }
2922
2923    impl ::codec::SerializeValue for Output {
2924        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2925            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2926            ::serde::ser::SerializeMap::serialize_entry(&mut map, "DestinationSchema", &self.destination_schema)?;
2927            if let Some(ref kinesis_firehose_output) = self.kinesis_firehose_output {
2928                ::serde::ser::SerializeMap::serialize_entry(&mut map, "KinesisFirehoseOutput", kinesis_firehose_output)?;
2929            }
2930            if let Some(ref kinesis_streams_output) = self.kinesis_streams_output {
2931                ::serde::ser::SerializeMap::serialize_entry(&mut map, "KinesisStreamsOutput", kinesis_streams_output)?;
2932            }
2933            if let Some(ref lambda_output) = self.lambda_output {
2934                ::serde::ser::SerializeMap::serialize_entry(&mut map, "LambdaOutput", lambda_output)?;
2935            }
2936            if let Some(ref name) = self.name {
2937                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?;
2938            }
2939            ::serde::ser::SerializeMap::end(map)
2940        }
2941    }
2942
2943    impl ::codec::DeserializeValue for Output {
2944        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<Output, D::Error> {
2945            struct Visitor;
2946
2947            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2948                type Value = Output;
2949
2950                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2951                    write!(f, "a struct of type Output")
2952                }
2953
2954                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2955                    let mut destination_schema: Option<::Value<DestinationSchema>> = None;
2956                    let mut kinesis_firehose_output: Option<::Value<KinesisFirehoseOutput>> = None;
2957                    let mut kinesis_streams_output: Option<::Value<KinesisStreamsOutput>> = None;
2958                    let mut lambda_output: Option<::Value<LambdaOutput>> = None;
2959                    let mut name: Option<::Value<String>> = None;
2960
2961                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2962                        match __cfn_key.as_ref() {
2963                            "DestinationSchema" => {
2964                                destination_schema = ::serde::de::MapAccess::next_value(&mut map)?;
2965                            }
2966                            "KinesisFirehoseOutput" => {
2967                                kinesis_firehose_output = ::serde::de::MapAccess::next_value(&mut map)?;
2968                            }
2969                            "KinesisStreamsOutput" => {
2970                                kinesis_streams_output = ::serde::de::MapAccess::next_value(&mut map)?;
2971                            }
2972                            "LambdaOutput" => {
2973                                lambda_output = ::serde::de::MapAccess::next_value(&mut map)?;
2974                            }
2975                            "Name" => {
2976                                name = ::serde::de::MapAccess::next_value(&mut map)?;
2977                            }
2978                            _ => {}
2979                        }
2980                    }
2981
2982                    Ok(Output {
2983                        destination_schema: destination_schema.ok_or(::serde::de::Error::missing_field("DestinationSchema"))?,
2984                        kinesis_firehose_output: kinesis_firehose_output,
2985                        kinesis_streams_output: kinesis_streams_output,
2986                        lambda_output: lambda_output,
2987                        name: name,
2988                    })
2989                }
2990            }
2991
2992            d.deserialize_map(Visitor)
2993        }
2994    }
2995}
2996
2997pub mod application_reference_data_source {
2998    //! Property types for the `ApplicationReferenceDataSource` resource.
2999
3000    /// The [`AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.CSVMappingParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-csvmappingparameters.html) property type.
3001    #[derive(Debug, Default)]
3002    pub struct CSVMappingParameters {
3003        /// Property [`RecordColumnDelimiter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-csvmappingparameters.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-csvmappingparameters-recordcolumndelimiter).
3004        ///
3005        /// Update type: _Mutable_.
3006        /// AWS CloudFormation doesn't replace the resource when you change this property.
3007        pub record_column_delimiter: ::Value<String>,
3008        /// Property [`RecordRowDelimiter`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-csvmappingparameters.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-csvmappingparameters-recordrowdelimiter).
3009        ///
3010        /// Update type: _Mutable_.
3011        /// AWS CloudFormation doesn't replace the resource when you change this property.
3012        pub record_row_delimiter: ::Value<String>,
3013    }
3014
3015    impl ::codec::SerializeValue for CSVMappingParameters {
3016        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
3017            let mut map = ::serde::Serializer::serialize_map(s, None)?;
3018            ::serde::ser::SerializeMap::serialize_entry(&mut map, "RecordColumnDelimiter", &self.record_column_delimiter)?;
3019            ::serde::ser::SerializeMap::serialize_entry(&mut map, "RecordRowDelimiter", &self.record_row_delimiter)?;
3020            ::serde::ser::SerializeMap::end(map)
3021        }
3022    }
3023
3024    impl ::codec::DeserializeValue for CSVMappingParameters {
3025        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<CSVMappingParameters, D::Error> {
3026            struct Visitor;
3027
3028            impl<'de> ::serde::de::Visitor<'de> for Visitor {
3029                type Value = CSVMappingParameters;
3030
3031                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
3032                    write!(f, "a struct of type CSVMappingParameters")
3033                }
3034
3035                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
3036                    let mut record_column_delimiter: Option<::Value<String>> = None;
3037                    let mut record_row_delimiter: Option<::Value<String>> = None;
3038
3039                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
3040                        match __cfn_key.as_ref() {
3041                            "RecordColumnDelimiter" => {
3042                                record_column_delimiter = ::serde::de::MapAccess::next_value(&mut map)?;
3043                            }
3044                            "RecordRowDelimiter" => {
3045                                record_row_delimiter = ::serde::de::MapAccess::next_value(&mut map)?;
3046                            }
3047                            _ => {}
3048                        }
3049                    }
3050
3051                    Ok(CSVMappingParameters {
3052                        record_column_delimiter: record_column_delimiter.ok_or(::serde::de::Error::missing_field("RecordColumnDelimiter"))?,
3053                        record_row_delimiter: record_row_delimiter.ok_or(::serde::de::Error::missing_field("RecordRowDelimiter"))?,
3054                    })
3055                }
3056            }
3057
3058            d.deserialize_map(Visitor)
3059        }
3060    }
3061
3062    /// The [`AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.JSONMappingParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-jsonmappingparameters.html) property type.
3063    #[derive(Debug, Default)]
3064    pub struct JSONMappingParameters {
3065        /// Property [`RecordRowPath`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-jsonmappingparameters.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-jsonmappingparameters-recordrowpath).
3066        ///
3067        /// Update type: _Mutable_.
3068        /// AWS CloudFormation doesn't replace the resource when you change this property.
3069        pub record_row_path: ::Value<String>,
3070    }
3071
3072    impl ::codec::SerializeValue for JSONMappingParameters {
3073        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
3074            let mut map = ::serde::Serializer::serialize_map(s, None)?;
3075            ::serde::ser::SerializeMap::serialize_entry(&mut map, "RecordRowPath", &self.record_row_path)?;
3076            ::serde::ser::SerializeMap::end(map)
3077        }
3078    }
3079
3080    impl ::codec::DeserializeValue for JSONMappingParameters {
3081        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<JSONMappingParameters, D::Error> {
3082            struct Visitor;
3083
3084            impl<'de> ::serde::de::Visitor<'de> for Visitor {
3085                type Value = JSONMappingParameters;
3086
3087                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
3088                    write!(f, "a struct of type JSONMappingParameters")
3089                }
3090
3091                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
3092                    let mut record_row_path: Option<::Value<String>> = None;
3093
3094                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
3095                        match __cfn_key.as_ref() {
3096                            "RecordRowPath" => {
3097                                record_row_path = ::serde::de::MapAccess::next_value(&mut map)?;
3098                            }
3099                            _ => {}
3100                        }
3101                    }
3102
3103                    Ok(JSONMappingParameters {
3104                        record_row_path: record_row_path.ok_or(::serde::de::Error::missing_field("RecordRowPath"))?,
3105                    })
3106                }
3107            }
3108
3109            d.deserialize_map(Visitor)
3110        }
3111    }
3112
3113    /// The [`AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.MappingParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-mappingparameters.html) property type.
3114    #[derive(Debug, Default)]
3115    pub struct MappingParameters {
3116        /// Property [`CSVMappingParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-mappingparameters.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-mappingparameters-csvmappingparameters).
3117        ///
3118        /// Update type: _Mutable_.
3119        /// AWS CloudFormation doesn't replace the resource when you change this property.
3120        pub csv_mapping_parameters: Option<::Value<CSVMappingParameters>>,
3121        /// Property [`JSONMappingParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-mappingparameters.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-mappingparameters-jsonmappingparameters).
3122        ///
3123        /// Update type: _Mutable_.
3124        /// AWS CloudFormation doesn't replace the resource when you change this property.
3125        pub json_mapping_parameters: Option<::Value<JSONMappingParameters>>,
3126    }
3127
3128    impl ::codec::SerializeValue for MappingParameters {
3129        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
3130            let mut map = ::serde::Serializer::serialize_map(s, None)?;
3131            if let Some(ref csv_mapping_parameters) = self.csv_mapping_parameters {
3132                ::serde::ser::SerializeMap::serialize_entry(&mut map, "CSVMappingParameters", csv_mapping_parameters)?;
3133            }
3134            if let Some(ref json_mapping_parameters) = self.json_mapping_parameters {
3135                ::serde::ser::SerializeMap::serialize_entry(&mut map, "JSONMappingParameters", json_mapping_parameters)?;
3136            }
3137            ::serde::ser::SerializeMap::end(map)
3138        }
3139    }
3140
3141    impl ::codec::DeserializeValue for MappingParameters {
3142        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<MappingParameters, D::Error> {
3143            struct Visitor;
3144
3145            impl<'de> ::serde::de::Visitor<'de> for Visitor {
3146                type Value = MappingParameters;
3147
3148                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
3149                    write!(f, "a struct of type MappingParameters")
3150                }
3151
3152                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
3153                    let mut csv_mapping_parameters: Option<::Value<CSVMappingParameters>> = None;
3154                    let mut json_mapping_parameters: Option<::Value<JSONMappingParameters>> = None;
3155
3156                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
3157                        match __cfn_key.as_ref() {
3158                            "CSVMappingParameters" => {
3159                                csv_mapping_parameters = ::serde::de::MapAccess::next_value(&mut map)?;
3160                            }
3161                            "JSONMappingParameters" => {
3162                                json_mapping_parameters = ::serde::de::MapAccess::next_value(&mut map)?;
3163                            }
3164                            _ => {}
3165                        }
3166                    }
3167
3168                    Ok(MappingParameters {
3169                        csv_mapping_parameters: csv_mapping_parameters,
3170                        json_mapping_parameters: json_mapping_parameters,
3171                    })
3172                }
3173            }
3174
3175            d.deserialize_map(Visitor)
3176        }
3177    }
3178
3179    /// The [`AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.RecordColumn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-recordcolumn.html) property type.
3180    #[derive(Debug, Default)]
3181    pub struct RecordColumn {
3182        /// Property [`Mapping`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-recordcolumn.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-recordcolumn-mapping).
3183        ///
3184        /// Update type: _Mutable_.
3185        /// AWS CloudFormation doesn't replace the resource when you change this property.
3186        pub mapping: Option<::Value<String>>,
3187        /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-recordcolumn.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-recordcolumn-name).
3188        ///
3189        /// Update type: _Mutable_.
3190        /// AWS CloudFormation doesn't replace the resource when you change this property.
3191        pub name: ::Value<String>,
3192        /// Property [`SqlType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-recordcolumn.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-recordcolumn-sqltype).
3193        ///
3194        /// Update type: _Mutable_.
3195        /// AWS CloudFormation doesn't replace the resource when you change this property.
3196        pub sql_type: ::Value<String>,
3197    }
3198
3199    impl ::codec::SerializeValue for RecordColumn {
3200        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
3201            let mut map = ::serde::Serializer::serialize_map(s, None)?;
3202            if let Some(ref mapping) = self.mapping {
3203                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Mapping", mapping)?;
3204            }
3205            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?;
3206            ::serde::ser::SerializeMap::serialize_entry(&mut map, "SqlType", &self.sql_type)?;
3207            ::serde::ser::SerializeMap::end(map)
3208        }
3209    }
3210
3211    impl ::codec::DeserializeValue for RecordColumn {
3212        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<RecordColumn, D::Error> {
3213            struct Visitor;
3214
3215            impl<'de> ::serde::de::Visitor<'de> for Visitor {
3216                type Value = RecordColumn;
3217
3218                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
3219                    write!(f, "a struct of type RecordColumn")
3220                }
3221
3222                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
3223                    let mut mapping: Option<::Value<String>> = None;
3224                    let mut name: Option<::Value<String>> = None;
3225                    let mut sql_type: Option<::Value<String>> = None;
3226
3227                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
3228                        match __cfn_key.as_ref() {
3229                            "Mapping" => {
3230                                mapping = ::serde::de::MapAccess::next_value(&mut map)?;
3231                            }
3232                            "Name" => {
3233                                name = ::serde::de::MapAccess::next_value(&mut map)?;
3234                            }
3235                            "SqlType" => {
3236                                sql_type = ::serde::de::MapAccess::next_value(&mut map)?;
3237                            }
3238                            _ => {}
3239                        }
3240                    }
3241
3242                    Ok(RecordColumn {
3243                        mapping: mapping,
3244                        name: name.ok_or(::serde::de::Error::missing_field("Name"))?,
3245                        sql_type: sql_type.ok_or(::serde::de::Error::missing_field("SqlType"))?,
3246                    })
3247                }
3248            }
3249
3250            d.deserialize_map(Visitor)
3251        }
3252    }
3253
3254    /// The [`AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.RecordFormat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-recordformat.html) property type.
3255    #[derive(Debug, Default)]
3256    pub struct RecordFormat {
3257        /// Property [`MappingParameters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-recordformat.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-recordformat-mappingparameters).
3258        ///
3259        /// Update type: _Mutable_.
3260        /// AWS CloudFormation doesn't replace the resource when you change this property.
3261        pub mapping_parameters: Option<::Value<MappingParameters>>,
3262        /// Property [`RecordFormatType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-recordformat.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-recordformat-recordformattype).
3263        ///
3264        /// Update type: _Mutable_.
3265        /// AWS CloudFormation doesn't replace the resource when you change this property.
3266        pub record_format_type: ::Value<String>,
3267    }
3268
3269    impl ::codec::SerializeValue for RecordFormat {
3270        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
3271            let mut map = ::serde::Serializer::serialize_map(s, None)?;
3272            if let Some(ref mapping_parameters) = self.mapping_parameters {
3273                ::serde::ser::SerializeMap::serialize_entry(&mut map, "MappingParameters", mapping_parameters)?;
3274            }
3275            ::serde::ser::SerializeMap::serialize_entry(&mut map, "RecordFormatType", &self.record_format_type)?;
3276            ::serde::ser::SerializeMap::end(map)
3277        }
3278    }
3279
3280    impl ::codec::DeserializeValue for RecordFormat {
3281        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<RecordFormat, D::Error> {
3282            struct Visitor;
3283
3284            impl<'de> ::serde::de::Visitor<'de> for Visitor {
3285                type Value = RecordFormat;
3286
3287                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
3288                    write!(f, "a struct of type RecordFormat")
3289                }
3290
3291                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
3292                    let mut mapping_parameters: Option<::Value<MappingParameters>> = None;
3293                    let mut record_format_type: Option<::Value<String>> = None;
3294
3295                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
3296                        match __cfn_key.as_ref() {
3297                            "MappingParameters" => {
3298                                mapping_parameters = ::serde::de::MapAccess::next_value(&mut map)?;
3299                            }
3300                            "RecordFormatType" => {
3301                                record_format_type = ::serde::de::MapAccess::next_value(&mut map)?;
3302                            }
3303                            _ => {}
3304                        }
3305                    }
3306
3307                    Ok(RecordFormat {
3308                        mapping_parameters: mapping_parameters,
3309                        record_format_type: record_format_type.ok_or(::serde::de::Error::missing_field("RecordFormatType"))?,
3310                    })
3311                }
3312            }
3313
3314            d.deserialize_map(Visitor)
3315        }
3316    }
3317
3318    /// The [`AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.ReferenceDataSource`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-referencedatasource.html) property type.
3319    #[derive(Debug, Default)]
3320    pub struct ReferenceDataSource {
3321        /// Property [`ReferenceSchema`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-referencedatasource.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-referencedatasource-referenceschema).
3322        ///
3323        /// Update type: _Mutable_.
3324        /// AWS CloudFormation doesn't replace the resource when you change this property.
3325        pub reference_schema: ::Value<ReferenceSchema>,
3326        /// Property [`S3ReferenceDataSource`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-referencedatasource.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-referencedatasource-s3referencedatasource).
3327        ///
3328        /// Update type: _Mutable_.
3329        /// AWS CloudFormation doesn't replace the resource when you change this property.
3330        pub s3_reference_data_source: Option<::Value<S3ReferenceDataSource>>,
3331        /// Property [`TableName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-referencedatasource.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-referencedatasource-tablename).
3332        ///
3333        /// Update type: _Immutable_.
3334        /// AWS CloudFormation replaces the resource when you change this property.
3335        pub table_name: Option<::Value<String>>,
3336    }
3337
3338    impl ::codec::SerializeValue for ReferenceDataSource {
3339        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
3340            let mut map = ::serde::Serializer::serialize_map(s, None)?;
3341            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ReferenceSchema", &self.reference_schema)?;
3342            if let Some(ref s3_reference_data_source) = self.s3_reference_data_source {
3343                ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3ReferenceDataSource", s3_reference_data_source)?;
3344            }
3345            if let Some(ref table_name) = self.table_name {
3346                ::serde::ser::SerializeMap::serialize_entry(&mut map, "TableName", table_name)?;
3347            }
3348            ::serde::ser::SerializeMap::end(map)
3349        }
3350    }
3351
3352    impl ::codec::DeserializeValue for ReferenceDataSource {
3353        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ReferenceDataSource, D::Error> {
3354            struct Visitor;
3355
3356            impl<'de> ::serde::de::Visitor<'de> for Visitor {
3357                type Value = ReferenceDataSource;
3358
3359                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
3360                    write!(f, "a struct of type ReferenceDataSource")
3361                }
3362
3363                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
3364                    let mut reference_schema: Option<::Value<ReferenceSchema>> = None;
3365                    let mut s3_reference_data_source: Option<::Value<S3ReferenceDataSource>> = None;
3366                    let mut table_name: Option<::Value<String>> = None;
3367
3368                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
3369                        match __cfn_key.as_ref() {
3370                            "ReferenceSchema" => {
3371                                reference_schema = ::serde::de::MapAccess::next_value(&mut map)?;
3372                            }
3373                            "S3ReferenceDataSource" => {
3374                                s3_reference_data_source = ::serde::de::MapAccess::next_value(&mut map)?;
3375                            }
3376                            "TableName" => {
3377                                table_name = ::serde::de::MapAccess::next_value(&mut map)?;
3378                            }
3379                            _ => {}
3380                        }
3381                    }
3382
3383                    Ok(ReferenceDataSource {
3384                        reference_schema: reference_schema.ok_or(::serde::de::Error::missing_field("ReferenceSchema"))?,
3385                        s3_reference_data_source: s3_reference_data_source,
3386                        table_name: table_name,
3387                    })
3388                }
3389            }
3390
3391            d.deserialize_map(Visitor)
3392        }
3393    }
3394
3395    /// The [`AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.ReferenceSchema`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-referenceschema.html) property type.
3396    #[derive(Debug, Default)]
3397    pub struct ReferenceSchema {
3398        /// Property [`RecordColumns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-referenceschema.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-referenceschema-recordcolumns).
3399        ///
3400        /// Update type: _Mutable_.
3401        /// AWS CloudFormation doesn't replace the resource when you change this property.
3402        pub record_columns: ::ValueList<RecordColumn>,
3403        /// Property [`RecordEncoding`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-referenceschema.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-referenceschema-recordencoding).
3404        ///
3405        /// Update type: _Mutable_.
3406        /// AWS CloudFormation doesn't replace the resource when you change this property.
3407        pub record_encoding: Option<::Value<String>>,
3408        /// Property [`RecordFormat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-referenceschema.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-referenceschema-recordformat).
3409        ///
3410        /// Update type: _Mutable_.
3411        /// AWS CloudFormation doesn't replace the resource when you change this property.
3412        pub record_format: ::Value<RecordFormat>,
3413    }
3414
3415    impl ::codec::SerializeValue for ReferenceSchema {
3416        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
3417            let mut map = ::serde::Serializer::serialize_map(s, None)?;
3418            ::serde::ser::SerializeMap::serialize_entry(&mut map, "RecordColumns", &self.record_columns)?;
3419            if let Some(ref record_encoding) = self.record_encoding {
3420                ::serde::ser::SerializeMap::serialize_entry(&mut map, "RecordEncoding", record_encoding)?;
3421            }
3422            ::serde::ser::SerializeMap::serialize_entry(&mut map, "RecordFormat", &self.record_format)?;
3423            ::serde::ser::SerializeMap::end(map)
3424        }
3425    }
3426
3427    impl ::codec::DeserializeValue for ReferenceSchema {
3428        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ReferenceSchema, D::Error> {
3429            struct Visitor;
3430
3431            impl<'de> ::serde::de::Visitor<'de> for Visitor {
3432                type Value = ReferenceSchema;
3433
3434                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
3435                    write!(f, "a struct of type ReferenceSchema")
3436                }
3437
3438                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
3439                    let mut record_columns: Option<::ValueList<RecordColumn>> = None;
3440                    let mut record_encoding: Option<::Value<String>> = None;
3441                    let mut record_format: Option<::Value<RecordFormat>> = None;
3442
3443                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
3444                        match __cfn_key.as_ref() {
3445                            "RecordColumns" => {
3446                                record_columns = ::serde::de::MapAccess::next_value(&mut map)?;
3447                            }
3448                            "RecordEncoding" => {
3449                                record_encoding = ::serde::de::MapAccess::next_value(&mut map)?;
3450                            }
3451                            "RecordFormat" => {
3452                                record_format = ::serde::de::MapAccess::next_value(&mut map)?;
3453                            }
3454                            _ => {}
3455                        }
3456                    }
3457
3458                    Ok(ReferenceSchema {
3459                        record_columns: record_columns.ok_or(::serde::de::Error::missing_field("RecordColumns"))?,
3460                        record_encoding: record_encoding,
3461                        record_format: record_format.ok_or(::serde::de::Error::missing_field("RecordFormat"))?,
3462                    })
3463                }
3464            }
3465
3466            d.deserialize_map(Visitor)
3467        }
3468    }
3469
3470    /// The [`AWS::KinesisAnalyticsV2::ApplicationReferenceDataSource.S3ReferenceDataSource`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-s3referencedatasource.html) property type.
3471    #[derive(Debug, Default)]
3472    pub struct S3ReferenceDataSource {
3473        /// Property [`BucketARN`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-s3referencedatasource.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-s3referencedatasource-bucketarn).
3474        ///
3475        /// Update type: _Mutable_.
3476        /// AWS CloudFormation doesn't replace the resource when you change this property.
3477        pub bucket_arn: ::Value<String>,
3478        /// Property [`FileKey`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisanalyticsv2-applicationreferencedatasource-s3referencedatasource.html#cfn-kinesisanalyticsv2-applicationreferencedatasource-s3referencedatasource-filekey).
3479        ///
3480        /// Update type: _Mutable_.
3481        /// AWS CloudFormation doesn't replace the resource when you change this property.
3482        pub file_key: ::Value<String>,
3483    }
3484
3485    impl ::codec::SerializeValue for S3ReferenceDataSource {
3486        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
3487            let mut map = ::serde::Serializer::serialize_map(s, None)?;
3488            ::serde::ser::SerializeMap::serialize_entry(&mut map, "BucketARN", &self.bucket_arn)?;
3489            ::serde::ser::SerializeMap::serialize_entry(&mut map, "FileKey", &self.file_key)?;
3490            ::serde::ser::SerializeMap::end(map)
3491        }
3492    }
3493
3494    impl ::codec::DeserializeValue for S3ReferenceDataSource {
3495        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<S3ReferenceDataSource, D::Error> {
3496            struct Visitor;
3497
3498            impl<'de> ::serde::de::Visitor<'de> for Visitor {
3499                type Value = S3ReferenceDataSource;
3500
3501                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
3502                    write!(f, "a struct of type S3ReferenceDataSource")
3503                }
3504
3505                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
3506                    let mut bucket_arn: Option<::Value<String>> = None;
3507                    let mut file_key: Option<::Value<String>> = None;
3508
3509                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
3510                        match __cfn_key.as_ref() {
3511                            "BucketARN" => {
3512                                bucket_arn = ::serde::de::MapAccess::next_value(&mut map)?;
3513                            }
3514                            "FileKey" => {
3515                                file_key = ::serde::de::MapAccess::next_value(&mut map)?;
3516                            }
3517                            _ => {}
3518                        }
3519                    }
3520
3521                    Ok(S3ReferenceDataSource {
3522                        bucket_arn: bucket_arn.ok_or(::serde::de::Error::missing_field("BucketARN"))?,
3523                        file_key: file_key.ok_or(::serde::de::Error::missing_field("FileKey"))?,
3524                    })
3525                }
3526            }
3527
3528            d.deserialize_map(Visitor)
3529        }
3530    }
3531}