cfn/aws/
kinesisfirehose.rs

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