cfn/aws/
kendra.rs

1//! Types for the `Kendra` service.
2
3/// The [`AWS::Kendra::DataSource`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-datasource.html) resource type.
4#[derive(Debug, Default)]
5pub struct DataSource {
6    properties: DataSourceProperties
7}
8
9/// Properties for the `DataSource` resource.
10#[derive(Debug, Default)]
11pub struct DataSourceProperties {
12    /// Property [`DataSourceConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-datasource.html#cfn-kendra-datasource-datasourceconfiguration).
13    ///
14    /// Update type: _Mutable_.
15    /// AWS CloudFormation doesn't replace the resource when you change this property.
16    pub data_source_configuration: Option<::Value<self::data_source::DataSourceConfiguration>>,
17    /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-datasource.html#cfn-kendra-datasource-description).
18    ///
19    /// Update type: _Mutable_.
20    /// AWS CloudFormation doesn't replace the resource when you change this property.
21    pub description: Option<::Value<String>>,
22    /// Property [`IndexId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-datasource.html#cfn-kendra-datasource-indexid).
23    ///
24    /// Update type: _Mutable_.
25    /// AWS CloudFormation doesn't replace the resource when you change this property.
26    pub index_id: ::Value<String>,
27    /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-datasource.html#cfn-kendra-datasource-name).
28    ///
29    /// Update type: _Mutable_.
30    /// AWS CloudFormation doesn't replace the resource when you change this property.
31    pub name: ::Value<String>,
32    /// Property [`RoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-datasource.html#cfn-kendra-datasource-rolearn).
33    ///
34    /// Update type: _Mutable_.
35    /// AWS CloudFormation doesn't replace the resource when you change this property.
36    pub role_arn: Option<::Value<String>>,
37    /// Property [`Schedule`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-datasource.html#cfn-kendra-datasource-schedule).
38    ///
39    /// Update type: _Mutable_.
40    /// AWS CloudFormation doesn't replace the resource when you change this property.
41    pub schedule: Option<::Value<String>>,
42    /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-datasource.html#cfn-kendra-datasource-tags).
43    ///
44    /// Update type: _Mutable_.
45    /// AWS CloudFormation doesn't replace the resource when you change this property.
46    pub tags: Option<::ValueList<::Tag>>,
47    /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-datasource.html#cfn-kendra-datasource-type).
48    ///
49    /// Update type: _Immutable_.
50    /// AWS CloudFormation replaces the resource when you change this property.
51    pub r#type: ::Value<String>,
52}
53
54impl ::serde::Serialize for DataSourceProperties {
55    fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
56        let mut map = ::serde::Serializer::serialize_map(s, None)?;
57        if let Some(ref data_source_configuration) = self.data_source_configuration {
58            ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataSourceConfiguration", data_source_configuration)?;
59        }
60        if let Some(ref description) = self.description {
61            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?;
62        }
63        ::serde::ser::SerializeMap::serialize_entry(&mut map, "IndexId", &self.index_id)?;
64        ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?;
65        if let Some(ref role_arn) = self.role_arn {
66            ::serde::ser::SerializeMap::serialize_entry(&mut map, "RoleArn", role_arn)?;
67        }
68        if let Some(ref schedule) = self.schedule {
69            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Schedule", schedule)?;
70        }
71        if let Some(ref tags) = self.tags {
72            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?;
73        }
74        ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?;
75        ::serde::ser::SerializeMap::end(map)
76    }
77}
78
79impl<'de> ::serde::Deserialize<'de> for DataSourceProperties {
80    fn deserialize<D: ::serde::Deserializer<'de>>(d: D) -> Result<DataSourceProperties, D::Error> {
81        struct Visitor;
82
83        impl<'de> ::serde::de::Visitor<'de> for Visitor {
84            type Value = DataSourceProperties;
85
86            fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
87                write!(f, "a struct of type DataSourceProperties")
88            }
89
90            fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
91                let mut data_source_configuration: Option<::Value<self::data_source::DataSourceConfiguration>> = None;
92                let mut description: Option<::Value<String>> = None;
93                let mut index_id: Option<::Value<String>> = None;
94                let mut name: Option<::Value<String>> = None;
95                let mut role_arn: Option<::Value<String>> = None;
96                let mut schedule: Option<::Value<String>> = None;
97                let mut tags: Option<::ValueList<::Tag>> = None;
98                let mut r#type: Option<::Value<String>> = None;
99
100                while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
101                    match __cfn_key.as_ref() {
102                        "DataSourceConfiguration" => {
103                            data_source_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
104                        }
105                        "Description" => {
106                            description = ::serde::de::MapAccess::next_value(&mut map)?;
107                        }
108                        "IndexId" => {
109                            index_id = ::serde::de::MapAccess::next_value(&mut map)?;
110                        }
111                        "Name" => {
112                            name = ::serde::de::MapAccess::next_value(&mut map)?;
113                        }
114                        "RoleArn" => {
115                            role_arn = ::serde::de::MapAccess::next_value(&mut map)?;
116                        }
117                        "Schedule" => {
118                            schedule = ::serde::de::MapAccess::next_value(&mut map)?;
119                        }
120                        "Tags" => {
121                            tags = ::serde::de::MapAccess::next_value(&mut map)?;
122                        }
123                        "Type" => {
124                            r#type = ::serde::de::MapAccess::next_value(&mut map)?;
125                        }
126                        _ => {}
127                    }
128                }
129
130                Ok(DataSourceProperties {
131                    data_source_configuration: data_source_configuration,
132                    description: description,
133                    index_id: index_id.ok_or(::serde::de::Error::missing_field("IndexId"))?,
134                    name: name.ok_or(::serde::de::Error::missing_field("Name"))?,
135                    role_arn: role_arn,
136                    schedule: schedule,
137                    tags: tags,
138                    r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?,
139                })
140            }
141        }
142
143        d.deserialize_map(Visitor)
144    }
145}
146
147impl ::Resource for DataSource {
148    type Properties = DataSourceProperties;
149    const TYPE: &'static str = "AWS::Kendra::DataSource";
150    fn properties(&self) -> &DataSourceProperties {
151        &self.properties
152    }
153    fn properties_mut(&mut self) -> &mut DataSourceProperties {
154        &mut self.properties
155    }
156}
157
158impl ::private::Sealed for DataSource {}
159
160impl From<DataSourceProperties> for DataSource {
161    fn from(properties: DataSourceProperties) -> DataSource {
162        DataSource { properties }
163    }
164}
165
166/// The [`AWS::Kendra::Faq`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-faq.html) resource type.
167#[derive(Debug, Default)]
168pub struct Faq {
169    properties: FaqProperties
170}
171
172/// Properties for the `Faq` resource.
173#[derive(Debug, Default)]
174pub struct FaqProperties {
175    /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-faq.html#cfn-kendra-faq-description).
176    ///
177    /// Update type: _Immutable_.
178    /// AWS CloudFormation replaces the resource when you change this property.
179    pub description: Option<::Value<String>>,
180    /// Property [`FileFormat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-faq.html#cfn-kendra-faq-fileformat).
181    ///
182    /// Update type: _Immutable_.
183    /// AWS CloudFormation replaces the resource when you change this property.
184    pub file_format: Option<::Value<String>>,
185    /// Property [`IndexId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-faq.html#cfn-kendra-faq-indexid).
186    ///
187    /// Update type: _Immutable_.
188    /// AWS CloudFormation replaces the resource when you change this property.
189    pub index_id: ::Value<String>,
190    /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-faq.html#cfn-kendra-faq-name).
191    ///
192    /// Update type: _Immutable_.
193    /// AWS CloudFormation replaces the resource when you change this property.
194    pub name: ::Value<String>,
195    /// Property [`RoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-faq.html#cfn-kendra-faq-rolearn).
196    ///
197    /// Update type: _Immutable_.
198    /// AWS CloudFormation replaces the resource when you change this property.
199    pub role_arn: ::Value<String>,
200    /// Property [`S3Path`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-faq.html#cfn-kendra-faq-s3path).
201    ///
202    /// Update type: _Immutable_.
203    /// AWS CloudFormation replaces the resource when you change this property.
204    pub s3_path: ::Value<self::faq::S3Path>,
205    /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-faq.html#cfn-kendra-faq-tags).
206    ///
207    /// Update type: _Mutable_.
208    /// AWS CloudFormation doesn't replace the resource when you change this property.
209    pub tags: Option<::ValueList<::Tag>>,
210}
211
212impl ::serde::Serialize for FaqProperties {
213    fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
214        let mut map = ::serde::Serializer::serialize_map(s, None)?;
215        if let Some(ref description) = self.description {
216            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?;
217        }
218        if let Some(ref file_format) = self.file_format {
219            ::serde::ser::SerializeMap::serialize_entry(&mut map, "FileFormat", file_format)?;
220        }
221        ::serde::ser::SerializeMap::serialize_entry(&mut map, "IndexId", &self.index_id)?;
222        ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?;
223        ::serde::ser::SerializeMap::serialize_entry(&mut map, "RoleArn", &self.role_arn)?;
224        ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3Path", &self.s3_path)?;
225        if let Some(ref tags) = self.tags {
226            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?;
227        }
228        ::serde::ser::SerializeMap::end(map)
229    }
230}
231
232impl<'de> ::serde::Deserialize<'de> for FaqProperties {
233    fn deserialize<D: ::serde::Deserializer<'de>>(d: D) -> Result<FaqProperties, D::Error> {
234        struct Visitor;
235
236        impl<'de> ::serde::de::Visitor<'de> for Visitor {
237            type Value = FaqProperties;
238
239            fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
240                write!(f, "a struct of type FaqProperties")
241            }
242
243            fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
244                let mut description: Option<::Value<String>> = None;
245                let mut file_format: Option<::Value<String>> = None;
246                let mut index_id: Option<::Value<String>> = None;
247                let mut name: Option<::Value<String>> = None;
248                let mut role_arn: Option<::Value<String>> = None;
249                let mut s3_path: Option<::Value<self::faq::S3Path>> = None;
250                let mut tags: Option<::ValueList<::Tag>> = None;
251
252                while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
253                    match __cfn_key.as_ref() {
254                        "Description" => {
255                            description = ::serde::de::MapAccess::next_value(&mut map)?;
256                        }
257                        "FileFormat" => {
258                            file_format = ::serde::de::MapAccess::next_value(&mut map)?;
259                        }
260                        "IndexId" => {
261                            index_id = ::serde::de::MapAccess::next_value(&mut map)?;
262                        }
263                        "Name" => {
264                            name = ::serde::de::MapAccess::next_value(&mut map)?;
265                        }
266                        "RoleArn" => {
267                            role_arn = ::serde::de::MapAccess::next_value(&mut map)?;
268                        }
269                        "S3Path" => {
270                            s3_path = ::serde::de::MapAccess::next_value(&mut map)?;
271                        }
272                        "Tags" => {
273                            tags = ::serde::de::MapAccess::next_value(&mut map)?;
274                        }
275                        _ => {}
276                    }
277                }
278
279                Ok(FaqProperties {
280                    description: description,
281                    file_format: file_format,
282                    index_id: index_id.ok_or(::serde::de::Error::missing_field("IndexId"))?,
283                    name: name.ok_or(::serde::de::Error::missing_field("Name"))?,
284                    role_arn: role_arn.ok_or(::serde::de::Error::missing_field("RoleArn"))?,
285                    s3_path: s3_path.ok_or(::serde::de::Error::missing_field("S3Path"))?,
286                    tags: tags,
287                })
288            }
289        }
290
291        d.deserialize_map(Visitor)
292    }
293}
294
295impl ::Resource for Faq {
296    type Properties = FaqProperties;
297    const TYPE: &'static str = "AWS::Kendra::Faq";
298    fn properties(&self) -> &FaqProperties {
299        &self.properties
300    }
301    fn properties_mut(&mut self) -> &mut FaqProperties {
302        &mut self.properties
303    }
304}
305
306impl ::private::Sealed for Faq {}
307
308impl From<FaqProperties> for Faq {
309    fn from(properties: FaqProperties) -> Faq {
310        Faq { properties }
311    }
312}
313
314/// The [`AWS::Kendra::Index`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-index.html) resource type.
315#[derive(Debug, Default)]
316pub struct Index {
317    properties: IndexProperties
318}
319
320/// Properties for the `Index` resource.
321#[derive(Debug, Default)]
322pub struct IndexProperties {
323    /// Property [`CapacityUnits`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-index.html#cfn-kendra-index-capacityunits).
324    ///
325    /// Update type: _Mutable_.
326    /// AWS CloudFormation doesn't replace the resource when you change this property.
327    pub capacity_units: Option<::Value<self::index::CapacityUnitsConfiguration>>,
328    /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-index.html#cfn-kendra-index-description).
329    ///
330    /// Update type: _Mutable_.
331    /// AWS CloudFormation doesn't replace the resource when you change this property.
332    pub description: Option<::Value<String>>,
333    /// Property [`DocumentMetadataConfigurations`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-index.html#cfn-kendra-index-documentmetadataconfigurations).
334    ///
335    /// Update type: _Mutable_.
336    /// AWS CloudFormation doesn't replace the resource when you change this property.
337    pub document_metadata_configurations: Option<::ValueList<self::index::DocumentMetadataConfiguration>>,
338    /// Property [`Edition`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-index.html#cfn-kendra-index-edition).
339    ///
340    /// Update type: _Immutable_.
341    /// AWS CloudFormation replaces the resource when you change this property.
342    pub edition: ::Value<String>,
343    /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-index.html#cfn-kendra-index-name).
344    ///
345    /// Update type: _Mutable_.
346    /// AWS CloudFormation doesn't replace the resource when you change this property.
347    pub name: ::Value<String>,
348    /// Property [`RoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-index.html#cfn-kendra-index-rolearn).
349    ///
350    /// Update type: _Mutable_.
351    /// AWS CloudFormation doesn't replace the resource when you change this property.
352    pub role_arn: ::Value<String>,
353    /// Property [`ServerSideEncryptionConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-index.html#cfn-kendra-index-serversideencryptionconfiguration).
354    ///
355    /// Update type: _Immutable_.
356    /// AWS CloudFormation replaces the resource when you change this property.
357    pub server_side_encryption_configuration: Option<::Value<self::index::ServerSideEncryptionConfiguration>>,
358    /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-index.html#cfn-kendra-index-tags).
359    ///
360    /// Update type: _Mutable_.
361    /// AWS CloudFormation doesn't replace the resource when you change this property.
362    pub tags: Option<::ValueList<::Tag>>,
363    /// Property [`UserContextPolicy`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-index.html#cfn-kendra-index-usercontextpolicy).
364    ///
365    /// Update type: _Mutable_.
366    /// AWS CloudFormation doesn't replace the resource when you change this property.
367    pub user_context_policy: Option<::Value<String>>,
368    /// Property [`UserTokenConfigurations`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kendra-index.html#cfn-kendra-index-usertokenconfigurations).
369    ///
370    /// Update type: _Mutable_.
371    /// AWS CloudFormation doesn't replace the resource when you change this property.
372    pub user_token_configurations: Option<::ValueList<self::index::UserTokenConfiguration>>,
373}
374
375impl ::serde::Serialize for IndexProperties {
376    fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
377        let mut map = ::serde::Serializer::serialize_map(s, None)?;
378        if let Some(ref capacity_units) = self.capacity_units {
379            ::serde::ser::SerializeMap::serialize_entry(&mut map, "CapacityUnits", capacity_units)?;
380        }
381        if let Some(ref description) = self.description {
382            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?;
383        }
384        if let Some(ref document_metadata_configurations) = self.document_metadata_configurations {
385            ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentMetadataConfigurations", document_metadata_configurations)?;
386        }
387        ::serde::ser::SerializeMap::serialize_entry(&mut map, "Edition", &self.edition)?;
388        ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?;
389        ::serde::ser::SerializeMap::serialize_entry(&mut map, "RoleArn", &self.role_arn)?;
390        if let Some(ref server_side_encryption_configuration) = self.server_side_encryption_configuration {
391            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServerSideEncryptionConfiguration", server_side_encryption_configuration)?;
392        }
393        if let Some(ref tags) = self.tags {
394            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?;
395        }
396        if let Some(ref user_context_policy) = self.user_context_policy {
397            ::serde::ser::SerializeMap::serialize_entry(&mut map, "UserContextPolicy", user_context_policy)?;
398        }
399        if let Some(ref user_token_configurations) = self.user_token_configurations {
400            ::serde::ser::SerializeMap::serialize_entry(&mut map, "UserTokenConfigurations", user_token_configurations)?;
401        }
402        ::serde::ser::SerializeMap::end(map)
403    }
404}
405
406impl<'de> ::serde::Deserialize<'de> for IndexProperties {
407    fn deserialize<D: ::serde::Deserializer<'de>>(d: D) -> Result<IndexProperties, D::Error> {
408        struct Visitor;
409
410        impl<'de> ::serde::de::Visitor<'de> for Visitor {
411            type Value = IndexProperties;
412
413            fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
414                write!(f, "a struct of type IndexProperties")
415            }
416
417            fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
418                let mut capacity_units: Option<::Value<self::index::CapacityUnitsConfiguration>> = None;
419                let mut description: Option<::Value<String>> = None;
420                let mut document_metadata_configurations: Option<::ValueList<self::index::DocumentMetadataConfiguration>> = None;
421                let mut edition: Option<::Value<String>> = None;
422                let mut name: Option<::Value<String>> = None;
423                let mut role_arn: Option<::Value<String>> = None;
424                let mut server_side_encryption_configuration: Option<::Value<self::index::ServerSideEncryptionConfiguration>> = None;
425                let mut tags: Option<::ValueList<::Tag>> = None;
426                let mut user_context_policy: Option<::Value<String>> = None;
427                let mut user_token_configurations: Option<::ValueList<self::index::UserTokenConfiguration>> = None;
428
429                while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
430                    match __cfn_key.as_ref() {
431                        "CapacityUnits" => {
432                            capacity_units = ::serde::de::MapAccess::next_value(&mut map)?;
433                        }
434                        "Description" => {
435                            description = ::serde::de::MapAccess::next_value(&mut map)?;
436                        }
437                        "DocumentMetadataConfigurations" => {
438                            document_metadata_configurations = ::serde::de::MapAccess::next_value(&mut map)?;
439                        }
440                        "Edition" => {
441                            edition = ::serde::de::MapAccess::next_value(&mut map)?;
442                        }
443                        "Name" => {
444                            name = ::serde::de::MapAccess::next_value(&mut map)?;
445                        }
446                        "RoleArn" => {
447                            role_arn = ::serde::de::MapAccess::next_value(&mut map)?;
448                        }
449                        "ServerSideEncryptionConfiguration" => {
450                            server_side_encryption_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
451                        }
452                        "Tags" => {
453                            tags = ::serde::de::MapAccess::next_value(&mut map)?;
454                        }
455                        "UserContextPolicy" => {
456                            user_context_policy = ::serde::de::MapAccess::next_value(&mut map)?;
457                        }
458                        "UserTokenConfigurations" => {
459                            user_token_configurations = ::serde::de::MapAccess::next_value(&mut map)?;
460                        }
461                        _ => {}
462                    }
463                }
464
465                Ok(IndexProperties {
466                    capacity_units: capacity_units,
467                    description: description,
468                    document_metadata_configurations: document_metadata_configurations,
469                    edition: edition.ok_or(::serde::de::Error::missing_field("Edition"))?,
470                    name: name.ok_or(::serde::de::Error::missing_field("Name"))?,
471                    role_arn: role_arn.ok_or(::serde::de::Error::missing_field("RoleArn"))?,
472                    server_side_encryption_configuration: server_side_encryption_configuration,
473                    tags: tags,
474                    user_context_policy: user_context_policy,
475                    user_token_configurations: user_token_configurations,
476                })
477            }
478        }
479
480        d.deserialize_map(Visitor)
481    }
482}
483
484impl ::Resource for Index {
485    type Properties = IndexProperties;
486    const TYPE: &'static str = "AWS::Kendra::Index";
487    fn properties(&self) -> &IndexProperties {
488        &self.properties
489    }
490    fn properties_mut(&mut self) -> &mut IndexProperties {
491        &mut self.properties
492    }
493}
494
495impl ::private::Sealed for Index {}
496
497impl From<IndexProperties> for Index {
498    fn from(properties: IndexProperties) -> Index {
499        Index { properties }
500    }
501}
502
503pub mod data_source {
504    //! Property types for the `DataSource` resource.
505
506    /// The [`AWS::Kendra::DataSource.AccessControlListConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-accesscontrollistconfiguration.html) property type.
507    #[derive(Debug, Default)]
508    pub struct AccessControlListConfiguration {
509        /// Property [`KeyPath`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-accesscontrollistconfiguration.html#cfn-kendra-datasource-accesscontrollistconfiguration-keypath).
510        ///
511        /// Update type: _Mutable_.
512        /// AWS CloudFormation doesn't replace the resource when you change this property.
513        pub key_path: Option<::Value<String>>,
514    }
515
516    impl ::codec::SerializeValue for AccessControlListConfiguration {
517        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
518            let mut map = ::serde::Serializer::serialize_map(s, None)?;
519            if let Some(ref key_path) = self.key_path {
520                ::serde::ser::SerializeMap::serialize_entry(&mut map, "KeyPath", key_path)?;
521            }
522            ::serde::ser::SerializeMap::end(map)
523        }
524    }
525
526    impl ::codec::DeserializeValue for AccessControlListConfiguration {
527        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<AccessControlListConfiguration, D::Error> {
528            struct Visitor;
529
530            impl<'de> ::serde::de::Visitor<'de> for Visitor {
531                type Value = AccessControlListConfiguration;
532
533                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
534                    write!(f, "a struct of type AccessControlListConfiguration")
535                }
536
537                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
538                    let mut key_path: Option<::Value<String>> = None;
539
540                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
541                        match __cfn_key.as_ref() {
542                            "KeyPath" => {
543                                key_path = ::serde::de::MapAccess::next_value(&mut map)?;
544                            }
545                            _ => {}
546                        }
547                    }
548
549                    Ok(AccessControlListConfiguration {
550                        key_path: key_path,
551                    })
552                }
553            }
554
555            d.deserialize_map(Visitor)
556        }
557    }
558
559    /// The [`AWS::Kendra::DataSource.AclConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-aclconfiguration.html) property type.
560    #[derive(Debug, Default)]
561    pub struct AclConfiguration {
562        /// Property [`AllowedGroupsColumnName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-aclconfiguration.html#cfn-kendra-datasource-aclconfiguration-allowedgroupscolumnname).
563        ///
564        /// Update type: _Mutable_.
565        /// AWS CloudFormation doesn't replace the resource when you change this property.
566        pub allowed_groups_column_name: ::Value<String>,
567    }
568
569    impl ::codec::SerializeValue for AclConfiguration {
570        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
571            let mut map = ::serde::Serializer::serialize_map(s, None)?;
572            ::serde::ser::SerializeMap::serialize_entry(&mut map, "AllowedGroupsColumnName", &self.allowed_groups_column_name)?;
573            ::serde::ser::SerializeMap::end(map)
574        }
575    }
576
577    impl ::codec::DeserializeValue for AclConfiguration {
578        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<AclConfiguration, D::Error> {
579            struct Visitor;
580
581            impl<'de> ::serde::de::Visitor<'de> for Visitor {
582                type Value = AclConfiguration;
583
584                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
585                    write!(f, "a struct of type AclConfiguration")
586                }
587
588                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
589                    let mut allowed_groups_column_name: Option<::Value<String>> = None;
590
591                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
592                        match __cfn_key.as_ref() {
593                            "AllowedGroupsColumnName" => {
594                                allowed_groups_column_name = ::serde::de::MapAccess::next_value(&mut map)?;
595                            }
596                            _ => {}
597                        }
598                    }
599
600                    Ok(AclConfiguration {
601                        allowed_groups_column_name: allowed_groups_column_name.ok_or(::serde::de::Error::missing_field("AllowedGroupsColumnName"))?,
602                    })
603                }
604            }
605
606            d.deserialize_map(Visitor)
607        }
608    }
609
610    /// The [`AWS::Kendra::DataSource.ColumnConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-columnconfiguration.html) property type.
611    #[derive(Debug, Default)]
612    pub struct ColumnConfiguration {
613        /// Property [`ChangeDetectingColumns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-columnconfiguration.html#cfn-kendra-datasource-columnconfiguration-changedetectingcolumns).
614        ///
615        /// Update type: _Mutable_.
616        /// AWS CloudFormation doesn't replace the resource when you change this property.
617        pub change_detecting_columns: ::ValueList<String>,
618        /// Property [`DocumentDataColumnName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-columnconfiguration.html#cfn-kendra-datasource-columnconfiguration-documentdatacolumnname).
619        ///
620        /// Update type: _Mutable_.
621        /// AWS CloudFormation doesn't replace the resource when you change this property.
622        pub document_data_column_name: ::Value<String>,
623        /// Property [`DocumentIdColumnName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-columnconfiguration.html#cfn-kendra-datasource-columnconfiguration-documentidcolumnname).
624        ///
625        /// Update type: _Mutable_.
626        /// AWS CloudFormation doesn't replace the resource when you change this property.
627        pub document_id_column_name: ::Value<String>,
628        /// Property [`DocumentTitleColumnName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-columnconfiguration.html#cfn-kendra-datasource-columnconfiguration-documenttitlecolumnname).
629        ///
630        /// Update type: _Mutable_.
631        /// AWS CloudFormation doesn't replace the resource when you change this property.
632        pub document_title_column_name: Option<::Value<String>>,
633        /// Property [`FieldMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-columnconfiguration.html#cfn-kendra-datasource-columnconfiguration-fieldmappings).
634        ///
635        /// Update type: _Mutable_.
636        /// AWS CloudFormation doesn't replace the resource when you change this property.
637        pub field_mappings: Option<::ValueList<DataSourceToIndexFieldMapping>>,
638    }
639
640    impl ::codec::SerializeValue for ColumnConfiguration {
641        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
642            let mut map = ::serde::Serializer::serialize_map(s, None)?;
643            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ChangeDetectingColumns", &self.change_detecting_columns)?;
644            ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentDataColumnName", &self.document_data_column_name)?;
645            ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentIdColumnName", &self.document_id_column_name)?;
646            if let Some(ref document_title_column_name) = self.document_title_column_name {
647                ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentTitleColumnName", document_title_column_name)?;
648            }
649            if let Some(ref field_mappings) = self.field_mappings {
650                ::serde::ser::SerializeMap::serialize_entry(&mut map, "FieldMappings", field_mappings)?;
651            }
652            ::serde::ser::SerializeMap::end(map)
653        }
654    }
655
656    impl ::codec::DeserializeValue for ColumnConfiguration {
657        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ColumnConfiguration, D::Error> {
658            struct Visitor;
659
660            impl<'de> ::serde::de::Visitor<'de> for Visitor {
661                type Value = ColumnConfiguration;
662
663                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
664                    write!(f, "a struct of type ColumnConfiguration")
665                }
666
667                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
668                    let mut change_detecting_columns: Option<::ValueList<String>> = None;
669                    let mut document_data_column_name: Option<::Value<String>> = None;
670                    let mut document_id_column_name: Option<::Value<String>> = None;
671                    let mut document_title_column_name: Option<::Value<String>> = None;
672                    let mut field_mappings: Option<::ValueList<DataSourceToIndexFieldMapping>> = None;
673
674                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
675                        match __cfn_key.as_ref() {
676                            "ChangeDetectingColumns" => {
677                                change_detecting_columns = ::serde::de::MapAccess::next_value(&mut map)?;
678                            }
679                            "DocumentDataColumnName" => {
680                                document_data_column_name = ::serde::de::MapAccess::next_value(&mut map)?;
681                            }
682                            "DocumentIdColumnName" => {
683                                document_id_column_name = ::serde::de::MapAccess::next_value(&mut map)?;
684                            }
685                            "DocumentTitleColumnName" => {
686                                document_title_column_name = ::serde::de::MapAccess::next_value(&mut map)?;
687                            }
688                            "FieldMappings" => {
689                                field_mappings = ::serde::de::MapAccess::next_value(&mut map)?;
690                            }
691                            _ => {}
692                        }
693                    }
694
695                    Ok(ColumnConfiguration {
696                        change_detecting_columns: change_detecting_columns.ok_or(::serde::de::Error::missing_field("ChangeDetectingColumns"))?,
697                        document_data_column_name: document_data_column_name.ok_or(::serde::de::Error::missing_field("DocumentDataColumnName"))?,
698                        document_id_column_name: document_id_column_name.ok_or(::serde::de::Error::missing_field("DocumentIdColumnName"))?,
699                        document_title_column_name: document_title_column_name,
700                        field_mappings: field_mappings,
701                    })
702                }
703            }
704
705            d.deserialize_map(Visitor)
706        }
707    }
708
709    /// The [`AWS::Kendra::DataSource.ConfluenceAttachmentConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceattachmentconfiguration.html) property type.
710    #[derive(Debug, Default)]
711    pub struct ConfluenceAttachmentConfiguration {
712        /// Property [`AttachmentFieldMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceattachmentconfiguration.html#cfn-kendra-datasource-confluenceattachmentconfiguration-attachmentfieldmappings).
713        ///
714        /// Update type: _Mutable_.
715        /// AWS CloudFormation doesn't replace the resource when you change this property.
716        pub attachment_field_mappings: Option<::ValueList<ConfluenceAttachmentToIndexFieldMapping>>,
717        /// Property [`CrawlAttachments`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceattachmentconfiguration.html#cfn-kendra-datasource-confluenceattachmentconfiguration-crawlattachments).
718        ///
719        /// Update type: _Mutable_.
720        /// AWS CloudFormation doesn't replace the resource when you change this property.
721        pub crawl_attachments: Option<::Value<bool>>,
722    }
723
724    impl ::codec::SerializeValue for ConfluenceAttachmentConfiguration {
725        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
726            let mut map = ::serde::Serializer::serialize_map(s, None)?;
727            if let Some(ref attachment_field_mappings) = self.attachment_field_mappings {
728                ::serde::ser::SerializeMap::serialize_entry(&mut map, "AttachmentFieldMappings", attachment_field_mappings)?;
729            }
730            if let Some(ref crawl_attachments) = self.crawl_attachments {
731                ::serde::ser::SerializeMap::serialize_entry(&mut map, "CrawlAttachments", crawl_attachments)?;
732            }
733            ::serde::ser::SerializeMap::end(map)
734        }
735    }
736
737    impl ::codec::DeserializeValue for ConfluenceAttachmentConfiguration {
738        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ConfluenceAttachmentConfiguration, D::Error> {
739            struct Visitor;
740
741            impl<'de> ::serde::de::Visitor<'de> for Visitor {
742                type Value = ConfluenceAttachmentConfiguration;
743
744                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
745                    write!(f, "a struct of type ConfluenceAttachmentConfiguration")
746                }
747
748                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
749                    let mut attachment_field_mappings: Option<::ValueList<ConfluenceAttachmentToIndexFieldMapping>> = None;
750                    let mut crawl_attachments: Option<::Value<bool>> = None;
751
752                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
753                        match __cfn_key.as_ref() {
754                            "AttachmentFieldMappings" => {
755                                attachment_field_mappings = ::serde::de::MapAccess::next_value(&mut map)?;
756                            }
757                            "CrawlAttachments" => {
758                                crawl_attachments = ::serde::de::MapAccess::next_value(&mut map)?;
759                            }
760                            _ => {}
761                        }
762                    }
763
764                    Ok(ConfluenceAttachmentConfiguration {
765                        attachment_field_mappings: attachment_field_mappings,
766                        crawl_attachments: crawl_attachments,
767                    })
768                }
769            }
770
771            d.deserialize_map(Visitor)
772        }
773    }
774
775    /// The [`AWS::Kendra::DataSource.ConfluenceAttachmentToIndexFieldMapping`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceattachmenttoindexfieldmapping.html) property type.
776    #[derive(Debug, Default)]
777    pub struct ConfluenceAttachmentToIndexFieldMapping {
778        /// Property [`DataSourceFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceattachmenttoindexfieldmapping.html#cfn-kendra-datasource-confluenceattachmenttoindexfieldmapping-datasourcefieldname).
779        ///
780        /// Update type: _Mutable_.
781        /// AWS CloudFormation doesn't replace the resource when you change this property.
782        pub data_source_field_name: ::Value<String>,
783        /// Property [`DateFieldFormat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceattachmenttoindexfieldmapping.html#cfn-kendra-datasource-confluenceattachmenttoindexfieldmapping-datefieldformat).
784        ///
785        /// Update type: _Mutable_.
786        /// AWS CloudFormation doesn't replace the resource when you change this property.
787        pub date_field_format: Option<::Value<String>>,
788        /// Property [`IndexFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceattachmenttoindexfieldmapping.html#cfn-kendra-datasource-confluenceattachmenttoindexfieldmapping-indexfieldname).
789        ///
790        /// Update type: _Mutable_.
791        /// AWS CloudFormation doesn't replace the resource when you change this property.
792        pub index_field_name: ::Value<String>,
793    }
794
795    impl ::codec::SerializeValue for ConfluenceAttachmentToIndexFieldMapping {
796        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
797            let mut map = ::serde::Serializer::serialize_map(s, None)?;
798            ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataSourceFieldName", &self.data_source_field_name)?;
799            if let Some(ref date_field_format) = self.date_field_format {
800                ::serde::ser::SerializeMap::serialize_entry(&mut map, "DateFieldFormat", date_field_format)?;
801            }
802            ::serde::ser::SerializeMap::serialize_entry(&mut map, "IndexFieldName", &self.index_field_name)?;
803            ::serde::ser::SerializeMap::end(map)
804        }
805    }
806
807    impl ::codec::DeserializeValue for ConfluenceAttachmentToIndexFieldMapping {
808        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ConfluenceAttachmentToIndexFieldMapping, D::Error> {
809            struct Visitor;
810
811            impl<'de> ::serde::de::Visitor<'de> for Visitor {
812                type Value = ConfluenceAttachmentToIndexFieldMapping;
813
814                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
815                    write!(f, "a struct of type ConfluenceAttachmentToIndexFieldMapping")
816                }
817
818                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
819                    let mut data_source_field_name: Option<::Value<String>> = None;
820                    let mut date_field_format: Option<::Value<String>> = None;
821                    let mut index_field_name: Option<::Value<String>> = None;
822
823                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
824                        match __cfn_key.as_ref() {
825                            "DataSourceFieldName" => {
826                                data_source_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
827                            }
828                            "DateFieldFormat" => {
829                                date_field_format = ::serde::de::MapAccess::next_value(&mut map)?;
830                            }
831                            "IndexFieldName" => {
832                                index_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
833                            }
834                            _ => {}
835                        }
836                    }
837
838                    Ok(ConfluenceAttachmentToIndexFieldMapping {
839                        data_source_field_name: data_source_field_name.ok_or(::serde::de::Error::missing_field("DataSourceFieldName"))?,
840                        date_field_format: date_field_format,
841                        index_field_name: index_field_name.ok_or(::serde::de::Error::missing_field("IndexFieldName"))?,
842                    })
843                }
844            }
845
846            d.deserialize_map(Visitor)
847        }
848    }
849
850    /// The [`AWS::Kendra::DataSource.ConfluenceBlogConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceblogconfiguration.html) property type.
851    #[derive(Debug, Default)]
852    pub struct ConfluenceBlogConfiguration {
853        /// Property [`BlogFieldMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceblogconfiguration.html#cfn-kendra-datasource-confluenceblogconfiguration-blogfieldmappings).
854        ///
855        /// Update type: _Mutable_.
856        /// AWS CloudFormation doesn't replace the resource when you change this property.
857        pub blog_field_mappings: Option<::ValueList<ConfluenceBlogToIndexFieldMapping>>,
858    }
859
860    impl ::codec::SerializeValue for ConfluenceBlogConfiguration {
861        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
862            let mut map = ::serde::Serializer::serialize_map(s, None)?;
863            if let Some(ref blog_field_mappings) = self.blog_field_mappings {
864                ::serde::ser::SerializeMap::serialize_entry(&mut map, "BlogFieldMappings", blog_field_mappings)?;
865            }
866            ::serde::ser::SerializeMap::end(map)
867        }
868    }
869
870    impl ::codec::DeserializeValue for ConfluenceBlogConfiguration {
871        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ConfluenceBlogConfiguration, D::Error> {
872            struct Visitor;
873
874            impl<'de> ::serde::de::Visitor<'de> for Visitor {
875                type Value = ConfluenceBlogConfiguration;
876
877                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
878                    write!(f, "a struct of type ConfluenceBlogConfiguration")
879                }
880
881                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
882                    let mut blog_field_mappings: Option<::ValueList<ConfluenceBlogToIndexFieldMapping>> = None;
883
884                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
885                        match __cfn_key.as_ref() {
886                            "BlogFieldMappings" => {
887                                blog_field_mappings = ::serde::de::MapAccess::next_value(&mut map)?;
888                            }
889                            _ => {}
890                        }
891                    }
892
893                    Ok(ConfluenceBlogConfiguration {
894                        blog_field_mappings: blog_field_mappings,
895                    })
896                }
897            }
898
899            d.deserialize_map(Visitor)
900        }
901    }
902
903    /// The [`AWS::Kendra::DataSource.ConfluenceBlogToIndexFieldMapping`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceblogtoindexfieldmapping.html) property type.
904    #[derive(Debug, Default)]
905    pub struct ConfluenceBlogToIndexFieldMapping {
906        /// Property [`DataSourceFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceblogtoindexfieldmapping.html#cfn-kendra-datasource-confluenceblogtoindexfieldmapping-datasourcefieldname).
907        ///
908        /// Update type: _Mutable_.
909        /// AWS CloudFormation doesn't replace the resource when you change this property.
910        pub data_source_field_name: ::Value<String>,
911        /// Property [`DateFieldFormat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceblogtoindexfieldmapping.html#cfn-kendra-datasource-confluenceblogtoindexfieldmapping-datefieldformat).
912        ///
913        /// Update type: _Mutable_.
914        /// AWS CloudFormation doesn't replace the resource when you change this property.
915        pub date_field_format: Option<::Value<String>>,
916        /// Property [`IndexFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceblogtoindexfieldmapping.html#cfn-kendra-datasource-confluenceblogtoindexfieldmapping-indexfieldname).
917        ///
918        /// Update type: _Mutable_.
919        /// AWS CloudFormation doesn't replace the resource when you change this property.
920        pub index_field_name: ::Value<String>,
921    }
922
923    impl ::codec::SerializeValue for ConfluenceBlogToIndexFieldMapping {
924        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
925            let mut map = ::serde::Serializer::serialize_map(s, None)?;
926            ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataSourceFieldName", &self.data_source_field_name)?;
927            if let Some(ref date_field_format) = self.date_field_format {
928                ::serde::ser::SerializeMap::serialize_entry(&mut map, "DateFieldFormat", date_field_format)?;
929            }
930            ::serde::ser::SerializeMap::serialize_entry(&mut map, "IndexFieldName", &self.index_field_name)?;
931            ::serde::ser::SerializeMap::end(map)
932        }
933    }
934
935    impl ::codec::DeserializeValue for ConfluenceBlogToIndexFieldMapping {
936        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ConfluenceBlogToIndexFieldMapping, D::Error> {
937            struct Visitor;
938
939            impl<'de> ::serde::de::Visitor<'de> for Visitor {
940                type Value = ConfluenceBlogToIndexFieldMapping;
941
942                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
943                    write!(f, "a struct of type ConfluenceBlogToIndexFieldMapping")
944                }
945
946                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
947                    let mut data_source_field_name: Option<::Value<String>> = None;
948                    let mut date_field_format: Option<::Value<String>> = None;
949                    let mut index_field_name: Option<::Value<String>> = None;
950
951                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
952                        match __cfn_key.as_ref() {
953                            "DataSourceFieldName" => {
954                                data_source_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
955                            }
956                            "DateFieldFormat" => {
957                                date_field_format = ::serde::de::MapAccess::next_value(&mut map)?;
958                            }
959                            "IndexFieldName" => {
960                                index_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
961                            }
962                            _ => {}
963                        }
964                    }
965
966                    Ok(ConfluenceBlogToIndexFieldMapping {
967                        data_source_field_name: data_source_field_name.ok_or(::serde::de::Error::missing_field("DataSourceFieldName"))?,
968                        date_field_format: date_field_format,
969                        index_field_name: index_field_name.ok_or(::serde::de::Error::missing_field("IndexFieldName"))?,
970                    })
971                }
972            }
973
974            d.deserialize_map(Visitor)
975        }
976    }
977
978    /// The [`AWS::Kendra::DataSource.ConfluenceConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceconfiguration.html) property type.
979    #[derive(Debug, Default)]
980    pub struct ConfluenceConfiguration {
981        /// Property [`AttachmentConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceconfiguration.html#cfn-kendra-datasource-confluenceconfiguration-attachmentconfiguration).
982        ///
983        /// Update type: _Mutable_.
984        /// AWS CloudFormation doesn't replace the resource when you change this property.
985        pub attachment_configuration: Option<::Value<ConfluenceAttachmentConfiguration>>,
986        /// Property [`BlogConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceconfiguration.html#cfn-kendra-datasource-confluenceconfiguration-blogconfiguration).
987        ///
988        /// Update type: _Mutable_.
989        /// AWS CloudFormation doesn't replace the resource when you change this property.
990        pub blog_configuration: Option<::Value<ConfluenceBlogConfiguration>>,
991        /// Property [`ExclusionPatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceconfiguration.html#cfn-kendra-datasource-confluenceconfiguration-exclusionpatterns).
992        ///
993        /// Update type: _Mutable_.
994        /// AWS CloudFormation doesn't replace the resource when you change this property.
995        pub exclusion_patterns: Option<::ValueList<String>>,
996        /// Property [`InclusionPatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceconfiguration.html#cfn-kendra-datasource-confluenceconfiguration-inclusionpatterns).
997        ///
998        /// Update type: _Mutable_.
999        /// AWS CloudFormation doesn't replace the resource when you change this property.
1000        pub inclusion_patterns: Option<::ValueList<String>>,
1001        /// Property [`PageConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceconfiguration.html#cfn-kendra-datasource-confluenceconfiguration-pageconfiguration).
1002        ///
1003        /// Update type: _Mutable_.
1004        /// AWS CloudFormation doesn't replace the resource when you change this property.
1005        pub page_configuration: Option<::Value<ConfluencePageConfiguration>>,
1006        /// Property [`SecretArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceconfiguration.html#cfn-kendra-datasource-confluenceconfiguration-secretarn).
1007        ///
1008        /// Update type: _Mutable_.
1009        /// AWS CloudFormation doesn't replace the resource when you change this property.
1010        pub secret_arn: ::Value<String>,
1011        /// Property [`ServerUrl`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceconfiguration.html#cfn-kendra-datasource-confluenceconfiguration-serverurl).
1012        ///
1013        /// Update type: _Mutable_.
1014        /// AWS CloudFormation doesn't replace the resource when you change this property.
1015        pub server_url: ::Value<String>,
1016        /// Property [`SpaceConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceconfiguration.html#cfn-kendra-datasource-confluenceconfiguration-spaceconfiguration).
1017        ///
1018        /// Update type: _Mutable_.
1019        /// AWS CloudFormation doesn't replace the resource when you change this property.
1020        pub space_configuration: Option<::Value<ConfluenceSpaceConfiguration>>,
1021        /// Property [`Version`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceconfiguration.html#cfn-kendra-datasource-confluenceconfiguration-version).
1022        ///
1023        /// Update type: _Mutable_.
1024        /// AWS CloudFormation doesn't replace the resource when you change this property.
1025        pub version: ::Value<String>,
1026        /// Property [`VpcConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluenceconfiguration.html#cfn-kendra-datasource-confluenceconfiguration-vpcconfiguration).
1027        ///
1028        /// Update type: _Mutable_.
1029        /// AWS CloudFormation doesn't replace the resource when you change this property.
1030        pub vpc_configuration: Option<::Value<DataSourceVpcConfiguration>>,
1031    }
1032
1033    impl ::codec::SerializeValue for ConfluenceConfiguration {
1034        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1035            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1036            if let Some(ref attachment_configuration) = self.attachment_configuration {
1037                ::serde::ser::SerializeMap::serialize_entry(&mut map, "AttachmentConfiguration", attachment_configuration)?;
1038            }
1039            if let Some(ref blog_configuration) = self.blog_configuration {
1040                ::serde::ser::SerializeMap::serialize_entry(&mut map, "BlogConfiguration", blog_configuration)?;
1041            }
1042            if let Some(ref exclusion_patterns) = self.exclusion_patterns {
1043                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExclusionPatterns", exclusion_patterns)?;
1044            }
1045            if let Some(ref inclusion_patterns) = self.inclusion_patterns {
1046                ::serde::ser::SerializeMap::serialize_entry(&mut map, "InclusionPatterns", inclusion_patterns)?;
1047            }
1048            if let Some(ref page_configuration) = self.page_configuration {
1049                ::serde::ser::SerializeMap::serialize_entry(&mut map, "PageConfiguration", page_configuration)?;
1050            }
1051            ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretArn", &self.secret_arn)?;
1052            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServerUrl", &self.server_url)?;
1053            if let Some(ref space_configuration) = self.space_configuration {
1054                ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpaceConfiguration", space_configuration)?;
1055            }
1056            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Version", &self.version)?;
1057            if let Some(ref vpc_configuration) = self.vpc_configuration {
1058                ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcConfiguration", vpc_configuration)?;
1059            }
1060            ::serde::ser::SerializeMap::end(map)
1061        }
1062    }
1063
1064    impl ::codec::DeserializeValue for ConfluenceConfiguration {
1065        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ConfluenceConfiguration, D::Error> {
1066            struct Visitor;
1067
1068            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1069                type Value = ConfluenceConfiguration;
1070
1071                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1072                    write!(f, "a struct of type ConfluenceConfiguration")
1073                }
1074
1075                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1076                    let mut attachment_configuration: Option<::Value<ConfluenceAttachmentConfiguration>> = None;
1077                    let mut blog_configuration: Option<::Value<ConfluenceBlogConfiguration>> = None;
1078                    let mut exclusion_patterns: Option<::ValueList<String>> = None;
1079                    let mut inclusion_patterns: Option<::ValueList<String>> = None;
1080                    let mut page_configuration: Option<::Value<ConfluencePageConfiguration>> = None;
1081                    let mut secret_arn: Option<::Value<String>> = None;
1082                    let mut server_url: Option<::Value<String>> = None;
1083                    let mut space_configuration: Option<::Value<ConfluenceSpaceConfiguration>> = None;
1084                    let mut version: Option<::Value<String>> = None;
1085                    let mut vpc_configuration: Option<::Value<DataSourceVpcConfiguration>> = None;
1086
1087                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1088                        match __cfn_key.as_ref() {
1089                            "AttachmentConfiguration" => {
1090                                attachment_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
1091                            }
1092                            "BlogConfiguration" => {
1093                                blog_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
1094                            }
1095                            "ExclusionPatterns" => {
1096                                exclusion_patterns = ::serde::de::MapAccess::next_value(&mut map)?;
1097                            }
1098                            "InclusionPatterns" => {
1099                                inclusion_patterns = ::serde::de::MapAccess::next_value(&mut map)?;
1100                            }
1101                            "PageConfiguration" => {
1102                                page_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
1103                            }
1104                            "SecretArn" => {
1105                                secret_arn = ::serde::de::MapAccess::next_value(&mut map)?;
1106                            }
1107                            "ServerUrl" => {
1108                                server_url = ::serde::de::MapAccess::next_value(&mut map)?;
1109                            }
1110                            "SpaceConfiguration" => {
1111                                space_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
1112                            }
1113                            "Version" => {
1114                                version = ::serde::de::MapAccess::next_value(&mut map)?;
1115                            }
1116                            "VpcConfiguration" => {
1117                                vpc_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
1118                            }
1119                            _ => {}
1120                        }
1121                    }
1122
1123                    Ok(ConfluenceConfiguration {
1124                        attachment_configuration: attachment_configuration,
1125                        blog_configuration: blog_configuration,
1126                        exclusion_patterns: exclusion_patterns,
1127                        inclusion_patterns: inclusion_patterns,
1128                        page_configuration: page_configuration,
1129                        secret_arn: secret_arn.ok_or(::serde::de::Error::missing_field("SecretArn"))?,
1130                        server_url: server_url.ok_or(::serde::de::Error::missing_field("ServerUrl"))?,
1131                        space_configuration: space_configuration,
1132                        version: version.ok_or(::serde::de::Error::missing_field("Version"))?,
1133                        vpc_configuration: vpc_configuration,
1134                    })
1135                }
1136            }
1137
1138            d.deserialize_map(Visitor)
1139        }
1140    }
1141
1142    /// The [`AWS::Kendra::DataSource.ConfluencePageConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencepageconfiguration.html) property type.
1143    #[derive(Debug, Default)]
1144    pub struct ConfluencePageConfiguration {
1145        /// Property [`PageFieldMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencepageconfiguration.html#cfn-kendra-datasource-confluencepageconfiguration-pagefieldmappings).
1146        ///
1147        /// Update type: _Mutable_.
1148        /// AWS CloudFormation doesn't replace the resource when you change this property.
1149        pub page_field_mappings: Option<::ValueList<ConfluencePageToIndexFieldMapping>>,
1150    }
1151
1152    impl ::codec::SerializeValue for ConfluencePageConfiguration {
1153        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1154            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1155            if let Some(ref page_field_mappings) = self.page_field_mappings {
1156                ::serde::ser::SerializeMap::serialize_entry(&mut map, "PageFieldMappings", page_field_mappings)?;
1157            }
1158            ::serde::ser::SerializeMap::end(map)
1159        }
1160    }
1161
1162    impl ::codec::DeserializeValue for ConfluencePageConfiguration {
1163        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ConfluencePageConfiguration, D::Error> {
1164            struct Visitor;
1165
1166            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1167                type Value = ConfluencePageConfiguration;
1168
1169                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1170                    write!(f, "a struct of type ConfluencePageConfiguration")
1171                }
1172
1173                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1174                    let mut page_field_mappings: Option<::ValueList<ConfluencePageToIndexFieldMapping>> = None;
1175
1176                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1177                        match __cfn_key.as_ref() {
1178                            "PageFieldMappings" => {
1179                                page_field_mappings = ::serde::de::MapAccess::next_value(&mut map)?;
1180                            }
1181                            _ => {}
1182                        }
1183                    }
1184
1185                    Ok(ConfluencePageConfiguration {
1186                        page_field_mappings: page_field_mappings,
1187                    })
1188                }
1189            }
1190
1191            d.deserialize_map(Visitor)
1192        }
1193    }
1194
1195    /// The [`AWS::Kendra::DataSource.ConfluencePageToIndexFieldMapping`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencepagetoindexfieldmapping.html) property type.
1196    #[derive(Debug, Default)]
1197    pub struct ConfluencePageToIndexFieldMapping {
1198        /// Property [`DataSourceFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencepagetoindexfieldmapping.html#cfn-kendra-datasource-confluencepagetoindexfieldmapping-datasourcefieldname).
1199        ///
1200        /// Update type: _Mutable_.
1201        /// AWS CloudFormation doesn't replace the resource when you change this property.
1202        pub data_source_field_name: ::Value<String>,
1203        /// Property [`DateFieldFormat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencepagetoindexfieldmapping.html#cfn-kendra-datasource-confluencepagetoindexfieldmapping-datefieldformat).
1204        ///
1205        /// Update type: _Mutable_.
1206        /// AWS CloudFormation doesn't replace the resource when you change this property.
1207        pub date_field_format: Option<::Value<String>>,
1208        /// Property [`IndexFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencepagetoindexfieldmapping.html#cfn-kendra-datasource-confluencepagetoindexfieldmapping-indexfieldname).
1209        ///
1210        /// Update type: _Mutable_.
1211        /// AWS CloudFormation doesn't replace the resource when you change this property.
1212        pub index_field_name: ::Value<String>,
1213    }
1214
1215    impl ::codec::SerializeValue for ConfluencePageToIndexFieldMapping {
1216        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1217            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1218            ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataSourceFieldName", &self.data_source_field_name)?;
1219            if let Some(ref date_field_format) = self.date_field_format {
1220                ::serde::ser::SerializeMap::serialize_entry(&mut map, "DateFieldFormat", date_field_format)?;
1221            }
1222            ::serde::ser::SerializeMap::serialize_entry(&mut map, "IndexFieldName", &self.index_field_name)?;
1223            ::serde::ser::SerializeMap::end(map)
1224        }
1225    }
1226
1227    impl ::codec::DeserializeValue for ConfluencePageToIndexFieldMapping {
1228        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ConfluencePageToIndexFieldMapping, D::Error> {
1229            struct Visitor;
1230
1231            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1232                type Value = ConfluencePageToIndexFieldMapping;
1233
1234                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1235                    write!(f, "a struct of type ConfluencePageToIndexFieldMapping")
1236                }
1237
1238                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1239                    let mut data_source_field_name: Option<::Value<String>> = None;
1240                    let mut date_field_format: Option<::Value<String>> = None;
1241                    let mut index_field_name: Option<::Value<String>> = None;
1242
1243                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1244                        match __cfn_key.as_ref() {
1245                            "DataSourceFieldName" => {
1246                                data_source_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
1247                            }
1248                            "DateFieldFormat" => {
1249                                date_field_format = ::serde::de::MapAccess::next_value(&mut map)?;
1250                            }
1251                            "IndexFieldName" => {
1252                                index_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
1253                            }
1254                            _ => {}
1255                        }
1256                    }
1257
1258                    Ok(ConfluencePageToIndexFieldMapping {
1259                        data_source_field_name: data_source_field_name.ok_or(::serde::de::Error::missing_field("DataSourceFieldName"))?,
1260                        date_field_format: date_field_format,
1261                        index_field_name: index_field_name.ok_or(::serde::de::Error::missing_field("IndexFieldName"))?,
1262                    })
1263                }
1264            }
1265
1266            d.deserialize_map(Visitor)
1267        }
1268    }
1269
1270    /// The [`AWS::Kendra::DataSource.ConfluenceSpaceConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencespaceconfiguration.html) property type.
1271    #[derive(Debug, Default)]
1272    pub struct ConfluenceSpaceConfiguration {
1273        /// Property [`CrawlArchivedSpaces`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencespaceconfiguration.html#cfn-kendra-datasource-confluencespaceconfiguration-crawlarchivedspaces).
1274        ///
1275        /// Update type: _Mutable_.
1276        /// AWS CloudFormation doesn't replace the resource when you change this property.
1277        pub crawl_archived_spaces: Option<::Value<bool>>,
1278        /// Property [`CrawlPersonalSpaces`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencespaceconfiguration.html#cfn-kendra-datasource-confluencespaceconfiguration-crawlpersonalspaces).
1279        ///
1280        /// Update type: _Mutable_.
1281        /// AWS CloudFormation doesn't replace the resource when you change this property.
1282        pub crawl_personal_spaces: Option<::Value<bool>>,
1283        /// Property [`ExcludeSpaces`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencespaceconfiguration.html#cfn-kendra-datasource-confluencespaceconfiguration-excludespaces).
1284        ///
1285        /// Update type: _Mutable_.
1286        /// AWS CloudFormation doesn't replace the resource when you change this property.
1287        pub exclude_spaces: Option<::ValueList<String>>,
1288        /// Property [`IncludeSpaces`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencespaceconfiguration.html#cfn-kendra-datasource-confluencespaceconfiguration-includespaces).
1289        ///
1290        /// Update type: _Mutable_.
1291        /// AWS CloudFormation doesn't replace the resource when you change this property.
1292        pub include_spaces: Option<::ValueList<String>>,
1293        /// Property [`SpaceFieldMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencespaceconfiguration.html#cfn-kendra-datasource-confluencespaceconfiguration-spacefieldmappings).
1294        ///
1295        /// Update type: _Mutable_.
1296        /// AWS CloudFormation doesn't replace the resource when you change this property.
1297        pub space_field_mappings: Option<::ValueList<ConfluenceSpaceToIndexFieldMapping>>,
1298    }
1299
1300    impl ::codec::SerializeValue for ConfluenceSpaceConfiguration {
1301        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1302            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1303            if let Some(ref crawl_archived_spaces) = self.crawl_archived_spaces {
1304                ::serde::ser::SerializeMap::serialize_entry(&mut map, "CrawlArchivedSpaces", crawl_archived_spaces)?;
1305            }
1306            if let Some(ref crawl_personal_spaces) = self.crawl_personal_spaces {
1307                ::serde::ser::SerializeMap::serialize_entry(&mut map, "CrawlPersonalSpaces", crawl_personal_spaces)?;
1308            }
1309            if let Some(ref exclude_spaces) = self.exclude_spaces {
1310                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExcludeSpaces", exclude_spaces)?;
1311            }
1312            if let Some(ref include_spaces) = self.include_spaces {
1313                ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludeSpaces", include_spaces)?;
1314            }
1315            if let Some(ref space_field_mappings) = self.space_field_mappings {
1316                ::serde::ser::SerializeMap::serialize_entry(&mut map, "SpaceFieldMappings", space_field_mappings)?;
1317            }
1318            ::serde::ser::SerializeMap::end(map)
1319        }
1320    }
1321
1322    impl ::codec::DeserializeValue for ConfluenceSpaceConfiguration {
1323        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ConfluenceSpaceConfiguration, D::Error> {
1324            struct Visitor;
1325
1326            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1327                type Value = ConfluenceSpaceConfiguration;
1328
1329                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1330                    write!(f, "a struct of type ConfluenceSpaceConfiguration")
1331                }
1332
1333                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1334                    let mut crawl_archived_spaces: Option<::Value<bool>> = None;
1335                    let mut crawl_personal_spaces: Option<::Value<bool>> = None;
1336                    let mut exclude_spaces: Option<::ValueList<String>> = None;
1337                    let mut include_spaces: Option<::ValueList<String>> = None;
1338                    let mut space_field_mappings: Option<::ValueList<ConfluenceSpaceToIndexFieldMapping>> = None;
1339
1340                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1341                        match __cfn_key.as_ref() {
1342                            "CrawlArchivedSpaces" => {
1343                                crawl_archived_spaces = ::serde::de::MapAccess::next_value(&mut map)?;
1344                            }
1345                            "CrawlPersonalSpaces" => {
1346                                crawl_personal_spaces = ::serde::de::MapAccess::next_value(&mut map)?;
1347                            }
1348                            "ExcludeSpaces" => {
1349                                exclude_spaces = ::serde::de::MapAccess::next_value(&mut map)?;
1350                            }
1351                            "IncludeSpaces" => {
1352                                include_spaces = ::serde::de::MapAccess::next_value(&mut map)?;
1353                            }
1354                            "SpaceFieldMappings" => {
1355                                space_field_mappings = ::serde::de::MapAccess::next_value(&mut map)?;
1356                            }
1357                            _ => {}
1358                        }
1359                    }
1360
1361                    Ok(ConfluenceSpaceConfiguration {
1362                        crawl_archived_spaces: crawl_archived_spaces,
1363                        crawl_personal_spaces: crawl_personal_spaces,
1364                        exclude_spaces: exclude_spaces,
1365                        include_spaces: include_spaces,
1366                        space_field_mappings: space_field_mappings,
1367                    })
1368                }
1369            }
1370
1371            d.deserialize_map(Visitor)
1372        }
1373    }
1374
1375    /// The [`AWS::Kendra::DataSource.ConfluenceSpaceToIndexFieldMapping`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencespacetoindexfieldmapping.html) property type.
1376    #[derive(Debug, Default)]
1377    pub struct ConfluenceSpaceToIndexFieldMapping {
1378        /// Property [`DataSourceFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencespacetoindexfieldmapping.html#cfn-kendra-datasource-confluencespacetoindexfieldmapping-datasourcefieldname).
1379        ///
1380        /// Update type: _Mutable_.
1381        /// AWS CloudFormation doesn't replace the resource when you change this property.
1382        pub data_source_field_name: ::Value<String>,
1383        /// Property [`DateFieldFormat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencespacetoindexfieldmapping.html#cfn-kendra-datasource-confluencespacetoindexfieldmapping-datefieldformat).
1384        ///
1385        /// Update type: _Mutable_.
1386        /// AWS CloudFormation doesn't replace the resource when you change this property.
1387        pub date_field_format: Option<::Value<String>>,
1388        /// Property [`IndexFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-confluencespacetoindexfieldmapping.html#cfn-kendra-datasource-confluencespacetoindexfieldmapping-indexfieldname).
1389        ///
1390        /// Update type: _Mutable_.
1391        /// AWS CloudFormation doesn't replace the resource when you change this property.
1392        pub index_field_name: ::Value<String>,
1393    }
1394
1395    impl ::codec::SerializeValue for ConfluenceSpaceToIndexFieldMapping {
1396        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1397            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1398            ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataSourceFieldName", &self.data_source_field_name)?;
1399            if let Some(ref date_field_format) = self.date_field_format {
1400                ::serde::ser::SerializeMap::serialize_entry(&mut map, "DateFieldFormat", date_field_format)?;
1401            }
1402            ::serde::ser::SerializeMap::serialize_entry(&mut map, "IndexFieldName", &self.index_field_name)?;
1403            ::serde::ser::SerializeMap::end(map)
1404        }
1405    }
1406
1407    impl ::codec::DeserializeValue for ConfluenceSpaceToIndexFieldMapping {
1408        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ConfluenceSpaceToIndexFieldMapping, D::Error> {
1409            struct Visitor;
1410
1411            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1412                type Value = ConfluenceSpaceToIndexFieldMapping;
1413
1414                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1415                    write!(f, "a struct of type ConfluenceSpaceToIndexFieldMapping")
1416                }
1417
1418                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1419                    let mut data_source_field_name: Option<::Value<String>> = None;
1420                    let mut date_field_format: Option<::Value<String>> = None;
1421                    let mut index_field_name: Option<::Value<String>> = None;
1422
1423                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1424                        match __cfn_key.as_ref() {
1425                            "DataSourceFieldName" => {
1426                                data_source_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
1427                            }
1428                            "DateFieldFormat" => {
1429                                date_field_format = ::serde::de::MapAccess::next_value(&mut map)?;
1430                            }
1431                            "IndexFieldName" => {
1432                                index_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
1433                            }
1434                            _ => {}
1435                        }
1436                    }
1437
1438                    Ok(ConfluenceSpaceToIndexFieldMapping {
1439                        data_source_field_name: data_source_field_name.ok_or(::serde::de::Error::missing_field("DataSourceFieldName"))?,
1440                        date_field_format: date_field_format,
1441                        index_field_name: index_field_name.ok_or(::serde::de::Error::missing_field("IndexFieldName"))?,
1442                    })
1443                }
1444            }
1445
1446            d.deserialize_map(Visitor)
1447        }
1448    }
1449
1450    /// The [`AWS::Kendra::DataSource.ConnectionConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-connectionconfiguration.html) property type.
1451    #[derive(Debug, Default)]
1452    pub struct ConnectionConfiguration {
1453        /// Property [`DatabaseHost`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-connectionconfiguration.html#cfn-kendra-datasource-connectionconfiguration-databasehost).
1454        ///
1455        /// Update type: _Mutable_.
1456        /// AWS CloudFormation doesn't replace the resource when you change this property.
1457        pub database_host: ::Value<String>,
1458        /// Property [`DatabaseName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-connectionconfiguration.html#cfn-kendra-datasource-connectionconfiguration-databasename).
1459        ///
1460        /// Update type: _Mutable_.
1461        /// AWS CloudFormation doesn't replace the resource when you change this property.
1462        pub database_name: ::Value<String>,
1463        /// Property [`DatabasePort`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-connectionconfiguration.html#cfn-kendra-datasource-connectionconfiguration-databaseport).
1464        ///
1465        /// Update type: _Mutable_.
1466        /// AWS CloudFormation doesn't replace the resource when you change this property.
1467        pub database_port: ::Value<u32>,
1468        /// Property [`SecretArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-connectionconfiguration.html#cfn-kendra-datasource-connectionconfiguration-secretarn).
1469        ///
1470        /// Update type: _Mutable_.
1471        /// AWS CloudFormation doesn't replace the resource when you change this property.
1472        pub secret_arn: ::Value<String>,
1473        /// Property [`TableName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-connectionconfiguration.html#cfn-kendra-datasource-connectionconfiguration-tablename).
1474        ///
1475        /// Update type: _Mutable_.
1476        /// AWS CloudFormation doesn't replace the resource when you change this property.
1477        pub table_name: ::Value<String>,
1478    }
1479
1480    impl ::codec::SerializeValue for ConnectionConfiguration {
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            ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatabaseHost", &self.database_host)?;
1484            ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatabaseName", &self.database_name)?;
1485            ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatabasePort", &self.database_port)?;
1486            ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretArn", &self.secret_arn)?;
1487            ::serde::ser::SerializeMap::serialize_entry(&mut map, "TableName", &self.table_name)?;
1488            ::serde::ser::SerializeMap::end(map)
1489        }
1490    }
1491
1492    impl ::codec::DeserializeValue for ConnectionConfiguration {
1493        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ConnectionConfiguration, D::Error> {
1494            struct Visitor;
1495
1496            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1497                type Value = ConnectionConfiguration;
1498
1499                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1500                    write!(f, "a struct of type ConnectionConfiguration")
1501                }
1502
1503                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1504                    let mut database_host: Option<::Value<String>> = None;
1505                    let mut database_name: Option<::Value<String>> = None;
1506                    let mut database_port: Option<::Value<u32>> = None;
1507                    let mut secret_arn: Option<::Value<String>> = None;
1508                    let mut table_name: Option<::Value<String>> = None;
1509
1510                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1511                        match __cfn_key.as_ref() {
1512                            "DatabaseHost" => {
1513                                database_host = ::serde::de::MapAccess::next_value(&mut map)?;
1514                            }
1515                            "DatabaseName" => {
1516                                database_name = ::serde::de::MapAccess::next_value(&mut map)?;
1517                            }
1518                            "DatabasePort" => {
1519                                database_port = ::serde::de::MapAccess::next_value(&mut map)?;
1520                            }
1521                            "SecretArn" => {
1522                                secret_arn = ::serde::de::MapAccess::next_value(&mut map)?;
1523                            }
1524                            "TableName" => {
1525                                table_name = ::serde::de::MapAccess::next_value(&mut map)?;
1526                            }
1527                            _ => {}
1528                        }
1529                    }
1530
1531                    Ok(ConnectionConfiguration {
1532                        database_host: database_host.ok_or(::serde::de::Error::missing_field("DatabaseHost"))?,
1533                        database_name: database_name.ok_or(::serde::de::Error::missing_field("DatabaseName"))?,
1534                        database_port: database_port.ok_or(::serde::de::Error::missing_field("DatabasePort"))?,
1535                        secret_arn: secret_arn.ok_or(::serde::de::Error::missing_field("SecretArn"))?,
1536                        table_name: table_name.ok_or(::serde::de::Error::missing_field("TableName"))?,
1537                    })
1538                }
1539            }
1540
1541            d.deserialize_map(Visitor)
1542        }
1543    }
1544
1545    /// The [`AWS::Kendra::DataSource.DataSourceConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourceconfiguration.html) property type.
1546    #[derive(Debug, Default)]
1547    pub struct DataSourceConfiguration {
1548        /// Property [`ConfluenceConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourceconfiguration.html#cfn-kendra-datasource-datasourceconfiguration-confluenceconfiguration).
1549        ///
1550        /// Update type: _Mutable_.
1551        /// AWS CloudFormation doesn't replace the resource when you change this property.
1552        pub confluence_configuration: Option<::Value<ConfluenceConfiguration>>,
1553        /// Property [`DatabaseConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourceconfiguration.html#cfn-kendra-datasource-datasourceconfiguration-databaseconfiguration).
1554        ///
1555        /// Update type: _Mutable_.
1556        /// AWS CloudFormation doesn't replace the resource when you change this property.
1557        pub database_configuration: Option<::Value<DatabaseConfiguration>>,
1558        /// Property [`GoogleDriveConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourceconfiguration.html#cfn-kendra-datasource-datasourceconfiguration-googledriveconfiguration).
1559        ///
1560        /// Update type: _Mutable_.
1561        /// AWS CloudFormation doesn't replace the resource when you change this property.
1562        pub google_drive_configuration: Option<::Value<GoogleDriveConfiguration>>,
1563        /// Property [`OneDriveConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourceconfiguration.html#cfn-kendra-datasource-datasourceconfiguration-onedriveconfiguration).
1564        ///
1565        /// Update type: _Mutable_.
1566        /// AWS CloudFormation doesn't replace the resource when you change this property.
1567        pub one_drive_configuration: Option<::Value<OneDriveConfiguration>>,
1568        /// Property [`S3Configuration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourceconfiguration.html#cfn-kendra-datasource-datasourceconfiguration-s3configuration).
1569        ///
1570        /// Update type: _Mutable_.
1571        /// AWS CloudFormation doesn't replace the resource when you change this property.
1572        pub s3_configuration: Option<::Value<S3DataSourceConfiguration>>,
1573        /// Property [`SalesforceConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourceconfiguration.html#cfn-kendra-datasource-datasourceconfiguration-salesforceconfiguration).
1574        ///
1575        /// Update type: _Mutable_.
1576        /// AWS CloudFormation doesn't replace the resource when you change this property.
1577        pub salesforce_configuration: Option<::Value<SalesforceConfiguration>>,
1578        /// Property [`ServiceNowConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourceconfiguration.html#cfn-kendra-datasource-datasourceconfiguration-servicenowconfiguration).
1579        ///
1580        /// Update type: _Mutable_.
1581        /// AWS CloudFormation doesn't replace the resource when you change this property.
1582        pub service_now_configuration: Option<::Value<ServiceNowConfiguration>>,
1583        /// Property [`SharePointConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourceconfiguration.html#cfn-kendra-datasource-datasourceconfiguration-sharepointconfiguration).
1584        ///
1585        /// Update type: _Mutable_.
1586        /// AWS CloudFormation doesn't replace the resource when you change this property.
1587        pub share_point_configuration: Option<::Value<SharePointConfiguration>>,
1588    }
1589
1590    impl ::codec::SerializeValue for DataSourceConfiguration {
1591        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1592            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1593            if let Some(ref confluence_configuration) = self.confluence_configuration {
1594                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConfluenceConfiguration", confluence_configuration)?;
1595            }
1596            if let Some(ref database_configuration) = self.database_configuration {
1597                ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatabaseConfiguration", database_configuration)?;
1598            }
1599            if let Some(ref google_drive_configuration) = self.google_drive_configuration {
1600                ::serde::ser::SerializeMap::serialize_entry(&mut map, "GoogleDriveConfiguration", google_drive_configuration)?;
1601            }
1602            if let Some(ref one_drive_configuration) = self.one_drive_configuration {
1603                ::serde::ser::SerializeMap::serialize_entry(&mut map, "OneDriveConfiguration", one_drive_configuration)?;
1604            }
1605            if let Some(ref s3_configuration) = self.s3_configuration {
1606                ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3Configuration", s3_configuration)?;
1607            }
1608            if let Some(ref salesforce_configuration) = self.salesforce_configuration {
1609                ::serde::ser::SerializeMap::serialize_entry(&mut map, "SalesforceConfiguration", salesforce_configuration)?;
1610            }
1611            if let Some(ref service_now_configuration) = self.service_now_configuration {
1612                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServiceNowConfiguration", service_now_configuration)?;
1613            }
1614            if let Some(ref share_point_configuration) = self.share_point_configuration {
1615                ::serde::ser::SerializeMap::serialize_entry(&mut map, "SharePointConfiguration", share_point_configuration)?;
1616            }
1617            ::serde::ser::SerializeMap::end(map)
1618        }
1619    }
1620
1621    impl ::codec::DeserializeValue for DataSourceConfiguration {
1622        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<DataSourceConfiguration, D::Error> {
1623            struct Visitor;
1624
1625            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1626                type Value = DataSourceConfiguration;
1627
1628                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1629                    write!(f, "a struct of type DataSourceConfiguration")
1630                }
1631
1632                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1633                    let mut confluence_configuration: Option<::Value<ConfluenceConfiguration>> = None;
1634                    let mut database_configuration: Option<::Value<DatabaseConfiguration>> = None;
1635                    let mut google_drive_configuration: Option<::Value<GoogleDriveConfiguration>> = None;
1636                    let mut one_drive_configuration: Option<::Value<OneDriveConfiguration>> = None;
1637                    let mut s3_configuration: Option<::Value<S3DataSourceConfiguration>> = None;
1638                    let mut salesforce_configuration: Option<::Value<SalesforceConfiguration>> = None;
1639                    let mut service_now_configuration: Option<::Value<ServiceNowConfiguration>> = None;
1640                    let mut share_point_configuration: Option<::Value<SharePointConfiguration>> = None;
1641
1642                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1643                        match __cfn_key.as_ref() {
1644                            "ConfluenceConfiguration" => {
1645                                confluence_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
1646                            }
1647                            "DatabaseConfiguration" => {
1648                                database_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
1649                            }
1650                            "GoogleDriveConfiguration" => {
1651                                google_drive_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
1652                            }
1653                            "OneDriveConfiguration" => {
1654                                one_drive_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
1655                            }
1656                            "S3Configuration" => {
1657                                s3_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
1658                            }
1659                            "SalesforceConfiguration" => {
1660                                salesforce_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
1661                            }
1662                            "ServiceNowConfiguration" => {
1663                                service_now_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
1664                            }
1665                            "SharePointConfiguration" => {
1666                                share_point_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
1667                            }
1668                            _ => {}
1669                        }
1670                    }
1671
1672                    Ok(DataSourceConfiguration {
1673                        confluence_configuration: confluence_configuration,
1674                        database_configuration: database_configuration,
1675                        google_drive_configuration: google_drive_configuration,
1676                        one_drive_configuration: one_drive_configuration,
1677                        s3_configuration: s3_configuration,
1678                        salesforce_configuration: salesforce_configuration,
1679                        service_now_configuration: service_now_configuration,
1680                        share_point_configuration: share_point_configuration,
1681                    })
1682                }
1683            }
1684
1685            d.deserialize_map(Visitor)
1686        }
1687    }
1688
1689    /// The [`AWS::Kendra::DataSource.DataSourceToIndexFieldMapping`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourcetoindexfieldmapping.html) property type.
1690    #[derive(Debug, Default)]
1691    pub struct DataSourceToIndexFieldMapping {
1692        /// Property [`DataSourceFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourcetoindexfieldmapping.html#cfn-kendra-datasource-datasourcetoindexfieldmapping-datasourcefieldname).
1693        ///
1694        /// Update type: _Mutable_.
1695        /// AWS CloudFormation doesn't replace the resource when you change this property.
1696        pub data_source_field_name: ::Value<String>,
1697        /// Property [`DateFieldFormat`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourcetoindexfieldmapping.html#cfn-kendra-datasource-datasourcetoindexfieldmapping-datefieldformat).
1698        ///
1699        /// Update type: _Mutable_.
1700        /// AWS CloudFormation doesn't replace the resource when you change this property.
1701        pub date_field_format: Option<::Value<String>>,
1702        /// Property [`IndexFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourcetoindexfieldmapping.html#cfn-kendra-datasource-datasourcetoindexfieldmapping-indexfieldname).
1703        ///
1704        /// Update type: _Mutable_.
1705        /// AWS CloudFormation doesn't replace the resource when you change this property.
1706        pub index_field_name: ::Value<String>,
1707    }
1708
1709    impl ::codec::SerializeValue for DataSourceToIndexFieldMapping {
1710        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1711            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1712            ::serde::ser::SerializeMap::serialize_entry(&mut map, "DataSourceFieldName", &self.data_source_field_name)?;
1713            if let Some(ref date_field_format) = self.date_field_format {
1714                ::serde::ser::SerializeMap::serialize_entry(&mut map, "DateFieldFormat", date_field_format)?;
1715            }
1716            ::serde::ser::SerializeMap::serialize_entry(&mut map, "IndexFieldName", &self.index_field_name)?;
1717            ::serde::ser::SerializeMap::end(map)
1718        }
1719    }
1720
1721    impl ::codec::DeserializeValue for DataSourceToIndexFieldMapping {
1722        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<DataSourceToIndexFieldMapping, D::Error> {
1723            struct Visitor;
1724
1725            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1726                type Value = DataSourceToIndexFieldMapping;
1727
1728                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1729                    write!(f, "a struct of type DataSourceToIndexFieldMapping")
1730                }
1731
1732                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1733                    let mut data_source_field_name: Option<::Value<String>> = None;
1734                    let mut date_field_format: Option<::Value<String>> = None;
1735                    let mut index_field_name: Option<::Value<String>> = None;
1736
1737                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1738                        match __cfn_key.as_ref() {
1739                            "DataSourceFieldName" => {
1740                                data_source_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
1741                            }
1742                            "DateFieldFormat" => {
1743                                date_field_format = ::serde::de::MapAccess::next_value(&mut map)?;
1744                            }
1745                            "IndexFieldName" => {
1746                                index_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
1747                            }
1748                            _ => {}
1749                        }
1750                    }
1751
1752                    Ok(DataSourceToIndexFieldMapping {
1753                        data_source_field_name: data_source_field_name.ok_or(::serde::de::Error::missing_field("DataSourceFieldName"))?,
1754                        date_field_format: date_field_format,
1755                        index_field_name: index_field_name.ok_or(::serde::de::Error::missing_field("IndexFieldName"))?,
1756                    })
1757                }
1758            }
1759
1760            d.deserialize_map(Visitor)
1761        }
1762    }
1763
1764    /// The [`AWS::Kendra::DataSource.DataSourceVpcConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourcevpcconfiguration.html) property type.
1765    #[derive(Debug, Default)]
1766    pub struct DataSourceVpcConfiguration {
1767        /// Property [`SecurityGroupIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourcevpcconfiguration.html#cfn-kendra-datasource-datasourcevpcconfiguration-securitygroupids).
1768        ///
1769        /// Update type: _Mutable_.
1770        /// AWS CloudFormation doesn't replace the resource when you change this property.
1771        pub security_group_ids: ::ValueList<String>,
1772        /// Property [`SubnetIds`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-datasourcevpcconfiguration.html#cfn-kendra-datasource-datasourcevpcconfiguration-subnetids).
1773        ///
1774        /// Update type: _Mutable_.
1775        /// AWS CloudFormation doesn't replace the resource when you change this property.
1776        pub subnet_ids: ::ValueList<String>,
1777    }
1778
1779    impl ::codec::SerializeValue for DataSourceVpcConfiguration {
1780        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1781            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1782            ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecurityGroupIds", &self.security_group_ids)?;
1783            ::serde::ser::SerializeMap::serialize_entry(&mut map, "SubnetIds", &self.subnet_ids)?;
1784            ::serde::ser::SerializeMap::end(map)
1785        }
1786    }
1787
1788    impl ::codec::DeserializeValue for DataSourceVpcConfiguration {
1789        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<DataSourceVpcConfiguration, D::Error> {
1790            struct Visitor;
1791
1792            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1793                type Value = DataSourceVpcConfiguration;
1794
1795                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1796                    write!(f, "a struct of type DataSourceVpcConfiguration")
1797                }
1798
1799                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1800                    let mut security_group_ids: Option<::ValueList<String>> = None;
1801                    let mut subnet_ids: Option<::ValueList<String>> = None;
1802
1803                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1804                        match __cfn_key.as_ref() {
1805                            "SecurityGroupIds" => {
1806                                security_group_ids = ::serde::de::MapAccess::next_value(&mut map)?;
1807                            }
1808                            "SubnetIds" => {
1809                                subnet_ids = ::serde::de::MapAccess::next_value(&mut map)?;
1810                            }
1811                            _ => {}
1812                        }
1813                    }
1814
1815                    Ok(DataSourceVpcConfiguration {
1816                        security_group_ids: security_group_ids.ok_or(::serde::de::Error::missing_field("SecurityGroupIds"))?,
1817                        subnet_ids: subnet_ids.ok_or(::serde::de::Error::missing_field("SubnetIds"))?,
1818                    })
1819                }
1820            }
1821
1822            d.deserialize_map(Visitor)
1823        }
1824    }
1825
1826    /// The [`AWS::Kendra::DataSource.DatabaseConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-databaseconfiguration.html) property type.
1827    #[derive(Debug, Default)]
1828    pub struct DatabaseConfiguration {
1829        /// Property [`AclConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-databaseconfiguration.html#cfn-kendra-datasource-databaseconfiguration-aclconfiguration).
1830        ///
1831        /// Update type: _Mutable_.
1832        /// AWS CloudFormation doesn't replace the resource when you change this property.
1833        pub acl_configuration: Option<::Value<AclConfiguration>>,
1834        /// Property [`ColumnConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-databaseconfiguration.html#cfn-kendra-datasource-databaseconfiguration-columnconfiguration).
1835        ///
1836        /// Update type: _Mutable_.
1837        /// AWS CloudFormation doesn't replace the resource when you change this property.
1838        pub column_configuration: ::Value<ColumnConfiguration>,
1839        /// Property [`ConnectionConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-databaseconfiguration.html#cfn-kendra-datasource-databaseconfiguration-connectionconfiguration).
1840        ///
1841        /// Update type: _Mutable_.
1842        /// AWS CloudFormation doesn't replace the resource when you change this property.
1843        pub connection_configuration: ::Value<ConnectionConfiguration>,
1844        /// Property [`DatabaseEngineType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-databaseconfiguration.html#cfn-kendra-datasource-databaseconfiguration-databaseenginetype).
1845        ///
1846        /// Update type: _Mutable_.
1847        /// AWS CloudFormation doesn't replace the resource when you change this property.
1848        pub database_engine_type: ::Value<String>,
1849        /// Property [`SqlConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-databaseconfiguration.html#cfn-kendra-datasource-databaseconfiguration-sqlconfiguration).
1850        ///
1851        /// Update type: _Mutable_.
1852        /// AWS CloudFormation doesn't replace the resource when you change this property.
1853        pub sql_configuration: Option<::Value<SqlConfiguration>>,
1854        /// Property [`VpcConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-databaseconfiguration.html#cfn-kendra-datasource-databaseconfiguration-vpcconfiguration).
1855        ///
1856        /// Update type: _Mutable_.
1857        /// AWS CloudFormation doesn't replace the resource when you change this property.
1858        pub vpc_configuration: Option<::Value<DataSourceVpcConfiguration>>,
1859    }
1860
1861    impl ::codec::SerializeValue for DatabaseConfiguration {
1862        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1863            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1864            if let Some(ref acl_configuration) = self.acl_configuration {
1865                ::serde::ser::SerializeMap::serialize_entry(&mut map, "AclConfiguration", acl_configuration)?;
1866            }
1867            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ColumnConfiguration", &self.column_configuration)?;
1868            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConnectionConfiguration", &self.connection_configuration)?;
1869            ::serde::ser::SerializeMap::serialize_entry(&mut map, "DatabaseEngineType", &self.database_engine_type)?;
1870            if let Some(ref sql_configuration) = self.sql_configuration {
1871                ::serde::ser::SerializeMap::serialize_entry(&mut map, "SqlConfiguration", sql_configuration)?;
1872            }
1873            if let Some(ref vpc_configuration) = self.vpc_configuration {
1874                ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcConfiguration", vpc_configuration)?;
1875            }
1876            ::serde::ser::SerializeMap::end(map)
1877        }
1878    }
1879
1880    impl ::codec::DeserializeValue for DatabaseConfiguration {
1881        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<DatabaseConfiguration, D::Error> {
1882            struct Visitor;
1883
1884            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1885                type Value = DatabaseConfiguration;
1886
1887                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1888                    write!(f, "a struct of type DatabaseConfiguration")
1889                }
1890
1891                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1892                    let mut acl_configuration: Option<::Value<AclConfiguration>> = None;
1893                    let mut column_configuration: Option<::Value<ColumnConfiguration>> = None;
1894                    let mut connection_configuration: Option<::Value<ConnectionConfiguration>> = None;
1895                    let mut database_engine_type: Option<::Value<String>> = None;
1896                    let mut sql_configuration: Option<::Value<SqlConfiguration>> = None;
1897                    let mut vpc_configuration: Option<::Value<DataSourceVpcConfiguration>> = None;
1898
1899                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1900                        match __cfn_key.as_ref() {
1901                            "AclConfiguration" => {
1902                                acl_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
1903                            }
1904                            "ColumnConfiguration" => {
1905                                column_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
1906                            }
1907                            "ConnectionConfiguration" => {
1908                                connection_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
1909                            }
1910                            "DatabaseEngineType" => {
1911                                database_engine_type = ::serde::de::MapAccess::next_value(&mut map)?;
1912                            }
1913                            "SqlConfiguration" => {
1914                                sql_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
1915                            }
1916                            "VpcConfiguration" => {
1917                                vpc_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
1918                            }
1919                            _ => {}
1920                        }
1921                    }
1922
1923                    Ok(DatabaseConfiguration {
1924                        acl_configuration: acl_configuration,
1925                        column_configuration: column_configuration.ok_or(::serde::de::Error::missing_field("ColumnConfiguration"))?,
1926                        connection_configuration: connection_configuration.ok_or(::serde::de::Error::missing_field("ConnectionConfiguration"))?,
1927                        database_engine_type: database_engine_type.ok_or(::serde::de::Error::missing_field("DatabaseEngineType"))?,
1928                        sql_configuration: sql_configuration,
1929                        vpc_configuration: vpc_configuration,
1930                    })
1931                }
1932            }
1933
1934            d.deserialize_map(Visitor)
1935        }
1936    }
1937
1938    /// The [`AWS::Kendra::DataSource.DocumentsMetadataConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentsmetadataconfiguration.html) property type.
1939    #[derive(Debug, Default)]
1940    pub struct DocumentsMetadataConfiguration {
1941        /// Property [`S3Prefix`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-documentsmetadataconfiguration.html#cfn-kendra-datasource-documentsmetadataconfiguration-s3prefix).
1942        ///
1943        /// Update type: _Mutable_.
1944        /// AWS CloudFormation doesn't replace the resource when you change this property.
1945        pub s3_prefix: Option<::Value<String>>,
1946    }
1947
1948    impl ::codec::SerializeValue for DocumentsMetadataConfiguration {
1949        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1950            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1951            if let Some(ref s3_prefix) = self.s3_prefix {
1952                ::serde::ser::SerializeMap::serialize_entry(&mut map, "S3Prefix", s3_prefix)?;
1953            }
1954            ::serde::ser::SerializeMap::end(map)
1955        }
1956    }
1957
1958    impl ::codec::DeserializeValue for DocumentsMetadataConfiguration {
1959        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<DocumentsMetadataConfiguration, D::Error> {
1960            struct Visitor;
1961
1962            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1963                type Value = DocumentsMetadataConfiguration;
1964
1965                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1966                    write!(f, "a struct of type DocumentsMetadataConfiguration")
1967                }
1968
1969                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1970                    let mut s3_prefix: Option<::Value<String>> = None;
1971
1972                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1973                        match __cfn_key.as_ref() {
1974                            "S3Prefix" => {
1975                                s3_prefix = ::serde::de::MapAccess::next_value(&mut map)?;
1976                            }
1977                            _ => {}
1978                        }
1979                    }
1980
1981                    Ok(DocumentsMetadataConfiguration {
1982                        s3_prefix: s3_prefix,
1983                    })
1984                }
1985            }
1986
1987            d.deserialize_map(Visitor)
1988        }
1989    }
1990
1991    /// The [`AWS::Kendra::DataSource.GoogleDriveConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-googledriveconfiguration.html) property type.
1992    #[derive(Debug, Default)]
1993    pub struct GoogleDriveConfiguration {
1994        /// Property [`ExcludeMimeTypes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-googledriveconfiguration.html#cfn-kendra-datasource-googledriveconfiguration-excludemimetypes).
1995        ///
1996        /// Update type: _Mutable_.
1997        /// AWS CloudFormation doesn't replace the resource when you change this property.
1998        pub exclude_mime_types: Option<::ValueList<String>>,
1999        /// Property [`ExcludeSharedDrives`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-googledriveconfiguration.html#cfn-kendra-datasource-googledriveconfiguration-excludeshareddrives).
2000        ///
2001        /// Update type: _Mutable_.
2002        /// AWS CloudFormation doesn't replace the resource when you change this property.
2003        pub exclude_shared_drives: Option<::ValueList<String>>,
2004        /// Property [`ExcludeUserAccounts`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-googledriveconfiguration.html#cfn-kendra-datasource-googledriveconfiguration-excludeuseraccounts).
2005        ///
2006        /// Update type: _Mutable_.
2007        /// AWS CloudFormation doesn't replace the resource when you change this property.
2008        pub exclude_user_accounts: Option<::ValueList<String>>,
2009        /// Property [`ExclusionPatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-googledriveconfiguration.html#cfn-kendra-datasource-googledriveconfiguration-exclusionpatterns).
2010        ///
2011        /// Update type: _Mutable_.
2012        /// AWS CloudFormation doesn't replace the resource when you change this property.
2013        pub exclusion_patterns: Option<::ValueList<String>>,
2014        /// Property [`FieldMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-googledriveconfiguration.html#cfn-kendra-datasource-googledriveconfiguration-fieldmappings).
2015        ///
2016        /// Update type: _Mutable_.
2017        /// AWS CloudFormation doesn't replace the resource when you change this property.
2018        pub field_mappings: Option<::ValueList<DataSourceToIndexFieldMapping>>,
2019        /// Property [`InclusionPatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-googledriveconfiguration.html#cfn-kendra-datasource-googledriveconfiguration-inclusionpatterns).
2020        ///
2021        /// Update type: _Mutable_.
2022        /// AWS CloudFormation doesn't replace the resource when you change this property.
2023        pub inclusion_patterns: Option<::ValueList<String>>,
2024        /// Property [`SecretArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-googledriveconfiguration.html#cfn-kendra-datasource-googledriveconfiguration-secretarn).
2025        ///
2026        /// Update type: _Mutable_.
2027        /// AWS CloudFormation doesn't replace the resource when you change this property.
2028        pub secret_arn: ::Value<String>,
2029    }
2030
2031    impl ::codec::SerializeValue for GoogleDriveConfiguration {
2032        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2033            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2034            if let Some(ref exclude_mime_types) = self.exclude_mime_types {
2035                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExcludeMimeTypes", exclude_mime_types)?;
2036            }
2037            if let Some(ref exclude_shared_drives) = self.exclude_shared_drives {
2038                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExcludeSharedDrives", exclude_shared_drives)?;
2039            }
2040            if let Some(ref exclude_user_accounts) = self.exclude_user_accounts {
2041                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExcludeUserAccounts", exclude_user_accounts)?;
2042            }
2043            if let Some(ref exclusion_patterns) = self.exclusion_patterns {
2044                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExclusionPatterns", exclusion_patterns)?;
2045            }
2046            if let Some(ref field_mappings) = self.field_mappings {
2047                ::serde::ser::SerializeMap::serialize_entry(&mut map, "FieldMappings", field_mappings)?;
2048            }
2049            if let Some(ref inclusion_patterns) = self.inclusion_patterns {
2050                ::serde::ser::SerializeMap::serialize_entry(&mut map, "InclusionPatterns", inclusion_patterns)?;
2051            }
2052            ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretArn", &self.secret_arn)?;
2053            ::serde::ser::SerializeMap::end(map)
2054        }
2055    }
2056
2057    impl ::codec::DeserializeValue for GoogleDriveConfiguration {
2058        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<GoogleDriveConfiguration, D::Error> {
2059            struct Visitor;
2060
2061            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2062                type Value = GoogleDriveConfiguration;
2063
2064                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2065                    write!(f, "a struct of type GoogleDriveConfiguration")
2066                }
2067
2068                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2069                    let mut exclude_mime_types: Option<::ValueList<String>> = None;
2070                    let mut exclude_shared_drives: Option<::ValueList<String>> = None;
2071                    let mut exclude_user_accounts: Option<::ValueList<String>> = None;
2072                    let mut exclusion_patterns: Option<::ValueList<String>> = None;
2073                    let mut field_mappings: Option<::ValueList<DataSourceToIndexFieldMapping>> = None;
2074                    let mut inclusion_patterns: Option<::ValueList<String>> = None;
2075                    let mut secret_arn: Option<::Value<String>> = None;
2076
2077                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2078                        match __cfn_key.as_ref() {
2079                            "ExcludeMimeTypes" => {
2080                                exclude_mime_types = ::serde::de::MapAccess::next_value(&mut map)?;
2081                            }
2082                            "ExcludeSharedDrives" => {
2083                                exclude_shared_drives = ::serde::de::MapAccess::next_value(&mut map)?;
2084                            }
2085                            "ExcludeUserAccounts" => {
2086                                exclude_user_accounts = ::serde::de::MapAccess::next_value(&mut map)?;
2087                            }
2088                            "ExclusionPatterns" => {
2089                                exclusion_patterns = ::serde::de::MapAccess::next_value(&mut map)?;
2090                            }
2091                            "FieldMappings" => {
2092                                field_mappings = ::serde::de::MapAccess::next_value(&mut map)?;
2093                            }
2094                            "InclusionPatterns" => {
2095                                inclusion_patterns = ::serde::de::MapAccess::next_value(&mut map)?;
2096                            }
2097                            "SecretArn" => {
2098                                secret_arn = ::serde::de::MapAccess::next_value(&mut map)?;
2099                            }
2100                            _ => {}
2101                        }
2102                    }
2103
2104                    Ok(GoogleDriveConfiguration {
2105                        exclude_mime_types: exclude_mime_types,
2106                        exclude_shared_drives: exclude_shared_drives,
2107                        exclude_user_accounts: exclude_user_accounts,
2108                        exclusion_patterns: exclusion_patterns,
2109                        field_mappings: field_mappings,
2110                        inclusion_patterns: inclusion_patterns,
2111                        secret_arn: secret_arn.ok_or(::serde::de::Error::missing_field("SecretArn"))?,
2112                    })
2113                }
2114            }
2115
2116            d.deserialize_map(Visitor)
2117        }
2118    }
2119
2120    /// The [`AWS::Kendra::DataSource.OneDriveConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html) property type.
2121    #[derive(Debug, Default)]
2122    pub struct OneDriveConfiguration {
2123        /// Property [`DisableLocalGroups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-disablelocalgroups).
2124        ///
2125        /// Update type: _Mutable_.
2126        /// AWS CloudFormation doesn't replace the resource when you change this property.
2127        pub disable_local_groups: Option<::Value<bool>>,
2128        /// Property [`ExclusionPatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-exclusionpatterns).
2129        ///
2130        /// Update type: _Mutable_.
2131        /// AWS CloudFormation doesn't replace the resource when you change this property.
2132        pub exclusion_patterns: Option<::ValueList<String>>,
2133        /// Property [`FieldMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-fieldmappings).
2134        ///
2135        /// Update type: _Mutable_.
2136        /// AWS CloudFormation doesn't replace the resource when you change this property.
2137        pub field_mappings: Option<::ValueList<DataSourceToIndexFieldMapping>>,
2138        /// Property [`InclusionPatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-inclusionpatterns).
2139        ///
2140        /// Update type: _Mutable_.
2141        /// AWS CloudFormation doesn't replace the resource when you change this property.
2142        pub inclusion_patterns: Option<::ValueList<String>>,
2143        /// Property [`OneDriveUsers`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-onedriveusers).
2144        ///
2145        /// Update type: _Mutable_.
2146        /// AWS CloudFormation doesn't replace the resource when you change this property.
2147        pub one_drive_users: ::Value<OneDriveUsers>,
2148        /// Property [`SecretArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-secretarn).
2149        ///
2150        /// Update type: _Mutable_.
2151        /// AWS CloudFormation doesn't replace the resource when you change this property.
2152        pub secret_arn: ::Value<String>,
2153        /// Property [`TenantDomain`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveconfiguration.html#cfn-kendra-datasource-onedriveconfiguration-tenantdomain).
2154        ///
2155        /// Update type: _Mutable_.
2156        /// AWS CloudFormation doesn't replace the resource when you change this property.
2157        pub tenant_domain: ::Value<String>,
2158    }
2159
2160    impl ::codec::SerializeValue for OneDriveConfiguration {
2161        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2162            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2163            if let Some(ref disable_local_groups) = self.disable_local_groups {
2164                ::serde::ser::SerializeMap::serialize_entry(&mut map, "DisableLocalGroups", disable_local_groups)?;
2165            }
2166            if let Some(ref exclusion_patterns) = self.exclusion_patterns {
2167                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExclusionPatterns", exclusion_patterns)?;
2168            }
2169            if let Some(ref field_mappings) = self.field_mappings {
2170                ::serde::ser::SerializeMap::serialize_entry(&mut map, "FieldMappings", field_mappings)?;
2171            }
2172            if let Some(ref inclusion_patterns) = self.inclusion_patterns {
2173                ::serde::ser::SerializeMap::serialize_entry(&mut map, "InclusionPatterns", inclusion_patterns)?;
2174            }
2175            ::serde::ser::SerializeMap::serialize_entry(&mut map, "OneDriveUsers", &self.one_drive_users)?;
2176            ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretArn", &self.secret_arn)?;
2177            ::serde::ser::SerializeMap::serialize_entry(&mut map, "TenantDomain", &self.tenant_domain)?;
2178            ::serde::ser::SerializeMap::end(map)
2179        }
2180    }
2181
2182    impl ::codec::DeserializeValue for OneDriveConfiguration {
2183        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<OneDriveConfiguration, D::Error> {
2184            struct Visitor;
2185
2186            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2187                type Value = OneDriveConfiguration;
2188
2189                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2190                    write!(f, "a struct of type OneDriveConfiguration")
2191                }
2192
2193                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2194                    let mut disable_local_groups: Option<::Value<bool>> = None;
2195                    let mut exclusion_patterns: Option<::ValueList<String>> = None;
2196                    let mut field_mappings: Option<::ValueList<DataSourceToIndexFieldMapping>> = None;
2197                    let mut inclusion_patterns: Option<::ValueList<String>> = None;
2198                    let mut one_drive_users: Option<::Value<OneDriveUsers>> = None;
2199                    let mut secret_arn: Option<::Value<String>> = None;
2200                    let mut tenant_domain: Option<::Value<String>> = None;
2201
2202                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2203                        match __cfn_key.as_ref() {
2204                            "DisableLocalGroups" => {
2205                                disable_local_groups = ::serde::de::MapAccess::next_value(&mut map)?;
2206                            }
2207                            "ExclusionPatterns" => {
2208                                exclusion_patterns = ::serde::de::MapAccess::next_value(&mut map)?;
2209                            }
2210                            "FieldMappings" => {
2211                                field_mappings = ::serde::de::MapAccess::next_value(&mut map)?;
2212                            }
2213                            "InclusionPatterns" => {
2214                                inclusion_patterns = ::serde::de::MapAccess::next_value(&mut map)?;
2215                            }
2216                            "OneDriveUsers" => {
2217                                one_drive_users = ::serde::de::MapAccess::next_value(&mut map)?;
2218                            }
2219                            "SecretArn" => {
2220                                secret_arn = ::serde::de::MapAccess::next_value(&mut map)?;
2221                            }
2222                            "TenantDomain" => {
2223                                tenant_domain = ::serde::de::MapAccess::next_value(&mut map)?;
2224                            }
2225                            _ => {}
2226                        }
2227                    }
2228
2229                    Ok(OneDriveConfiguration {
2230                        disable_local_groups: disable_local_groups,
2231                        exclusion_patterns: exclusion_patterns,
2232                        field_mappings: field_mappings,
2233                        inclusion_patterns: inclusion_patterns,
2234                        one_drive_users: one_drive_users.ok_or(::serde::de::Error::missing_field("OneDriveUsers"))?,
2235                        secret_arn: secret_arn.ok_or(::serde::de::Error::missing_field("SecretArn"))?,
2236                        tenant_domain: tenant_domain.ok_or(::serde::de::Error::missing_field("TenantDomain"))?,
2237                    })
2238                }
2239            }
2240
2241            d.deserialize_map(Visitor)
2242        }
2243    }
2244
2245    /// The [`AWS::Kendra::DataSource.OneDriveUsers`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveusers.html) property type.
2246    #[derive(Debug, Default)]
2247    pub struct OneDriveUsers {
2248        /// Property [`OneDriveUserList`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveusers.html#cfn-kendra-datasource-onedriveusers-onedriveuserlist).
2249        ///
2250        /// Update type: _Mutable_.
2251        /// AWS CloudFormation doesn't replace the resource when you change this property.
2252        pub one_drive_user_list: Option<::ValueList<String>>,
2253        /// Property [`OneDriveUserS3Path`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-onedriveusers.html#cfn-kendra-datasource-onedriveusers-onedriveusers3path).
2254        ///
2255        /// Update type: _Mutable_.
2256        /// AWS CloudFormation doesn't replace the resource when you change this property.
2257        pub one_drive_user_s3_path: Option<::Value<S3Path>>,
2258    }
2259
2260    impl ::codec::SerializeValue for OneDriveUsers {
2261        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2262            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2263            if let Some(ref one_drive_user_list) = self.one_drive_user_list {
2264                ::serde::ser::SerializeMap::serialize_entry(&mut map, "OneDriveUserList", one_drive_user_list)?;
2265            }
2266            if let Some(ref one_drive_user_s3_path) = self.one_drive_user_s3_path {
2267                ::serde::ser::SerializeMap::serialize_entry(&mut map, "OneDriveUserS3Path", one_drive_user_s3_path)?;
2268            }
2269            ::serde::ser::SerializeMap::end(map)
2270        }
2271    }
2272
2273    impl ::codec::DeserializeValue for OneDriveUsers {
2274        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<OneDriveUsers, D::Error> {
2275            struct Visitor;
2276
2277            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2278                type Value = OneDriveUsers;
2279
2280                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2281                    write!(f, "a struct of type OneDriveUsers")
2282                }
2283
2284                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2285                    let mut one_drive_user_list: Option<::ValueList<String>> = None;
2286                    let mut one_drive_user_s3_path: Option<::Value<S3Path>> = None;
2287
2288                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2289                        match __cfn_key.as_ref() {
2290                            "OneDriveUserList" => {
2291                                one_drive_user_list = ::serde::de::MapAccess::next_value(&mut map)?;
2292                            }
2293                            "OneDriveUserS3Path" => {
2294                                one_drive_user_s3_path = ::serde::de::MapAccess::next_value(&mut map)?;
2295                            }
2296                            _ => {}
2297                        }
2298                    }
2299
2300                    Ok(OneDriveUsers {
2301                        one_drive_user_list: one_drive_user_list,
2302                        one_drive_user_s3_path: one_drive_user_s3_path,
2303                    })
2304                }
2305            }
2306
2307            d.deserialize_map(Visitor)
2308        }
2309    }
2310
2311    /// The [`AWS::Kendra::DataSource.S3DataSourceConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-s3datasourceconfiguration.html) property type.
2312    #[derive(Debug, Default)]
2313    pub struct S3DataSourceConfiguration {
2314        /// Property [`AccessControlListConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-s3datasourceconfiguration.html#cfn-kendra-datasource-s3datasourceconfiguration-accesscontrollistconfiguration).
2315        ///
2316        /// Update type: _Mutable_.
2317        /// AWS CloudFormation doesn't replace the resource when you change this property.
2318        pub access_control_list_configuration: Option<::Value<AccessControlListConfiguration>>,
2319        /// Property [`BucketName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-s3datasourceconfiguration.html#cfn-kendra-datasource-s3datasourceconfiguration-bucketname).
2320        ///
2321        /// Update type: _Mutable_.
2322        /// AWS CloudFormation doesn't replace the resource when you change this property.
2323        pub bucket_name: ::Value<String>,
2324        /// Property [`DocumentsMetadataConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-s3datasourceconfiguration.html#cfn-kendra-datasource-s3datasourceconfiguration-documentsmetadataconfiguration).
2325        ///
2326        /// Update type: _Mutable_.
2327        /// AWS CloudFormation doesn't replace the resource when you change this property.
2328        pub documents_metadata_configuration: Option<::Value<DocumentsMetadataConfiguration>>,
2329        /// Property [`ExclusionPatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-s3datasourceconfiguration.html#cfn-kendra-datasource-s3datasourceconfiguration-exclusionpatterns).
2330        ///
2331        /// Update type: _Mutable_.
2332        /// AWS CloudFormation doesn't replace the resource when you change this property.
2333        pub exclusion_patterns: Option<::ValueList<String>>,
2334        /// Property [`InclusionPatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-s3datasourceconfiguration.html#cfn-kendra-datasource-s3datasourceconfiguration-inclusionpatterns).
2335        ///
2336        /// Update type: _Mutable_.
2337        /// AWS CloudFormation doesn't replace the resource when you change this property.
2338        pub inclusion_patterns: Option<::ValueList<String>>,
2339        /// Property [`InclusionPrefixes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-s3datasourceconfiguration.html#cfn-kendra-datasource-s3datasourceconfiguration-inclusionprefixes).
2340        ///
2341        /// Update type: _Mutable_.
2342        /// AWS CloudFormation doesn't replace the resource when you change this property.
2343        pub inclusion_prefixes: Option<::ValueList<String>>,
2344    }
2345
2346    impl ::codec::SerializeValue for S3DataSourceConfiguration {
2347        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2348            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2349            if let Some(ref access_control_list_configuration) = self.access_control_list_configuration {
2350                ::serde::ser::SerializeMap::serialize_entry(&mut map, "AccessControlListConfiguration", access_control_list_configuration)?;
2351            }
2352            ::serde::ser::SerializeMap::serialize_entry(&mut map, "BucketName", &self.bucket_name)?;
2353            if let Some(ref documents_metadata_configuration) = self.documents_metadata_configuration {
2354                ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentsMetadataConfiguration", documents_metadata_configuration)?;
2355            }
2356            if let Some(ref exclusion_patterns) = self.exclusion_patterns {
2357                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExclusionPatterns", exclusion_patterns)?;
2358            }
2359            if let Some(ref inclusion_patterns) = self.inclusion_patterns {
2360                ::serde::ser::SerializeMap::serialize_entry(&mut map, "InclusionPatterns", inclusion_patterns)?;
2361            }
2362            if let Some(ref inclusion_prefixes) = self.inclusion_prefixes {
2363                ::serde::ser::SerializeMap::serialize_entry(&mut map, "InclusionPrefixes", inclusion_prefixes)?;
2364            }
2365            ::serde::ser::SerializeMap::end(map)
2366        }
2367    }
2368
2369    impl ::codec::DeserializeValue for S3DataSourceConfiguration {
2370        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<S3DataSourceConfiguration, D::Error> {
2371            struct Visitor;
2372
2373            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2374                type Value = S3DataSourceConfiguration;
2375
2376                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2377                    write!(f, "a struct of type S3DataSourceConfiguration")
2378                }
2379
2380                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2381                    let mut access_control_list_configuration: Option<::Value<AccessControlListConfiguration>> = None;
2382                    let mut bucket_name: Option<::Value<String>> = None;
2383                    let mut documents_metadata_configuration: Option<::Value<DocumentsMetadataConfiguration>> = None;
2384                    let mut exclusion_patterns: Option<::ValueList<String>> = None;
2385                    let mut inclusion_patterns: Option<::ValueList<String>> = None;
2386                    let mut inclusion_prefixes: Option<::ValueList<String>> = None;
2387
2388                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2389                        match __cfn_key.as_ref() {
2390                            "AccessControlListConfiguration" => {
2391                                access_control_list_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
2392                            }
2393                            "BucketName" => {
2394                                bucket_name = ::serde::de::MapAccess::next_value(&mut map)?;
2395                            }
2396                            "DocumentsMetadataConfiguration" => {
2397                                documents_metadata_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
2398                            }
2399                            "ExclusionPatterns" => {
2400                                exclusion_patterns = ::serde::de::MapAccess::next_value(&mut map)?;
2401                            }
2402                            "InclusionPatterns" => {
2403                                inclusion_patterns = ::serde::de::MapAccess::next_value(&mut map)?;
2404                            }
2405                            "InclusionPrefixes" => {
2406                                inclusion_prefixes = ::serde::de::MapAccess::next_value(&mut map)?;
2407                            }
2408                            _ => {}
2409                        }
2410                    }
2411
2412                    Ok(S3DataSourceConfiguration {
2413                        access_control_list_configuration: access_control_list_configuration,
2414                        bucket_name: bucket_name.ok_or(::serde::de::Error::missing_field("BucketName"))?,
2415                        documents_metadata_configuration: documents_metadata_configuration,
2416                        exclusion_patterns: exclusion_patterns,
2417                        inclusion_patterns: inclusion_patterns,
2418                        inclusion_prefixes: inclusion_prefixes,
2419                    })
2420                }
2421            }
2422
2423            d.deserialize_map(Visitor)
2424        }
2425    }
2426
2427    /// The [`AWS::Kendra::DataSource.S3Path`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-s3path.html) property type.
2428    #[derive(Debug, Default)]
2429    pub struct S3Path {
2430        /// Property [`Bucket`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-s3path.html#cfn-kendra-datasource-s3path-bucket).
2431        ///
2432        /// Update type: _Mutable_.
2433        /// AWS CloudFormation doesn't replace the resource when you change this property.
2434        pub bucket: ::Value<String>,
2435        /// Property [`Key`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-s3path.html#cfn-kendra-datasource-s3path-key).
2436        ///
2437        /// Update type: _Mutable_.
2438        /// AWS CloudFormation doesn't replace the resource when you change this property.
2439        pub key: ::Value<String>,
2440    }
2441
2442    impl ::codec::SerializeValue for S3Path {
2443        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2444            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2445            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Bucket", &self.bucket)?;
2446            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Key", &self.key)?;
2447            ::serde::ser::SerializeMap::end(map)
2448        }
2449    }
2450
2451    impl ::codec::DeserializeValue for S3Path {
2452        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<S3Path, D::Error> {
2453            struct Visitor;
2454
2455            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2456                type Value = S3Path;
2457
2458                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2459                    write!(f, "a struct of type S3Path")
2460                }
2461
2462                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2463                    let mut bucket: Option<::Value<String>> = None;
2464                    let mut key: Option<::Value<String>> = None;
2465
2466                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2467                        match __cfn_key.as_ref() {
2468                            "Bucket" => {
2469                                bucket = ::serde::de::MapAccess::next_value(&mut map)?;
2470                            }
2471                            "Key" => {
2472                                key = ::serde::de::MapAccess::next_value(&mut map)?;
2473                            }
2474                            _ => {}
2475                        }
2476                    }
2477
2478                    Ok(S3Path {
2479                        bucket: bucket.ok_or(::serde::de::Error::missing_field("Bucket"))?,
2480                        key: key.ok_or(::serde::de::Error::missing_field("Key"))?,
2481                    })
2482                }
2483            }
2484
2485            d.deserialize_map(Visitor)
2486        }
2487    }
2488
2489    /// The [`AWS::Kendra::DataSource.SalesforceChatterFeedConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcechatterfeedconfiguration.html) property type.
2490    #[derive(Debug, Default)]
2491    pub struct SalesforceChatterFeedConfiguration {
2492        /// Property [`DocumentDataFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcechatterfeedconfiguration.html#cfn-kendra-datasource-salesforcechatterfeedconfiguration-documentdatafieldname).
2493        ///
2494        /// Update type: _Mutable_.
2495        /// AWS CloudFormation doesn't replace the resource when you change this property.
2496        pub document_data_field_name: ::Value<String>,
2497        /// Property [`DocumentTitleFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcechatterfeedconfiguration.html#cfn-kendra-datasource-salesforcechatterfeedconfiguration-documenttitlefieldname).
2498        ///
2499        /// Update type: _Mutable_.
2500        /// AWS CloudFormation doesn't replace the resource when you change this property.
2501        pub document_title_field_name: Option<::Value<String>>,
2502        /// Property [`FieldMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcechatterfeedconfiguration.html#cfn-kendra-datasource-salesforcechatterfeedconfiguration-fieldmappings).
2503        ///
2504        /// Update type: _Mutable_.
2505        /// AWS CloudFormation doesn't replace the resource when you change this property.
2506        pub field_mappings: Option<::ValueList<DataSourceToIndexFieldMapping>>,
2507        /// Property [`IncludeFilterTypes`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcechatterfeedconfiguration.html#cfn-kendra-datasource-salesforcechatterfeedconfiguration-includefiltertypes).
2508        ///
2509        /// Update type: _Mutable_.
2510        /// AWS CloudFormation doesn't replace the resource when you change this property.
2511        pub include_filter_types: Option<::ValueList<String>>,
2512    }
2513
2514    impl ::codec::SerializeValue for SalesforceChatterFeedConfiguration {
2515        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2516            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2517            ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentDataFieldName", &self.document_data_field_name)?;
2518            if let Some(ref document_title_field_name) = self.document_title_field_name {
2519                ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentTitleFieldName", document_title_field_name)?;
2520            }
2521            if let Some(ref field_mappings) = self.field_mappings {
2522                ::serde::ser::SerializeMap::serialize_entry(&mut map, "FieldMappings", field_mappings)?;
2523            }
2524            if let Some(ref include_filter_types) = self.include_filter_types {
2525                ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludeFilterTypes", include_filter_types)?;
2526            }
2527            ::serde::ser::SerializeMap::end(map)
2528        }
2529    }
2530
2531    impl ::codec::DeserializeValue for SalesforceChatterFeedConfiguration {
2532        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<SalesforceChatterFeedConfiguration, D::Error> {
2533            struct Visitor;
2534
2535            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2536                type Value = SalesforceChatterFeedConfiguration;
2537
2538                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2539                    write!(f, "a struct of type SalesforceChatterFeedConfiguration")
2540                }
2541
2542                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2543                    let mut document_data_field_name: Option<::Value<String>> = None;
2544                    let mut document_title_field_name: Option<::Value<String>> = None;
2545                    let mut field_mappings: Option<::ValueList<DataSourceToIndexFieldMapping>> = None;
2546                    let mut include_filter_types: Option<::ValueList<String>> = None;
2547
2548                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2549                        match __cfn_key.as_ref() {
2550                            "DocumentDataFieldName" => {
2551                                document_data_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
2552                            }
2553                            "DocumentTitleFieldName" => {
2554                                document_title_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
2555                            }
2556                            "FieldMappings" => {
2557                                field_mappings = ::serde::de::MapAccess::next_value(&mut map)?;
2558                            }
2559                            "IncludeFilterTypes" => {
2560                                include_filter_types = ::serde::de::MapAccess::next_value(&mut map)?;
2561                            }
2562                            _ => {}
2563                        }
2564                    }
2565
2566                    Ok(SalesforceChatterFeedConfiguration {
2567                        document_data_field_name: document_data_field_name.ok_or(::serde::de::Error::missing_field("DocumentDataFieldName"))?,
2568                        document_title_field_name: document_title_field_name,
2569                        field_mappings: field_mappings,
2570                        include_filter_types: include_filter_types,
2571                    })
2572                }
2573            }
2574
2575            d.deserialize_map(Visitor)
2576        }
2577    }
2578
2579    /// The [`AWS::Kendra::DataSource.SalesforceConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceconfiguration.html) property type.
2580    #[derive(Debug, Default)]
2581    pub struct SalesforceConfiguration {
2582        /// Property [`ChatterFeedConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceconfiguration.html#cfn-kendra-datasource-salesforceconfiguration-chatterfeedconfiguration).
2583        ///
2584        /// Update type: _Mutable_.
2585        /// AWS CloudFormation doesn't replace the resource when you change this property.
2586        pub chatter_feed_configuration: Option<::Value<SalesforceChatterFeedConfiguration>>,
2587        /// Property [`CrawlAttachments`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceconfiguration.html#cfn-kendra-datasource-salesforceconfiguration-crawlattachments).
2588        ///
2589        /// Update type: _Mutable_.
2590        /// AWS CloudFormation doesn't replace the resource when you change this property.
2591        pub crawl_attachments: Option<::Value<bool>>,
2592        /// Property [`ExcludeAttachmentFilePatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceconfiguration.html#cfn-kendra-datasource-salesforceconfiguration-excludeattachmentfilepatterns).
2593        ///
2594        /// Update type: _Mutable_.
2595        /// AWS CloudFormation doesn't replace the resource when you change this property.
2596        pub exclude_attachment_file_patterns: Option<::ValueList<String>>,
2597        /// Property [`IncludeAttachmentFilePatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceconfiguration.html#cfn-kendra-datasource-salesforceconfiguration-includeattachmentfilepatterns).
2598        ///
2599        /// Update type: _Mutable_.
2600        /// AWS CloudFormation doesn't replace the resource when you change this property.
2601        pub include_attachment_file_patterns: Option<::ValueList<String>>,
2602        /// Property [`KnowledgeArticleConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceconfiguration.html#cfn-kendra-datasource-salesforceconfiguration-knowledgearticleconfiguration).
2603        ///
2604        /// Update type: _Mutable_.
2605        /// AWS CloudFormation doesn't replace the resource when you change this property.
2606        pub knowledge_article_configuration: Option<::Value<SalesforceKnowledgeArticleConfiguration>>,
2607        /// Property [`SecretArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceconfiguration.html#cfn-kendra-datasource-salesforceconfiguration-secretarn).
2608        ///
2609        /// Update type: _Mutable_.
2610        /// AWS CloudFormation doesn't replace the resource when you change this property.
2611        pub secret_arn: ::Value<String>,
2612        /// Property [`ServerUrl`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceconfiguration.html#cfn-kendra-datasource-salesforceconfiguration-serverurl).
2613        ///
2614        /// Update type: _Mutable_.
2615        /// AWS CloudFormation doesn't replace the resource when you change this property.
2616        pub server_url: ::Value<String>,
2617        /// Property [`StandardObjectAttachmentConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceconfiguration.html#cfn-kendra-datasource-salesforceconfiguration-standardobjectattachmentconfiguration).
2618        ///
2619        /// Update type: _Mutable_.
2620        /// AWS CloudFormation doesn't replace the resource when you change this property.
2621        pub standard_object_attachment_configuration: Option<::Value<SalesforceStandardObjectAttachmentConfiguration>>,
2622        /// Property [`StandardObjectConfigurations`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceconfiguration.html#cfn-kendra-datasource-salesforceconfiguration-standardobjectconfigurations).
2623        ///
2624        /// Update type: _Mutable_.
2625        /// AWS CloudFormation doesn't replace the resource when you change this property.
2626        pub standard_object_configurations: Option<::ValueList<SalesforceStandardObjectConfiguration>>,
2627    }
2628
2629    impl ::codec::SerializeValue for SalesforceConfiguration {
2630        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2631            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2632            if let Some(ref chatter_feed_configuration) = self.chatter_feed_configuration {
2633                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ChatterFeedConfiguration", chatter_feed_configuration)?;
2634            }
2635            if let Some(ref crawl_attachments) = self.crawl_attachments {
2636                ::serde::ser::SerializeMap::serialize_entry(&mut map, "CrawlAttachments", crawl_attachments)?;
2637            }
2638            if let Some(ref exclude_attachment_file_patterns) = self.exclude_attachment_file_patterns {
2639                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExcludeAttachmentFilePatterns", exclude_attachment_file_patterns)?;
2640            }
2641            if let Some(ref include_attachment_file_patterns) = self.include_attachment_file_patterns {
2642                ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludeAttachmentFilePatterns", include_attachment_file_patterns)?;
2643            }
2644            if let Some(ref knowledge_article_configuration) = self.knowledge_article_configuration {
2645                ::serde::ser::SerializeMap::serialize_entry(&mut map, "KnowledgeArticleConfiguration", knowledge_article_configuration)?;
2646            }
2647            ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretArn", &self.secret_arn)?;
2648            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServerUrl", &self.server_url)?;
2649            if let Some(ref standard_object_attachment_configuration) = self.standard_object_attachment_configuration {
2650                ::serde::ser::SerializeMap::serialize_entry(&mut map, "StandardObjectAttachmentConfiguration", standard_object_attachment_configuration)?;
2651            }
2652            if let Some(ref standard_object_configurations) = self.standard_object_configurations {
2653                ::serde::ser::SerializeMap::serialize_entry(&mut map, "StandardObjectConfigurations", standard_object_configurations)?;
2654            }
2655            ::serde::ser::SerializeMap::end(map)
2656        }
2657    }
2658
2659    impl ::codec::DeserializeValue for SalesforceConfiguration {
2660        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<SalesforceConfiguration, D::Error> {
2661            struct Visitor;
2662
2663            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2664                type Value = SalesforceConfiguration;
2665
2666                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2667                    write!(f, "a struct of type SalesforceConfiguration")
2668                }
2669
2670                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2671                    let mut chatter_feed_configuration: Option<::Value<SalesforceChatterFeedConfiguration>> = None;
2672                    let mut crawl_attachments: Option<::Value<bool>> = None;
2673                    let mut exclude_attachment_file_patterns: Option<::ValueList<String>> = None;
2674                    let mut include_attachment_file_patterns: Option<::ValueList<String>> = None;
2675                    let mut knowledge_article_configuration: Option<::Value<SalesforceKnowledgeArticleConfiguration>> = None;
2676                    let mut secret_arn: Option<::Value<String>> = None;
2677                    let mut server_url: Option<::Value<String>> = None;
2678                    let mut standard_object_attachment_configuration: Option<::Value<SalesforceStandardObjectAttachmentConfiguration>> = None;
2679                    let mut standard_object_configurations: Option<::ValueList<SalesforceStandardObjectConfiguration>> = None;
2680
2681                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2682                        match __cfn_key.as_ref() {
2683                            "ChatterFeedConfiguration" => {
2684                                chatter_feed_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
2685                            }
2686                            "CrawlAttachments" => {
2687                                crawl_attachments = ::serde::de::MapAccess::next_value(&mut map)?;
2688                            }
2689                            "ExcludeAttachmentFilePatterns" => {
2690                                exclude_attachment_file_patterns = ::serde::de::MapAccess::next_value(&mut map)?;
2691                            }
2692                            "IncludeAttachmentFilePatterns" => {
2693                                include_attachment_file_patterns = ::serde::de::MapAccess::next_value(&mut map)?;
2694                            }
2695                            "KnowledgeArticleConfiguration" => {
2696                                knowledge_article_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
2697                            }
2698                            "SecretArn" => {
2699                                secret_arn = ::serde::de::MapAccess::next_value(&mut map)?;
2700                            }
2701                            "ServerUrl" => {
2702                                server_url = ::serde::de::MapAccess::next_value(&mut map)?;
2703                            }
2704                            "StandardObjectAttachmentConfiguration" => {
2705                                standard_object_attachment_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
2706                            }
2707                            "StandardObjectConfigurations" => {
2708                                standard_object_configurations = ::serde::de::MapAccess::next_value(&mut map)?;
2709                            }
2710                            _ => {}
2711                        }
2712                    }
2713
2714                    Ok(SalesforceConfiguration {
2715                        chatter_feed_configuration: chatter_feed_configuration,
2716                        crawl_attachments: crawl_attachments,
2717                        exclude_attachment_file_patterns: exclude_attachment_file_patterns,
2718                        include_attachment_file_patterns: include_attachment_file_patterns,
2719                        knowledge_article_configuration: knowledge_article_configuration,
2720                        secret_arn: secret_arn.ok_or(::serde::de::Error::missing_field("SecretArn"))?,
2721                        server_url: server_url.ok_or(::serde::de::Error::missing_field("ServerUrl"))?,
2722                        standard_object_attachment_configuration: standard_object_attachment_configuration,
2723                        standard_object_configurations: standard_object_configurations,
2724                    })
2725                }
2726            }
2727
2728            d.deserialize_map(Visitor)
2729        }
2730    }
2731
2732    /// The [`AWS::Kendra::DataSource.SalesforceCustomKnowledgeArticleTypeConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcecustomknowledgearticletypeconfiguration.html) property type.
2733    #[derive(Debug, Default)]
2734    pub struct SalesforceCustomKnowledgeArticleTypeConfiguration {
2735        /// Property [`DocumentDataFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcecustomknowledgearticletypeconfiguration.html#cfn-kendra-datasource-salesforcecustomknowledgearticletypeconfiguration-documentdatafieldname).
2736        ///
2737        /// Update type: _Mutable_.
2738        /// AWS CloudFormation doesn't replace the resource when you change this property.
2739        pub document_data_field_name: ::Value<String>,
2740        /// Property [`DocumentTitleFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcecustomknowledgearticletypeconfiguration.html#cfn-kendra-datasource-salesforcecustomknowledgearticletypeconfiguration-documenttitlefieldname).
2741        ///
2742        /// Update type: _Mutable_.
2743        /// AWS CloudFormation doesn't replace the resource when you change this property.
2744        pub document_title_field_name: Option<::Value<String>>,
2745        /// Property [`FieldMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcecustomknowledgearticletypeconfiguration.html#cfn-kendra-datasource-salesforcecustomknowledgearticletypeconfiguration-fieldmappings).
2746        ///
2747        /// Update type: _Mutable_.
2748        /// AWS CloudFormation doesn't replace the resource when you change this property.
2749        pub field_mappings: Option<::ValueList<DataSourceToIndexFieldMapping>>,
2750        /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcecustomknowledgearticletypeconfiguration.html#cfn-kendra-datasource-salesforcecustomknowledgearticletypeconfiguration-name).
2751        ///
2752        /// Update type: _Mutable_.
2753        /// AWS CloudFormation doesn't replace the resource when you change this property.
2754        pub name: ::Value<String>,
2755    }
2756
2757    impl ::codec::SerializeValue for SalesforceCustomKnowledgeArticleTypeConfiguration {
2758        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2759            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2760            ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentDataFieldName", &self.document_data_field_name)?;
2761            if let Some(ref document_title_field_name) = self.document_title_field_name {
2762                ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentTitleFieldName", document_title_field_name)?;
2763            }
2764            if let Some(ref field_mappings) = self.field_mappings {
2765                ::serde::ser::SerializeMap::serialize_entry(&mut map, "FieldMappings", field_mappings)?;
2766            }
2767            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?;
2768            ::serde::ser::SerializeMap::end(map)
2769        }
2770    }
2771
2772    impl ::codec::DeserializeValue for SalesforceCustomKnowledgeArticleTypeConfiguration {
2773        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<SalesforceCustomKnowledgeArticleTypeConfiguration, D::Error> {
2774            struct Visitor;
2775
2776            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2777                type Value = SalesforceCustomKnowledgeArticleTypeConfiguration;
2778
2779                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2780                    write!(f, "a struct of type SalesforceCustomKnowledgeArticleTypeConfiguration")
2781                }
2782
2783                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2784                    let mut document_data_field_name: Option<::Value<String>> = None;
2785                    let mut document_title_field_name: Option<::Value<String>> = None;
2786                    let mut field_mappings: Option<::ValueList<DataSourceToIndexFieldMapping>> = None;
2787                    let mut name: Option<::Value<String>> = None;
2788
2789                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2790                        match __cfn_key.as_ref() {
2791                            "DocumentDataFieldName" => {
2792                                document_data_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
2793                            }
2794                            "DocumentTitleFieldName" => {
2795                                document_title_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
2796                            }
2797                            "FieldMappings" => {
2798                                field_mappings = ::serde::de::MapAccess::next_value(&mut map)?;
2799                            }
2800                            "Name" => {
2801                                name = ::serde::de::MapAccess::next_value(&mut map)?;
2802                            }
2803                            _ => {}
2804                        }
2805                    }
2806
2807                    Ok(SalesforceCustomKnowledgeArticleTypeConfiguration {
2808                        document_data_field_name: document_data_field_name.ok_or(::serde::de::Error::missing_field("DocumentDataFieldName"))?,
2809                        document_title_field_name: document_title_field_name,
2810                        field_mappings: field_mappings,
2811                        name: name.ok_or(::serde::de::Error::missing_field("Name"))?,
2812                    })
2813                }
2814            }
2815
2816            d.deserialize_map(Visitor)
2817        }
2818    }
2819
2820    /// The [`AWS::Kendra::DataSource.SalesforceKnowledgeArticleConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceknowledgearticleconfiguration.html) property type.
2821    #[derive(Debug, Default)]
2822    pub struct SalesforceKnowledgeArticleConfiguration {
2823        /// Property [`CustomKnowledgeArticleTypeConfigurations`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceknowledgearticleconfiguration.html#cfn-kendra-datasource-salesforceknowledgearticleconfiguration-customknowledgearticletypeconfigurations).
2824        ///
2825        /// Update type: _Mutable_.
2826        /// AWS CloudFormation doesn't replace the resource when you change this property.
2827        pub custom_knowledge_article_type_configurations: Option<::ValueList<SalesforceCustomKnowledgeArticleTypeConfiguration>>,
2828        /// Property [`IncludedStates`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceknowledgearticleconfiguration.html#cfn-kendra-datasource-salesforceknowledgearticleconfiguration-includedstates).
2829        ///
2830        /// Update type: _Mutable_.
2831        /// AWS CloudFormation doesn't replace the resource when you change this property.
2832        pub included_states: ::ValueList<String>,
2833        /// Property [`StandardKnowledgeArticleTypeConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforceknowledgearticleconfiguration.html#cfn-kendra-datasource-salesforceknowledgearticleconfiguration-standardknowledgearticletypeconfiguration).
2834        ///
2835        /// Update type: _Mutable_.
2836        /// AWS CloudFormation doesn't replace the resource when you change this property.
2837        pub standard_knowledge_article_type_configuration: Option<::Value<SalesforceStandardKnowledgeArticleTypeConfiguration>>,
2838    }
2839
2840    impl ::codec::SerializeValue for SalesforceKnowledgeArticleConfiguration {
2841        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2842            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2843            if let Some(ref custom_knowledge_article_type_configurations) = self.custom_knowledge_article_type_configurations {
2844                ::serde::ser::SerializeMap::serialize_entry(&mut map, "CustomKnowledgeArticleTypeConfigurations", custom_knowledge_article_type_configurations)?;
2845            }
2846            ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludedStates", &self.included_states)?;
2847            if let Some(ref standard_knowledge_article_type_configuration) = self.standard_knowledge_article_type_configuration {
2848                ::serde::ser::SerializeMap::serialize_entry(&mut map, "StandardKnowledgeArticleTypeConfiguration", standard_knowledge_article_type_configuration)?;
2849            }
2850            ::serde::ser::SerializeMap::end(map)
2851        }
2852    }
2853
2854    impl ::codec::DeserializeValue for SalesforceKnowledgeArticleConfiguration {
2855        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<SalesforceKnowledgeArticleConfiguration, D::Error> {
2856            struct Visitor;
2857
2858            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2859                type Value = SalesforceKnowledgeArticleConfiguration;
2860
2861                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2862                    write!(f, "a struct of type SalesforceKnowledgeArticleConfiguration")
2863                }
2864
2865                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2866                    let mut custom_knowledge_article_type_configurations: Option<::ValueList<SalesforceCustomKnowledgeArticleTypeConfiguration>> = None;
2867                    let mut included_states: Option<::ValueList<String>> = None;
2868                    let mut standard_knowledge_article_type_configuration: Option<::Value<SalesforceStandardKnowledgeArticleTypeConfiguration>> = None;
2869
2870                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2871                        match __cfn_key.as_ref() {
2872                            "CustomKnowledgeArticleTypeConfigurations" => {
2873                                custom_knowledge_article_type_configurations = ::serde::de::MapAccess::next_value(&mut map)?;
2874                            }
2875                            "IncludedStates" => {
2876                                included_states = ::serde::de::MapAccess::next_value(&mut map)?;
2877                            }
2878                            "StandardKnowledgeArticleTypeConfiguration" => {
2879                                standard_knowledge_article_type_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
2880                            }
2881                            _ => {}
2882                        }
2883                    }
2884
2885                    Ok(SalesforceKnowledgeArticleConfiguration {
2886                        custom_knowledge_article_type_configurations: custom_knowledge_article_type_configurations,
2887                        included_states: included_states.ok_or(::serde::de::Error::missing_field("IncludedStates"))?,
2888                        standard_knowledge_article_type_configuration: standard_knowledge_article_type_configuration,
2889                    })
2890                }
2891            }
2892
2893            d.deserialize_map(Visitor)
2894        }
2895    }
2896
2897    /// The [`AWS::Kendra::DataSource.SalesforceStandardKnowledgeArticleTypeConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardknowledgearticletypeconfiguration.html) property type.
2898    #[derive(Debug, Default)]
2899    pub struct SalesforceStandardKnowledgeArticleTypeConfiguration {
2900        /// Property [`DocumentDataFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardknowledgearticletypeconfiguration.html#cfn-kendra-datasource-salesforcestandardknowledgearticletypeconfiguration-documentdatafieldname).
2901        ///
2902        /// Update type: _Mutable_.
2903        /// AWS CloudFormation doesn't replace the resource when you change this property.
2904        pub document_data_field_name: ::Value<String>,
2905        /// Property [`DocumentTitleFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardknowledgearticletypeconfiguration.html#cfn-kendra-datasource-salesforcestandardknowledgearticletypeconfiguration-documenttitlefieldname).
2906        ///
2907        /// Update type: _Mutable_.
2908        /// AWS CloudFormation doesn't replace the resource when you change this property.
2909        pub document_title_field_name: Option<::Value<String>>,
2910        /// Property [`FieldMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardknowledgearticletypeconfiguration.html#cfn-kendra-datasource-salesforcestandardknowledgearticletypeconfiguration-fieldmappings).
2911        ///
2912        /// Update type: _Mutable_.
2913        /// AWS CloudFormation doesn't replace the resource when you change this property.
2914        pub field_mappings: Option<::ValueList<DataSourceToIndexFieldMapping>>,
2915    }
2916
2917    impl ::codec::SerializeValue for SalesforceStandardKnowledgeArticleTypeConfiguration {
2918        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2919            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2920            ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentDataFieldName", &self.document_data_field_name)?;
2921            if let Some(ref document_title_field_name) = self.document_title_field_name {
2922                ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentTitleFieldName", document_title_field_name)?;
2923            }
2924            if let Some(ref field_mappings) = self.field_mappings {
2925                ::serde::ser::SerializeMap::serialize_entry(&mut map, "FieldMappings", field_mappings)?;
2926            }
2927            ::serde::ser::SerializeMap::end(map)
2928        }
2929    }
2930
2931    impl ::codec::DeserializeValue for SalesforceStandardKnowledgeArticleTypeConfiguration {
2932        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<SalesforceStandardKnowledgeArticleTypeConfiguration, D::Error> {
2933            struct Visitor;
2934
2935            impl<'de> ::serde::de::Visitor<'de> for Visitor {
2936                type Value = SalesforceStandardKnowledgeArticleTypeConfiguration;
2937
2938                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
2939                    write!(f, "a struct of type SalesforceStandardKnowledgeArticleTypeConfiguration")
2940                }
2941
2942                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
2943                    let mut document_data_field_name: Option<::Value<String>> = None;
2944                    let mut document_title_field_name: Option<::Value<String>> = None;
2945                    let mut field_mappings: Option<::ValueList<DataSourceToIndexFieldMapping>> = None;
2946
2947                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
2948                        match __cfn_key.as_ref() {
2949                            "DocumentDataFieldName" => {
2950                                document_data_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
2951                            }
2952                            "DocumentTitleFieldName" => {
2953                                document_title_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
2954                            }
2955                            "FieldMappings" => {
2956                                field_mappings = ::serde::de::MapAccess::next_value(&mut map)?;
2957                            }
2958                            _ => {}
2959                        }
2960                    }
2961
2962                    Ok(SalesforceStandardKnowledgeArticleTypeConfiguration {
2963                        document_data_field_name: document_data_field_name.ok_or(::serde::de::Error::missing_field("DocumentDataFieldName"))?,
2964                        document_title_field_name: document_title_field_name,
2965                        field_mappings: field_mappings,
2966                    })
2967                }
2968            }
2969
2970            d.deserialize_map(Visitor)
2971        }
2972    }
2973
2974    /// The [`AWS::Kendra::DataSource.SalesforceStandardObjectAttachmentConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardobjectattachmentconfiguration.html) property type.
2975    #[derive(Debug, Default)]
2976    pub struct SalesforceStandardObjectAttachmentConfiguration {
2977        /// Property [`DocumentTitleFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardobjectattachmentconfiguration.html#cfn-kendra-datasource-salesforcestandardobjectattachmentconfiguration-documenttitlefieldname).
2978        ///
2979        /// Update type: _Mutable_.
2980        /// AWS CloudFormation doesn't replace the resource when you change this property.
2981        pub document_title_field_name: Option<::Value<String>>,
2982        /// Property [`FieldMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardobjectattachmentconfiguration.html#cfn-kendra-datasource-salesforcestandardobjectattachmentconfiguration-fieldmappings).
2983        ///
2984        /// Update type: _Mutable_.
2985        /// AWS CloudFormation doesn't replace the resource when you change this property.
2986        pub field_mappings: Option<::ValueList<DataSourceToIndexFieldMapping>>,
2987    }
2988
2989    impl ::codec::SerializeValue for SalesforceStandardObjectAttachmentConfiguration {
2990        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2991            let mut map = ::serde::Serializer::serialize_map(s, None)?;
2992            if let Some(ref document_title_field_name) = self.document_title_field_name {
2993                ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentTitleFieldName", document_title_field_name)?;
2994            }
2995            if let Some(ref field_mappings) = self.field_mappings {
2996                ::serde::ser::SerializeMap::serialize_entry(&mut map, "FieldMappings", field_mappings)?;
2997            }
2998            ::serde::ser::SerializeMap::end(map)
2999        }
3000    }
3001
3002    impl ::codec::DeserializeValue for SalesforceStandardObjectAttachmentConfiguration {
3003        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<SalesforceStandardObjectAttachmentConfiguration, D::Error> {
3004            struct Visitor;
3005
3006            impl<'de> ::serde::de::Visitor<'de> for Visitor {
3007                type Value = SalesforceStandardObjectAttachmentConfiguration;
3008
3009                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
3010                    write!(f, "a struct of type SalesforceStandardObjectAttachmentConfiguration")
3011                }
3012
3013                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
3014                    let mut document_title_field_name: Option<::Value<String>> = None;
3015                    let mut field_mappings: Option<::ValueList<DataSourceToIndexFieldMapping>> = None;
3016
3017                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
3018                        match __cfn_key.as_ref() {
3019                            "DocumentTitleFieldName" => {
3020                                document_title_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
3021                            }
3022                            "FieldMappings" => {
3023                                field_mappings = ::serde::de::MapAccess::next_value(&mut map)?;
3024                            }
3025                            _ => {}
3026                        }
3027                    }
3028
3029                    Ok(SalesforceStandardObjectAttachmentConfiguration {
3030                        document_title_field_name: document_title_field_name,
3031                        field_mappings: field_mappings,
3032                    })
3033                }
3034            }
3035
3036            d.deserialize_map(Visitor)
3037        }
3038    }
3039
3040    /// The [`AWS::Kendra::DataSource.SalesforceStandardObjectConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardobjectconfiguration.html) property type.
3041    #[derive(Debug, Default)]
3042    pub struct SalesforceStandardObjectConfiguration {
3043        /// Property [`DocumentDataFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardobjectconfiguration.html#cfn-kendra-datasource-salesforcestandardobjectconfiguration-documentdatafieldname).
3044        ///
3045        /// Update type: _Mutable_.
3046        /// AWS CloudFormation doesn't replace the resource when you change this property.
3047        pub document_data_field_name: ::Value<String>,
3048        /// Property [`DocumentTitleFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardobjectconfiguration.html#cfn-kendra-datasource-salesforcestandardobjectconfiguration-documenttitlefieldname).
3049        ///
3050        /// Update type: _Mutable_.
3051        /// AWS CloudFormation doesn't replace the resource when you change this property.
3052        pub document_title_field_name: Option<::Value<String>>,
3053        /// Property [`FieldMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardobjectconfiguration.html#cfn-kendra-datasource-salesforcestandardobjectconfiguration-fieldmappings).
3054        ///
3055        /// Update type: _Mutable_.
3056        /// AWS CloudFormation doesn't replace the resource when you change this property.
3057        pub field_mappings: Option<::ValueList<DataSourceToIndexFieldMapping>>,
3058        /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-salesforcestandardobjectconfiguration.html#cfn-kendra-datasource-salesforcestandardobjectconfiguration-name).
3059        ///
3060        /// Update type: _Mutable_.
3061        /// AWS CloudFormation doesn't replace the resource when you change this property.
3062        pub name: ::Value<String>,
3063    }
3064
3065    impl ::codec::SerializeValue for SalesforceStandardObjectConfiguration {
3066        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
3067            let mut map = ::serde::Serializer::serialize_map(s, None)?;
3068            ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentDataFieldName", &self.document_data_field_name)?;
3069            if let Some(ref document_title_field_name) = self.document_title_field_name {
3070                ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentTitleFieldName", document_title_field_name)?;
3071            }
3072            if let Some(ref field_mappings) = self.field_mappings {
3073                ::serde::ser::SerializeMap::serialize_entry(&mut map, "FieldMappings", field_mappings)?;
3074            }
3075            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?;
3076            ::serde::ser::SerializeMap::end(map)
3077        }
3078    }
3079
3080    impl ::codec::DeserializeValue for SalesforceStandardObjectConfiguration {
3081        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<SalesforceStandardObjectConfiguration, D::Error> {
3082            struct Visitor;
3083
3084            impl<'de> ::serde::de::Visitor<'de> for Visitor {
3085                type Value = SalesforceStandardObjectConfiguration;
3086
3087                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
3088                    write!(f, "a struct of type SalesforceStandardObjectConfiguration")
3089                }
3090
3091                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
3092                    let mut document_data_field_name: Option<::Value<String>> = None;
3093                    let mut document_title_field_name: Option<::Value<String>> = None;
3094                    let mut field_mappings: Option<::ValueList<DataSourceToIndexFieldMapping>> = None;
3095                    let mut name: Option<::Value<String>> = None;
3096
3097                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
3098                        match __cfn_key.as_ref() {
3099                            "DocumentDataFieldName" => {
3100                                document_data_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
3101                            }
3102                            "DocumentTitleFieldName" => {
3103                                document_title_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
3104                            }
3105                            "FieldMappings" => {
3106                                field_mappings = ::serde::de::MapAccess::next_value(&mut map)?;
3107                            }
3108                            "Name" => {
3109                                name = ::serde::de::MapAccess::next_value(&mut map)?;
3110                            }
3111                            _ => {}
3112                        }
3113                    }
3114
3115                    Ok(SalesforceStandardObjectConfiguration {
3116                        document_data_field_name: document_data_field_name.ok_or(::serde::de::Error::missing_field("DocumentDataFieldName"))?,
3117                        document_title_field_name: document_title_field_name,
3118                        field_mappings: field_mappings,
3119                        name: name.ok_or(::serde::de::Error::missing_field("Name"))?,
3120                    })
3121                }
3122            }
3123
3124            d.deserialize_map(Visitor)
3125        }
3126    }
3127
3128    /// The [`AWS::Kendra::DataSource.ServiceNowConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowconfiguration.html) property type.
3129    #[derive(Debug, Default)]
3130    pub struct ServiceNowConfiguration {
3131        /// Property [`HostUrl`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowconfiguration.html#cfn-kendra-datasource-servicenowconfiguration-hosturl).
3132        ///
3133        /// Update type: _Mutable_.
3134        /// AWS CloudFormation doesn't replace the resource when you change this property.
3135        pub host_url: ::Value<String>,
3136        /// Property [`KnowledgeArticleConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowconfiguration.html#cfn-kendra-datasource-servicenowconfiguration-knowledgearticleconfiguration).
3137        ///
3138        /// Update type: _Mutable_.
3139        /// AWS CloudFormation doesn't replace the resource when you change this property.
3140        pub knowledge_article_configuration: Option<::Value<ServiceNowKnowledgeArticleConfiguration>>,
3141        /// Property [`SecretArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowconfiguration.html#cfn-kendra-datasource-servicenowconfiguration-secretarn).
3142        ///
3143        /// Update type: _Mutable_.
3144        /// AWS CloudFormation doesn't replace the resource when you change this property.
3145        pub secret_arn: ::Value<String>,
3146        /// Property [`ServiceCatalogConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowconfiguration.html#cfn-kendra-datasource-servicenowconfiguration-servicecatalogconfiguration).
3147        ///
3148        /// Update type: _Mutable_.
3149        /// AWS CloudFormation doesn't replace the resource when you change this property.
3150        pub service_catalog_configuration: Option<::Value<ServiceNowServiceCatalogConfiguration>>,
3151        /// Property [`ServiceNowBuildVersion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowconfiguration.html#cfn-kendra-datasource-servicenowconfiguration-servicenowbuildversion).
3152        ///
3153        /// Update type: _Mutable_.
3154        /// AWS CloudFormation doesn't replace the resource when you change this property.
3155        pub service_now_build_version: ::Value<String>,
3156    }
3157
3158    impl ::codec::SerializeValue for ServiceNowConfiguration {
3159        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
3160            let mut map = ::serde::Serializer::serialize_map(s, None)?;
3161            ::serde::ser::SerializeMap::serialize_entry(&mut map, "HostUrl", &self.host_url)?;
3162            if let Some(ref knowledge_article_configuration) = self.knowledge_article_configuration {
3163                ::serde::ser::SerializeMap::serialize_entry(&mut map, "KnowledgeArticleConfiguration", knowledge_article_configuration)?;
3164            }
3165            ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretArn", &self.secret_arn)?;
3166            if let Some(ref service_catalog_configuration) = self.service_catalog_configuration {
3167                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServiceCatalogConfiguration", service_catalog_configuration)?;
3168            }
3169            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ServiceNowBuildVersion", &self.service_now_build_version)?;
3170            ::serde::ser::SerializeMap::end(map)
3171        }
3172    }
3173
3174    impl ::codec::DeserializeValue for ServiceNowConfiguration {
3175        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ServiceNowConfiguration, D::Error> {
3176            struct Visitor;
3177
3178            impl<'de> ::serde::de::Visitor<'de> for Visitor {
3179                type Value = ServiceNowConfiguration;
3180
3181                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
3182                    write!(f, "a struct of type ServiceNowConfiguration")
3183                }
3184
3185                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
3186                    let mut host_url: Option<::Value<String>> = None;
3187                    let mut knowledge_article_configuration: Option<::Value<ServiceNowKnowledgeArticleConfiguration>> = None;
3188                    let mut secret_arn: Option<::Value<String>> = None;
3189                    let mut service_catalog_configuration: Option<::Value<ServiceNowServiceCatalogConfiguration>> = None;
3190                    let mut service_now_build_version: Option<::Value<String>> = None;
3191
3192                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
3193                        match __cfn_key.as_ref() {
3194                            "HostUrl" => {
3195                                host_url = ::serde::de::MapAccess::next_value(&mut map)?;
3196                            }
3197                            "KnowledgeArticleConfiguration" => {
3198                                knowledge_article_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
3199                            }
3200                            "SecretArn" => {
3201                                secret_arn = ::serde::de::MapAccess::next_value(&mut map)?;
3202                            }
3203                            "ServiceCatalogConfiguration" => {
3204                                service_catalog_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
3205                            }
3206                            "ServiceNowBuildVersion" => {
3207                                service_now_build_version = ::serde::de::MapAccess::next_value(&mut map)?;
3208                            }
3209                            _ => {}
3210                        }
3211                    }
3212
3213                    Ok(ServiceNowConfiguration {
3214                        host_url: host_url.ok_or(::serde::de::Error::missing_field("HostUrl"))?,
3215                        knowledge_article_configuration: knowledge_article_configuration,
3216                        secret_arn: secret_arn.ok_or(::serde::de::Error::missing_field("SecretArn"))?,
3217                        service_catalog_configuration: service_catalog_configuration,
3218                        service_now_build_version: service_now_build_version.ok_or(::serde::de::Error::missing_field("ServiceNowBuildVersion"))?,
3219                    })
3220                }
3221            }
3222
3223            d.deserialize_map(Visitor)
3224        }
3225    }
3226
3227    /// The [`AWS::Kendra::DataSource.ServiceNowKnowledgeArticleConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowknowledgearticleconfiguration.html) property type.
3228    #[derive(Debug, Default)]
3229    pub struct ServiceNowKnowledgeArticleConfiguration {
3230        /// Property [`CrawlAttachments`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowknowledgearticleconfiguration.html#cfn-kendra-datasource-servicenowknowledgearticleconfiguration-crawlattachments).
3231        ///
3232        /// Update type: _Mutable_.
3233        /// AWS CloudFormation doesn't replace the resource when you change this property.
3234        pub crawl_attachments: Option<::Value<bool>>,
3235        /// Property [`DocumentDataFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowknowledgearticleconfiguration.html#cfn-kendra-datasource-servicenowknowledgearticleconfiguration-documentdatafieldname).
3236        ///
3237        /// Update type: _Mutable_.
3238        /// AWS CloudFormation doesn't replace the resource when you change this property.
3239        pub document_data_field_name: ::Value<String>,
3240        /// Property [`DocumentTitleFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowknowledgearticleconfiguration.html#cfn-kendra-datasource-servicenowknowledgearticleconfiguration-documenttitlefieldname).
3241        ///
3242        /// Update type: _Mutable_.
3243        /// AWS CloudFormation doesn't replace the resource when you change this property.
3244        pub document_title_field_name: Option<::Value<String>>,
3245        /// Property [`ExcludeAttachmentFilePatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowknowledgearticleconfiguration.html#cfn-kendra-datasource-servicenowknowledgearticleconfiguration-excludeattachmentfilepatterns).
3246        ///
3247        /// Update type: _Mutable_.
3248        /// AWS CloudFormation doesn't replace the resource when you change this property.
3249        pub exclude_attachment_file_patterns: Option<::ValueList<String>>,
3250        /// Property [`FieldMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowknowledgearticleconfiguration.html#cfn-kendra-datasource-servicenowknowledgearticleconfiguration-fieldmappings).
3251        ///
3252        /// Update type: _Mutable_.
3253        /// AWS CloudFormation doesn't replace the resource when you change this property.
3254        pub field_mappings: Option<::ValueList<DataSourceToIndexFieldMapping>>,
3255        /// Property [`IncludeAttachmentFilePatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowknowledgearticleconfiguration.html#cfn-kendra-datasource-servicenowknowledgearticleconfiguration-includeattachmentfilepatterns).
3256        ///
3257        /// Update type: _Mutable_.
3258        /// AWS CloudFormation doesn't replace the resource when you change this property.
3259        pub include_attachment_file_patterns: Option<::ValueList<String>>,
3260    }
3261
3262    impl ::codec::SerializeValue for ServiceNowKnowledgeArticleConfiguration {
3263        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
3264            let mut map = ::serde::Serializer::serialize_map(s, None)?;
3265            if let Some(ref crawl_attachments) = self.crawl_attachments {
3266                ::serde::ser::SerializeMap::serialize_entry(&mut map, "CrawlAttachments", crawl_attachments)?;
3267            }
3268            ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentDataFieldName", &self.document_data_field_name)?;
3269            if let Some(ref document_title_field_name) = self.document_title_field_name {
3270                ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentTitleFieldName", document_title_field_name)?;
3271            }
3272            if let Some(ref exclude_attachment_file_patterns) = self.exclude_attachment_file_patterns {
3273                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExcludeAttachmentFilePatterns", exclude_attachment_file_patterns)?;
3274            }
3275            if let Some(ref field_mappings) = self.field_mappings {
3276                ::serde::ser::SerializeMap::serialize_entry(&mut map, "FieldMappings", field_mappings)?;
3277            }
3278            if let Some(ref include_attachment_file_patterns) = self.include_attachment_file_patterns {
3279                ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludeAttachmentFilePatterns", include_attachment_file_patterns)?;
3280            }
3281            ::serde::ser::SerializeMap::end(map)
3282        }
3283    }
3284
3285    impl ::codec::DeserializeValue for ServiceNowKnowledgeArticleConfiguration {
3286        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ServiceNowKnowledgeArticleConfiguration, D::Error> {
3287            struct Visitor;
3288
3289            impl<'de> ::serde::de::Visitor<'de> for Visitor {
3290                type Value = ServiceNowKnowledgeArticleConfiguration;
3291
3292                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
3293                    write!(f, "a struct of type ServiceNowKnowledgeArticleConfiguration")
3294                }
3295
3296                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
3297                    let mut crawl_attachments: Option<::Value<bool>> = None;
3298                    let mut document_data_field_name: Option<::Value<String>> = None;
3299                    let mut document_title_field_name: Option<::Value<String>> = None;
3300                    let mut exclude_attachment_file_patterns: Option<::ValueList<String>> = None;
3301                    let mut field_mappings: Option<::ValueList<DataSourceToIndexFieldMapping>> = None;
3302                    let mut include_attachment_file_patterns: Option<::ValueList<String>> = None;
3303
3304                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
3305                        match __cfn_key.as_ref() {
3306                            "CrawlAttachments" => {
3307                                crawl_attachments = ::serde::de::MapAccess::next_value(&mut map)?;
3308                            }
3309                            "DocumentDataFieldName" => {
3310                                document_data_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
3311                            }
3312                            "DocumentTitleFieldName" => {
3313                                document_title_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
3314                            }
3315                            "ExcludeAttachmentFilePatterns" => {
3316                                exclude_attachment_file_patterns = ::serde::de::MapAccess::next_value(&mut map)?;
3317                            }
3318                            "FieldMappings" => {
3319                                field_mappings = ::serde::de::MapAccess::next_value(&mut map)?;
3320                            }
3321                            "IncludeAttachmentFilePatterns" => {
3322                                include_attachment_file_patterns = ::serde::de::MapAccess::next_value(&mut map)?;
3323                            }
3324                            _ => {}
3325                        }
3326                    }
3327
3328                    Ok(ServiceNowKnowledgeArticleConfiguration {
3329                        crawl_attachments: crawl_attachments,
3330                        document_data_field_name: document_data_field_name.ok_or(::serde::de::Error::missing_field("DocumentDataFieldName"))?,
3331                        document_title_field_name: document_title_field_name,
3332                        exclude_attachment_file_patterns: exclude_attachment_file_patterns,
3333                        field_mappings: field_mappings,
3334                        include_attachment_file_patterns: include_attachment_file_patterns,
3335                    })
3336                }
3337            }
3338
3339            d.deserialize_map(Visitor)
3340        }
3341    }
3342
3343    /// The [`AWS::Kendra::DataSource.ServiceNowServiceCatalogConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowservicecatalogconfiguration.html) property type.
3344    #[derive(Debug, Default)]
3345    pub struct ServiceNowServiceCatalogConfiguration {
3346        /// Property [`CrawlAttachments`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowservicecatalogconfiguration.html#cfn-kendra-datasource-servicenowservicecatalogconfiguration-crawlattachments).
3347        ///
3348        /// Update type: _Mutable_.
3349        /// AWS CloudFormation doesn't replace the resource when you change this property.
3350        pub crawl_attachments: Option<::Value<bool>>,
3351        /// Property [`DocumentDataFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowservicecatalogconfiguration.html#cfn-kendra-datasource-servicenowservicecatalogconfiguration-documentdatafieldname).
3352        ///
3353        /// Update type: _Mutable_.
3354        /// AWS CloudFormation doesn't replace the resource when you change this property.
3355        pub document_data_field_name: ::Value<String>,
3356        /// Property [`DocumentTitleFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowservicecatalogconfiguration.html#cfn-kendra-datasource-servicenowservicecatalogconfiguration-documenttitlefieldname).
3357        ///
3358        /// Update type: _Mutable_.
3359        /// AWS CloudFormation doesn't replace the resource when you change this property.
3360        pub document_title_field_name: Option<::Value<String>>,
3361        /// Property [`ExcludeAttachmentFilePatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowservicecatalogconfiguration.html#cfn-kendra-datasource-servicenowservicecatalogconfiguration-excludeattachmentfilepatterns).
3362        ///
3363        /// Update type: _Mutable_.
3364        /// AWS CloudFormation doesn't replace the resource when you change this property.
3365        pub exclude_attachment_file_patterns: Option<::ValueList<String>>,
3366        /// Property [`FieldMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowservicecatalogconfiguration.html#cfn-kendra-datasource-servicenowservicecatalogconfiguration-fieldmappings).
3367        ///
3368        /// Update type: _Mutable_.
3369        /// AWS CloudFormation doesn't replace the resource when you change this property.
3370        pub field_mappings: Option<::ValueList<DataSourceToIndexFieldMapping>>,
3371        /// Property [`IncludeAttachmentFilePatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-servicenowservicecatalogconfiguration.html#cfn-kendra-datasource-servicenowservicecatalogconfiguration-includeattachmentfilepatterns).
3372        ///
3373        /// Update type: _Mutable_.
3374        /// AWS CloudFormation doesn't replace the resource when you change this property.
3375        pub include_attachment_file_patterns: Option<::ValueList<String>>,
3376    }
3377
3378    impl ::codec::SerializeValue for ServiceNowServiceCatalogConfiguration {
3379        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
3380            let mut map = ::serde::Serializer::serialize_map(s, None)?;
3381            if let Some(ref crawl_attachments) = self.crawl_attachments {
3382                ::serde::ser::SerializeMap::serialize_entry(&mut map, "CrawlAttachments", crawl_attachments)?;
3383            }
3384            ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentDataFieldName", &self.document_data_field_name)?;
3385            if let Some(ref document_title_field_name) = self.document_title_field_name {
3386                ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentTitleFieldName", document_title_field_name)?;
3387            }
3388            if let Some(ref exclude_attachment_file_patterns) = self.exclude_attachment_file_patterns {
3389                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExcludeAttachmentFilePatterns", exclude_attachment_file_patterns)?;
3390            }
3391            if let Some(ref field_mappings) = self.field_mappings {
3392                ::serde::ser::SerializeMap::serialize_entry(&mut map, "FieldMappings", field_mappings)?;
3393            }
3394            if let Some(ref include_attachment_file_patterns) = self.include_attachment_file_patterns {
3395                ::serde::ser::SerializeMap::serialize_entry(&mut map, "IncludeAttachmentFilePatterns", include_attachment_file_patterns)?;
3396            }
3397            ::serde::ser::SerializeMap::end(map)
3398        }
3399    }
3400
3401    impl ::codec::DeserializeValue for ServiceNowServiceCatalogConfiguration {
3402        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ServiceNowServiceCatalogConfiguration, D::Error> {
3403            struct Visitor;
3404
3405            impl<'de> ::serde::de::Visitor<'de> for Visitor {
3406                type Value = ServiceNowServiceCatalogConfiguration;
3407
3408                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
3409                    write!(f, "a struct of type ServiceNowServiceCatalogConfiguration")
3410                }
3411
3412                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
3413                    let mut crawl_attachments: Option<::Value<bool>> = None;
3414                    let mut document_data_field_name: Option<::Value<String>> = None;
3415                    let mut document_title_field_name: Option<::Value<String>> = None;
3416                    let mut exclude_attachment_file_patterns: Option<::ValueList<String>> = None;
3417                    let mut field_mappings: Option<::ValueList<DataSourceToIndexFieldMapping>> = None;
3418                    let mut include_attachment_file_patterns: Option<::ValueList<String>> = None;
3419
3420                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
3421                        match __cfn_key.as_ref() {
3422                            "CrawlAttachments" => {
3423                                crawl_attachments = ::serde::de::MapAccess::next_value(&mut map)?;
3424                            }
3425                            "DocumentDataFieldName" => {
3426                                document_data_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
3427                            }
3428                            "DocumentTitleFieldName" => {
3429                                document_title_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
3430                            }
3431                            "ExcludeAttachmentFilePatterns" => {
3432                                exclude_attachment_file_patterns = ::serde::de::MapAccess::next_value(&mut map)?;
3433                            }
3434                            "FieldMappings" => {
3435                                field_mappings = ::serde::de::MapAccess::next_value(&mut map)?;
3436                            }
3437                            "IncludeAttachmentFilePatterns" => {
3438                                include_attachment_file_patterns = ::serde::de::MapAccess::next_value(&mut map)?;
3439                            }
3440                            _ => {}
3441                        }
3442                    }
3443
3444                    Ok(ServiceNowServiceCatalogConfiguration {
3445                        crawl_attachments: crawl_attachments,
3446                        document_data_field_name: document_data_field_name.ok_or(::serde::de::Error::missing_field("DocumentDataFieldName"))?,
3447                        document_title_field_name: document_title_field_name,
3448                        exclude_attachment_file_patterns: exclude_attachment_file_patterns,
3449                        field_mappings: field_mappings,
3450                        include_attachment_file_patterns: include_attachment_file_patterns,
3451                    })
3452                }
3453            }
3454
3455            d.deserialize_map(Visitor)
3456        }
3457    }
3458
3459    /// The [`AWS::Kendra::DataSource.SharePointConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html) property type.
3460    #[derive(Debug, Default)]
3461    pub struct SharePointConfiguration {
3462        /// Property [`CrawlAttachments`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-crawlattachments).
3463        ///
3464        /// Update type: _Mutable_.
3465        /// AWS CloudFormation doesn't replace the resource when you change this property.
3466        pub crawl_attachments: Option<::Value<bool>>,
3467        /// Property [`DisableLocalGroups`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-disablelocalgroups).
3468        ///
3469        /// Update type: _Mutable_.
3470        /// AWS CloudFormation doesn't replace the resource when you change this property.
3471        pub disable_local_groups: Option<::Value<bool>>,
3472        /// Property [`DocumentTitleFieldName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-documenttitlefieldname).
3473        ///
3474        /// Update type: _Mutable_.
3475        /// AWS CloudFormation doesn't replace the resource when you change this property.
3476        pub document_title_field_name: Option<::Value<String>>,
3477        /// Property [`ExclusionPatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-exclusionpatterns).
3478        ///
3479        /// Update type: _Mutable_.
3480        /// AWS CloudFormation doesn't replace the resource when you change this property.
3481        pub exclusion_patterns: Option<::ValueList<String>>,
3482        /// Property [`FieldMappings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-fieldmappings).
3483        ///
3484        /// Update type: _Mutable_.
3485        /// AWS CloudFormation doesn't replace the resource when you change this property.
3486        pub field_mappings: Option<::ValueList<DataSourceToIndexFieldMapping>>,
3487        /// Property [`InclusionPatterns`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-inclusionpatterns).
3488        ///
3489        /// Update type: _Mutable_.
3490        /// AWS CloudFormation doesn't replace the resource when you change this property.
3491        pub inclusion_patterns: Option<::ValueList<String>>,
3492        /// Property [`SecretArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-secretarn).
3493        ///
3494        /// Update type: _Mutable_.
3495        /// AWS CloudFormation doesn't replace the resource when you change this property.
3496        pub secret_arn: ::Value<String>,
3497        /// Property [`SharePointVersion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-sharepointversion).
3498        ///
3499        /// Update type: _Mutable_.
3500        /// AWS CloudFormation doesn't replace the resource when you change this property.
3501        pub share_point_version: ::Value<String>,
3502        /// Property [`Urls`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-urls).
3503        ///
3504        /// Update type: _Mutable_.
3505        /// AWS CloudFormation doesn't replace the resource when you change this property.
3506        pub urls: ::ValueList<String>,
3507        /// Property [`UseChangeLog`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-usechangelog).
3508        ///
3509        /// Update type: _Mutable_.
3510        /// AWS CloudFormation doesn't replace the resource when you change this property.
3511        pub use_change_log: Option<::Value<bool>>,
3512        /// Property [`VpcConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sharepointconfiguration.html#cfn-kendra-datasource-sharepointconfiguration-vpcconfiguration).
3513        ///
3514        /// Update type: _Mutable_.
3515        /// AWS CloudFormation doesn't replace the resource when you change this property.
3516        pub vpc_configuration: Option<::Value<DataSourceVpcConfiguration>>,
3517    }
3518
3519    impl ::codec::SerializeValue for SharePointConfiguration {
3520        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
3521            let mut map = ::serde::Serializer::serialize_map(s, None)?;
3522            if let Some(ref crawl_attachments) = self.crawl_attachments {
3523                ::serde::ser::SerializeMap::serialize_entry(&mut map, "CrawlAttachments", crawl_attachments)?;
3524            }
3525            if let Some(ref disable_local_groups) = self.disable_local_groups {
3526                ::serde::ser::SerializeMap::serialize_entry(&mut map, "DisableLocalGroups", disable_local_groups)?;
3527            }
3528            if let Some(ref document_title_field_name) = self.document_title_field_name {
3529                ::serde::ser::SerializeMap::serialize_entry(&mut map, "DocumentTitleFieldName", document_title_field_name)?;
3530            }
3531            if let Some(ref exclusion_patterns) = self.exclusion_patterns {
3532                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExclusionPatterns", exclusion_patterns)?;
3533            }
3534            if let Some(ref field_mappings) = self.field_mappings {
3535                ::serde::ser::SerializeMap::serialize_entry(&mut map, "FieldMappings", field_mappings)?;
3536            }
3537            if let Some(ref inclusion_patterns) = self.inclusion_patterns {
3538                ::serde::ser::SerializeMap::serialize_entry(&mut map, "InclusionPatterns", inclusion_patterns)?;
3539            }
3540            ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretArn", &self.secret_arn)?;
3541            ::serde::ser::SerializeMap::serialize_entry(&mut map, "SharePointVersion", &self.share_point_version)?;
3542            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Urls", &self.urls)?;
3543            if let Some(ref use_change_log) = self.use_change_log {
3544                ::serde::ser::SerializeMap::serialize_entry(&mut map, "UseChangeLog", use_change_log)?;
3545            }
3546            if let Some(ref vpc_configuration) = self.vpc_configuration {
3547                ::serde::ser::SerializeMap::serialize_entry(&mut map, "VpcConfiguration", vpc_configuration)?;
3548            }
3549            ::serde::ser::SerializeMap::end(map)
3550        }
3551    }
3552
3553    impl ::codec::DeserializeValue for SharePointConfiguration {
3554        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<SharePointConfiguration, D::Error> {
3555            struct Visitor;
3556
3557            impl<'de> ::serde::de::Visitor<'de> for Visitor {
3558                type Value = SharePointConfiguration;
3559
3560                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
3561                    write!(f, "a struct of type SharePointConfiguration")
3562                }
3563
3564                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
3565                    let mut crawl_attachments: Option<::Value<bool>> = None;
3566                    let mut disable_local_groups: Option<::Value<bool>> = None;
3567                    let mut document_title_field_name: Option<::Value<String>> = None;
3568                    let mut exclusion_patterns: Option<::ValueList<String>> = None;
3569                    let mut field_mappings: Option<::ValueList<DataSourceToIndexFieldMapping>> = None;
3570                    let mut inclusion_patterns: Option<::ValueList<String>> = None;
3571                    let mut secret_arn: Option<::Value<String>> = None;
3572                    let mut share_point_version: Option<::Value<String>> = None;
3573                    let mut urls: Option<::ValueList<String>> = None;
3574                    let mut use_change_log: Option<::Value<bool>> = None;
3575                    let mut vpc_configuration: Option<::Value<DataSourceVpcConfiguration>> = None;
3576
3577                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
3578                        match __cfn_key.as_ref() {
3579                            "CrawlAttachments" => {
3580                                crawl_attachments = ::serde::de::MapAccess::next_value(&mut map)?;
3581                            }
3582                            "DisableLocalGroups" => {
3583                                disable_local_groups = ::serde::de::MapAccess::next_value(&mut map)?;
3584                            }
3585                            "DocumentTitleFieldName" => {
3586                                document_title_field_name = ::serde::de::MapAccess::next_value(&mut map)?;
3587                            }
3588                            "ExclusionPatterns" => {
3589                                exclusion_patterns = ::serde::de::MapAccess::next_value(&mut map)?;
3590                            }
3591                            "FieldMappings" => {
3592                                field_mappings = ::serde::de::MapAccess::next_value(&mut map)?;
3593                            }
3594                            "InclusionPatterns" => {
3595                                inclusion_patterns = ::serde::de::MapAccess::next_value(&mut map)?;
3596                            }
3597                            "SecretArn" => {
3598                                secret_arn = ::serde::de::MapAccess::next_value(&mut map)?;
3599                            }
3600                            "SharePointVersion" => {
3601                                share_point_version = ::serde::de::MapAccess::next_value(&mut map)?;
3602                            }
3603                            "Urls" => {
3604                                urls = ::serde::de::MapAccess::next_value(&mut map)?;
3605                            }
3606                            "UseChangeLog" => {
3607                                use_change_log = ::serde::de::MapAccess::next_value(&mut map)?;
3608                            }
3609                            "VpcConfiguration" => {
3610                                vpc_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
3611                            }
3612                            _ => {}
3613                        }
3614                    }
3615
3616                    Ok(SharePointConfiguration {
3617                        crawl_attachments: crawl_attachments,
3618                        disable_local_groups: disable_local_groups,
3619                        document_title_field_name: document_title_field_name,
3620                        exclusion_patterns: exclusion_patterns,
3621                        field_mappings: field_mappings,
3622                        inclusion_patterns: inclusion_patterns,
3623                        secret_arn: secret_arn.ok_or(::serde::de::Error::missing_field("SecretArn"))?,
3624                        share_point_version: share_point_version.ok_or(::serde::de::Error::missing_field("SharePointVersion"))?,
3625                        urls: urls.ok_or(::serde::de::Error::missing_field("Urls"))?,
3626                        use_change_log: use_change_log,
3627                        vpc_configuration: vpc_configuration,
3628                    })
3629                }
3630            }
3631
3632            d.deserialize_map(Visitor)
3633        }
3634    }
3635
3636    /// The [`AWS::Kendra::DataSource.SqlConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sqlconfiguration.html) property type.
3637    #[derive(Debug, Default)]
3638    pub struct SqlConfiguration {
3639        /// Property [`QueryIdentifiersEnclosingOption`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-datasource-sqlconfiguration.html#cfn-kendra-datasource-sqlconfiguration-queryidentifiersenclosingoption).
3640        ///
3641        /// Update type: _Mutable_.
3642        /// AWS CloudFormation doesn't replace the resource when you change this property.
3643        pub query_identifiers_enclosing_option: Option<::Value<String>>,
3644    }
3645
3646    impl ::codec::SerializeValue for SqlConfiguration {
3647        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
3648            let mut map = ::serde::Serializer::serialize_map(s, None)?;
3649            if let Some(ref query_identifiers_enclosing_option) = self.query_identifiers_enclosing_option {
3650                ::serde::ser::SerializeMap::serialize_entry(&mut map, "QueryIdentifiersEnclosingOption", query_identifiers_enclosing_option)?;
3651            }
3652            ::serde::ser::SerializeMap::end(map)
3653        }
3654    }
3655
3656    impl ::codec::DeserializeValue for SqlConfiguration {
3657        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<SqlConfiguration, D::Error> {
3658            struct Visitor;
3659
3660            impl<'de> ::serde::de::Visitor<'de> for Visitor {
3661                type Value = SqlConfiguration;
3662
3663                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
3664                    write!(f, "a struct of type SqlConfiguration")
3665                }
3666
3667                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
3668                    let mut query_identifiers_enclosing_option: Option<::Value<String>> = None;
3669
3670                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
3671                        match __cfn_key.as_ref() {
3672                            "QueryIdentifiersEnclosingOption" => {
3673                                query_identifiers_enclosing_option = ::serde::de::MapAccess::next_value(&mut map)?;
3674                            }
3675                            _ => {}
3676                        }
3677                    }
3678
3679                    Ok(SqlConfiguration {
3680                        query_identifiers_enclosing_option: query_identifiers_enclosing_option,
3681                    })
3682                }
3683            }
3684
3685            d.deserialize_map(Visitor)
3686        }
3687    }
3688}
3689
3690pub mod faq {
3691    //! Property types for the `Faq` resource.
3692
3693    /// The [`AWS::Kendra::Faq.S3Path`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-faq-s3path.html) property type.
3694    #[derive(Debug, Default)]
3695    pub struct S3Path {
3696        /// Property [`Bucket`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-faq-s3path.html#cfn-kendra-faq-s3path-bucket).
3697        ///
3698        /// Update type: _Immutable_.
3699        /// AWS CloudFormation replaces the resource when you change this property.
3700        pub bucket: ::Value<String>,
3701        /// Property [`Key`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-faq-s3path.html#cfn-kendra-faq-s3path-key).
3702        ///
3703        /// Update type: _Immutable_.
3704        /// AWS CloudFormation replaces the resource when you change this property.
3705        pub key: ::Value<String>,
3706    }
3707
3708    impl ::codec::SerializeValue for S3Path {
3709        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
3710            let mut map = ::serde::Serializer::serialize_map(s, None)?;
3711            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Bucket", &self.bucket)?;
3712            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Key", &self.key)?;
3713            ::serde::ser::SerializeMap::end(map)
3714        }
3715    }
3716
3717    impl ::codec::DeserializeValue for S3Path {
3718        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<S3Path, D::Error> {
3719            struct Visitor;
3720
3721            impl<'de> ::serde::de::Visitor<'de> for Visitor {
3722                type Value = S3Path;
3723
3724                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
3725                    write!(f, "a struct of type S3Path")
3726                }
3727
3728                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
3729                    let mut bucket: Option<::Value<String>> = None;
3730                    let mut key: Option<::Value<String>> = None;
3731
3732                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
3733                        match __cfn_key.as_ref() {
3734                            "Bucket" => {
3735                                bucket = ::serde::de::MapAccess::next_value(&mut map)?;
3736                            }
3737                            "Key" => {
3738                                key = ::serde::de::MapAccess::next_value(&mut map)?;
3739                            }
3740                            _ => {}
3741                        }
3742                    }
3743
3744                    Ok(S3Path {
3745                        bucket: bucket.ok_or(::serde::de::Error::missing_field("Bucket"))?,
3746                        key: key.ok_or(::serde::de::Error::missing_field("Key"))?,
3747                    })
3748                }
3749            }
3750
3751            d.deserialize_map(Visitor)
3752        }
3753    }
3754}
3755
3756pub mod index {
3757    //! Property types for the `Index` resource.
3758
3759    /// The [`AWS::Kendra::Index.CapacityUnitsConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-capacityunitsconfiguration.html) property type.
3760    #[derive(Debug, Default)]
3761    pub struct CapacityUnitsConfiguration {
3762        /// Property [`QueryCapacityUnits`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-capacityunitsconfiguration.html#cfn-kendra-index-capacityunitsconfiguration-querycapacityunits).
3763        ///
3764        /// Update type: _Mutable_.
3765        /// AWS CloudFormation doesn't replace the resource when you change this property.
3766        pub query_capacity_units: ::Value<u32>,
3767        /// Property [`StorageCapacityUnits`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-capacityunitsconfiguration.html#cfn-kendra-index-capacityunitsconfiguration-storagecapacityunits).
3768        ///
3769        /// Update type: _Mutable_.
3770        /// AWS CloudFormation doesn't replace the resource when you change this property.
3771        pub storage_capacity_units: ::Value<u32>,
3772    }
3773
3774    impl ::codec::SerializeValue for CapacityUnitsConfiguration {
3775        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
3776            let mut map = ::serde::Serializer::serialize_map(s, None)?;
3777            ::serde::ser::SerializeMap::serialize_entry(&mut map, "QueryCapacityUnits", &self.query_capacity_units)?;
3778            ::serde::ser::SerializeMap::serialize_entry(&mut map, "StorageCapacityUnits", &self.storage_capacity_units)?;
3779            ::serde::ser::SerializeMap::end(map)
3780        }
3781    }
3782
3783    impl ::codec::DeserializeValue for CapacityUnitsConfiguration {
3784        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<CapacityUnitsConfiguration, D::Error> {
3785            struct Visitor;
3786
3787            impl<'de> ::serde::de::Visitor<'de> for Visitor {
3788                type Value = CapacityUnitsConfiguration;
3789
3790                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
3791                    write!(f, "a struct of type CapacityUnitsConfiguration")
3792                }
3793
3794                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
3795                    let mut query_capacity_units: Option<::Value<u32>> = None;
3796                    let mut storage_capacity_units: Option<::Value<u32>> = None;
3797
3798                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
3799                        match __cfn_key.as_ref() {
3800                            "QueryCapacityUnits" => {
3801                                query_capacity_units = ::serde::de::MapAccess::next_value(&mut map)?;
3802                            }
3803                            "StorageCapacityUnits" => {
3804                                storage_capacity_units = ::serde::de::MapAccess::next_value(&mut map)?;
3805                            }
3806                            _ => {}
3807                        }
3808                    }
3809
3810                    Ok(CapacityUnitsConfiguration {
3811                        query_capacity_units: query_capacity_units.ok_or(::serde::de::Error::missing_field("QueryCapacityUnits"))?,
3812                        storage_capacity_units: storage_capacity_units.ok_or(::serde::de::Error::missing_field("StorageCapacityUnits"))?,
3813                    })
3814                }
3815            }
3816
3817            d.deserialize_map(Visitor)
3818        }
3819    }
3820
3821    /// The [`AWS::Kendra::Index.DocumentMetadataConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-documentmetadataconfiguration.html) property type.
3822    #[derive(Debug, Default)]
3823    pub struct DocumentMetadataConfiguration {
3824        /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-documentmetadataconfiguration.html#cfn-kendra-index-documentmetadataconfiguration-name).
3825        ///
3826        /// Update type: _Mutable_.
3827        /// AWS CloudFormation doesn't replace the resource when you change this property.
3828        pub name: ::Value<String>,
3829        /// Property [`Relevance`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-documentmetadataconfiguration.html#cfn-kendra-index-documentmetadataconfiguration-relevance).
3830        ///
3831        /// Update type: _Mutable_.
3832        /// AWS CloudFormation doesn't replace the resource when you change this property.
3833        pub relevance: Option<::Value<Relevance>>,
3834        /// Property [`Search`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-documentmetadataconfiguration.html#cfn-kendra-index-documentmetadataconfiguration-search).
3835        ///
3836        /// Update type: _Mutable_.
3837        /// AWS CloudFormation doesn't replace the resource when you change this property.
3838        pub search: Option<::Value<Search>>,
3839        /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-documentmetadataconfiguration.html#cfn-kendra-index-documentmetadataconfiguration-type).
3840        ///
3841        /// Update type: _Mutable_.
3842        /// AWS CloudFormation doesn't replace the resource when you change this property.
3843        pub r#type: ::Value<String>,
3844    }
3845
3846    impl ::codec::SerializeValue for DocumentMetadataConfiguration {
3847        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
3848            let mut map = ::serde::Serializer::serialize_map(s, None)?;
3849            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?;
3850            if let Some(ref relevance) = self.relevance {
3851                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Relevance", relevance)?;
3852            }
3853            if let Some(ref search) = self.search {
3854                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Search", search)?;
3855            }
3856            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?;
3857            ::serde::ser::SerializeMap::end(map)
3858        }
3859    }
3860
3861    impl ::codec::DeserializeValue for DocumentMetadataConfiguration {
3862        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<DocumentMetadataConfiguration, D::Error> {
3863            struct Visitor;
3864
3865            impl<'de> ::serde::de::Visitor<'de> for Visitor {
3866                type Value = DocumentMetadataConfiguration;
3867
3868                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
3869                    write!(f, "a struct of type DocumentMetadataConfiguration")
3870                }
3871
3872                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
3873                    let mut name: Option<::Value<String>> = None;
3874                    let mut relevance: Option<::Value<Relevance>> = None;
3875                    let mut search: Option<::Value<Search>> = None;
3876                    let mut r#type: Option<::Value<String>> = None;
3877
3878                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
3879                        match __cfn_key.as_ref() {
3880                            "Name" => {
3881                                name = ::serde::de::MapAccess::next_value(&mut map)?;
3882                            }
3883                            "Relevance" => {
3884                                relevance = ::serde::de::MapAccess::next_value(&mut map)?;
3885                            }
3886                            "Search" => {
3887                                search = ::serde::de::MapAccess::next_value(&mut map)?;
3888                            }
3889                            "Type" => {
3890                                r#type = ::serde::de::MapAccess::next_value(&mut map)?;
3891                            }
3892                            _ => {}
3893                        }
3894                    }
3895
3896                    Ok(DocumentMetadataConfiguration {
3897                        name: name.ok_or(::serde::de::Error::missing_field("Name"))?,
3898                        relevance: relevance,
3899                        search: search,
3900                        r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?,
3901                    })
3902                }
3903            }
3904
3905            d.deserialize_map(Visitor)
3906        }
3907    }
3908
3909    /// The [`AWS::Kendra::Index.JsonTokenTypeConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-jsontokentypeconfiguration.html) property type.
3910    #[derive(Debug, Default)]
3911    pub struct JsonTokenTypeConfiguration {
3912        /// Property [`GroupAttributeField`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-jsontokentypeconfiguration.html#cfn-kendra-index-jsontokentypeconfiguration-groupattributefield).
3913        ///
3914        /// Update type: _Mutable_.
3915        /// AWS CloudFormation doesn't replace the resource when you change this property.
3916        pub group_attribute_field: ::Value<String>,
3917        /// Property [`UserNameAttributeField`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-jsontokentypeconfiguration.html#cfn-kendra-index-jsontokentypeconfiguration-usernameattributefield).
3918        ///
3919        /// Update type: _Mutable_.
3920        /// AWS CloudFormation doesn't replace the resource when you change this property.
3921        pub user_name_attribute_field: ::Value<String>,
3922    }
3923
3924    impl ::codec::SerializeValue for JsonTokenTypeConfiguration {
3925        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
3926            let mut map = ::serde::Serializer::serialize_map(s, None)?;
3927            ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupAttributeField", &self.group_attribute_field)?;
3928            ::serde::ser::SerializeMap::serialize_entry(&mut map, "UserNameAttributeField", &self.user_name_attribute_field)?;
3929            ::serde::ser::SerializeMap::end(map)
3930        }
3931    }
3932
3933    impl ::codec::DeserializeValue for JsonTokenTypeConfiguration {
3934        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<JsonTokenTypeConfiguration, D::Error> {
3935            struct Visitor;
3936
3937            impl<'de> ::serde::de::Visitor<'de> for Visitor {
3938                type Value = JsonTokenTypeConfiguration;
3939
3940                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
3941                    write!(f, "a struct of type JsonTokenTypeConfiguration")
3942                }
3943
3944                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
3945                    let mut group_attribute_field: Option<::Value<String>> = None;
3946                    let mut user_name_attribute_field: Option<::Value<String>> = None;
3947
3948                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
3949                        match __cfn_key.as_ref() {
3950                            "GroupAttributeField" => {
3951                                group_attribute_field = ::serde::de::MapAccess::next_value(&mut map)?;
3952                            }
3953                            "UserNameAttributeField" => {
3954                                user_name_attribute_field = ::serde::de::MapAccess::next_value(&mut map)?;
3955                            }
3956                            _ => {}
3957                        }
3958                    }
3959
3960                    Ok(JsonTokenTypeConfiguration {
3961                        group_attribute_field: group_attribute_field.ok_or(::serde::de::Error::missing_field("GroupAttributeField"))?,
3962                        user_name_attribute_field: user_name_attribute_field.ok_or(::serde::de::Error::missing_field("UserNameAttributeField"))?,
3963                    })
3964                }
3965            }
3966
3967            d.deserialize_map(Visitor)
3968        }
3969    }
3970
3971    /// The [`AWS::Kendra::Index.JwtTokenTypeConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-jwttokentypeconfiguration.html) property type.
3972    #[derive(Debug, Default)]
3973    pub struct JwtTokenTypeConfiguration {
3974        /// Property [`ClaimRegex`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-jwttokentypeconfiguration.html#cfn-kendra-index-jwttokentypeconfiguration-claimregex).
3975        ///
3976        /// Update type: _Mutable_.
3977        /// AWS CloudFormation doesn't replace the resource when you change this property.
3978        pub claim_regex: Option<::Value<String>>,
3979        /// Property [`GroupAttributeField`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-jwttokentypeconfiguration.html#cfn-kendra-index-jwttokentypeconfiguration-groupattributefield).
3980        ///
3981        /// Update type: _Mutable_.
3982        /// AWS CloudFormation doesn't replace the resource when you change this property.
3983        pub group_attribute_field: Option<::Value<String>>,
3984        /// Property [`Issuer`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-jwttokentypeconfiguration.html#cfn-kendra-index-jwttokentypeconfiguration-issuer).
3985        ///
3986        /// Update type: _Mutable_.
3987        /// AWS CloudFormation doesn't replace the resource when you change this property.
3988        pub issuer: Option<::Value<String>>,
3989        /// Property [`KeyLocation`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-jwttokentypeconfiguration.html#cfn-kendra-index-jwttokentypeconfiguration-keylocation).
3990        ///
3991        /// Update type: _Mutable_.
3992        /// AWS CloudFormation doesn't replace the resource when you change this property.
3993        pub key_location: ::Value<String>,
3994        /// Property [`SecretManagerArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-jwttokentypeconfiguration.html#cfn-kendra-index-jwttokentypeconfiguration-secretmanagerarn).
3995        ///
3996        /// Update type: _Mutable_.
3997        /// AWS CloudFormation doesn't replace the resource when you change this property.
3998        pub secret_manager_arn: Option<::Value<String>>,
3999        /// Property [`URL`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-jwttokentypeconfiguration.html#cfn-kendra-index-jwttokentypeconfiguration-url).
4000        ///
4001        /// Update type: _Mutable_.
4002        /// AWS CloudFormation doesn't replace the resource when you change this property.
4003        pub url: Option<::Value<String>>,
4004        /// Property [`UserNameAttributeField`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-jwttokentypeconfiguration.html#cfn-kendra-index-jwttokentypeconfiguration-usernameattributefield).
4005        ///
4006        /// Update type: _Mutable_.
4007        /// AWS CloudFormation doesn't replace the resource when you change this property.
4008        pub user_name_attribute_field: Option<::Value<String>>,
4009    }
4010
4011    impl ::codec::SerializeValue for JwtTokenTypeConfiguration {
4012        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
4013            let mut map = ::serde::Serializer::serialize_map(s, None)?;
4014            if let Some(ref claim_regex) = self.claim_regex {
4015                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ClaimRegex", claim_regex)?;
4016            }
4017            if let Some(ref group_attribute_field) = self.group_attribute_field {
4018                ::serde::ser::SerializeMap::serialize_entry(&mut map, "GroupAttributeField", group_attribute_field)?;
4019            }
4020            if let Some(ref issuer) = self.issuer {
4021                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Issuer", issuer)?;
4022            }
4023            ::serde::ser::SerializeMap::serialize_entry(&mut map, "KeyLocation", &self.key_location)?;
4024            if let Some(ref secret_manager_arn) = self.secret_manager_arn {
4025                ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretManagerArn", secret_manager_arn)?;
4026            }
4027            if let Some(ref url) = self.url {
4028                ::serde::ser::SerializeMap::serialize_entry(&mut map, "URL", url)?;
4029            }
4030            if let Some(ref user_name_attribute_field) = self.user_name_attribute_field {
4031                ::serde::ser::SerializeMap::serialize_entry(&mut map, "UserNameAttributeField", user_name_attribute_field)?;
4032            }
4033            ::serde::ser::SerializeMap::end(map)
4034        }
4035    }
4036
4037    impl ::codec::DeserializeValue for JwtTokenTypeConfiguration {
4038        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<JwtTokenTypeConfiguration, D::Error> {
4039            struct Visitor;
4040
4041            impl<'de> ::serde::de::Visitor<'de> for Visitor {
4042                type Value = JwtTokenTypeConfiguration;
4043
4044                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
4045                    write!(f, "a struct of type JwtTokenTypeConfiguration")
4046                }
4047
4048                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
4049                    let mut claim_regex: Option<::Value<String>> = None;
4050                    let mut group_attribute_field: Option<::Value<String>> = None;
4051                    let mut issuer: Option<::Value<String>> = None;
4052                    let mut key_location: Option<::Value<String>> = None;
4053                    let mut secret_manager_arn: Option<::Value<String>> = None;
4054                    let mut url: Option<::Value<String>> = None;
4055                    let mut user_name_attribute_field: Option<::Value<String>> = None;
4056
4057                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
4058                        match __cfn_key.as_ref() {
4059                            "ClaimRegex" => {
4060                                claim_regex = ::serde::de::MapAccess::next_value(&mut map)?;
4061                            }
4062                            "GroupAttributeField" => {
4063                                group_attribute_field = ::serde::de::MapAccess::next_value(&mut map)?;
4064                            }
4065                            "Issuer" => {
4066                                issuer = ::serde::de::MapAccess::next_value(&mut map)?;
4067                            }
4068                            "KeyLocation" => {
4069                                key_location = ::serde::de::MapAccess::next_value(&mut map)?;
4070                            }
4071                            "SecretManagerArn" => {
4072                                secret_manager_arn = ::serde::de::MapAccess::next_value(&mut map)?;
4073                            }
4074                            "URL" => {
4075                                url = ::serde::de::MapAccess::next_value(&mut map)?;
4076                            }
4077                            "UserNameAttributeField" => {
4078                                user_name_attribute_field = ::serde::de::MapAccess::next_value(&mut map)?;
4079                            }
4080                            _ => {}
4081                        }
4082                    }
4083
4084                    Ok(JwtTokenTypeConfiguration {
4085                        claim_regex: claim_regex,
4086                        group_attribute_field: group_attribute_field,
4087                        issuer: issuer,
4088                        key_location: key_location.ok_or(::serde::de::Error::missing_field("KeyLocation"))?,
4089                        secret_manager_arn: secret_manager_arn,
4090                        url: url,
4091                        user_name_attribute_field: user_name_attribute_field,
4092                    })
4093                }
4094            }
4095
4096            d.deserialize_map(Visitor)
4097        }
4098    }
4099
4100    /// The [`AWS::Kendra::Index.Relevance`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-relevance.html) property type.
4101    #[derive(Debug, Default)]
4102    pub struct Relevance {
4103        /// Property [`Duration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-relevance.html#cfn-kendra-index-relevance-duration).
4104        ///
4105        /// Update type: _Mutable_.
4106        /// AWS CloudFormation doesn't replace the resource when you change this property.
4107        pub duration: Option<::Value<String>>,
4108        /// Property [`Freshness`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-relevance.html#cfn-kendra-index-relevance-freshness).
4109        ///
4110        /// Update type: _Mutable_.
4111        /// AWS CloudFormation doesn't replace the resource when you change this property.
4112        pub freshness: Option<::Value<bool>>,
4113        /// Property [`Importance`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-relevance.html#cfn-kendra-index-relevance-importance).
4114        ///
4115        /// Update type: _Mutable_.
4116        /// AWS CloudFormation doesn't replace the resource when you change this property.
4117        pub importance: Option<::Value<u32>>,
4118        /// Property [`RankOrder`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-relevance.html#cfn-kendra-index-relevance-rankorder).
4119        ///
4120        /// Update type: _Mutable_.
4121        /// AWS CloudFormation doesn't replace the resource when you change this property.
4122        pub rank_order: Option<::Value<String>>,
4123        /// Property [`ValueImportanceItems`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-relevance.html#cfn-kendra-index-relevance-valueimportanceitems).
4124        ///
4125        /// Update type: _Mutable_.
4126        /// AWS CloudFormation doesn't replace the resource when you change this property.
4127        pub value_importance_items: Option<::ValueList<ValueImportanceItem>>,
4128    }
4129
4130    impl ::codec::SerializeValue for Relevance {
4131        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
4132            let mut map = ::serde::Serializer::serialize_map(s, None)?;
4133            if let Some(ref duration) = self.duration {
4134                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Duration", duration)?;
4135            }
4136            if let Some(ref freshness) = self.freshness {
4137                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Freshness", freshness)?;
4138            }
4139            if let Some(ref importance) = self.importance {
4140                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Importance", importance)?;
4141            }
4142            if let Some(ref rank_order) = self.rank_order {
4143                ::serde::ser::SerializeMap::serialize_entry(&mut map, "RankOrder", rank_order)?;
4144            }
4145            if let Some(ref value_importance_items) = self.value_importance_items {
4146                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ValueImportanceItems", value_importance_items)?;
4147            }
4148            ::serde::ser::SerializeMap::end(map)
4149        }
4150    }
4151
4152    impl ::codec::DeserializeValue for Relevance {
4153        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<Relevance, D::Error> {
4154            struct Visitor;
4155
4156            impl<'de> ::serde::de::Visitor<'de> for Visitor {
4157                type Value = Relevance;
4158
4159                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
4160                    write!(f, "a struct of type Relevance")
4161                }
4162
4163                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
4164                    let mut duration: Option<::Value<String>> = None;
4165                    let mut freshness: Option<::Value<bool>> = None;
4166                    let mut importance: Option<::Value<u32>> = None;
4167                    let mut rank_order: Option<::Value<String>> = None;
4168                    let mut value_importance_items: Option<::ValueList<ValueImportanceItem>> = None;
4169
4170                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
4171                        match __cfn_key.as_ref() {
4172                            "Duration" => {
4173                                duration = ::serde::de::MapAccess::next_value(&mut map)?;
4174                            }
4175                            "Freshness" => {
4176                                freshness = ::serde::de::MapAccess::next_value(&mut map)?;
4177                            }
4178                            "Importance" => {
4179                                importance = ::serde::de::MapAccess::next_value(&mut map)?;
4180                            }
4181                            "RankOrder" => {
4182                                rank_order = ::serde::de::MapAccess::next_value(&mut map)?;
4183                            }
4184                            "ValueImportanceItems" => {
4185                                value_importance_items = ::serde::de::MapAccess::next_value(&mut map)?;
4186                            }
4187                            _ => {}
4188                        }
4189                    }
4190
4191                    Ok(Relevance {
4192                        duration: duration,
4193                        freshness: freshness,
4194                        importance: importance,
4195                        rank_order: rank_order,
4196                        value_importance_items: value_importance_items,
4197                    })
4198                }
4199            }
4200
4201            d.deserialize_map(Visitor)
4202        }
4203    }
4204
4205    /// The [`AWS::Kendra::Index.Search`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-search.html) property type.
4206    #[derive(Debug, Default)]
4207    pub struct Search {
4208        /// Property [`Displayable`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-search.html#cfn-kendra-index-search-displayable).
4209        ///
4210        /// Update type: _Mutable_.
4211        /// AWS CloudFormation doesn't replace the resource when you change this property.
4212        pub displayable: Option<::Value<bool>>,
4213        /// Property [`Facetable`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-search.html#cfn-kendra-index-search-facetable).
4214        ///
4215        /// Update type: _Mutable_.
4216        /// AWS CloudFormation doesn't replace the resource when you change this property.
4217        pub facetable: Option<::Value<bool>>,
4218        /// Property [`Searchable`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-search.html#cfn-kendra-index-search-searchable).
4219        ///
4220        /// Update type: _Mutable_.
4221        /// AWS CloudFormation doesn't replace the resource when you change this property.
4222        pub searchable: Option<::Value<bool>>,
4223        /// Property [`Sortable`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-search.html#cfn-kendra-index-search-sortable).
4224        ///
4225        /// Update type: _Mutable_.
4226        /// AWS CloudFormation doesn't replace the resource when you change this property.
4227        pub sortable: Option<::Value<bool>>,
4228    }
4229
4230    impl ::codec::SerializeValue for Search {
4231        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
4232            let mut map = ::serde::Serializer::serialize_map(s, None)?;
4233            if let Some(ref displayable) = self.displayable {
4234                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Displayable", displayable)?;
4235            }
4236            if let Some(ref facetable) = self.facetable {
4237                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Facetable", facetable)?;
4238            }
4239            if let Some(ref searchable) = self.searchable {
4240                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Searchable", searchable)?;
4241            }
4242            if let Some(ref sortable) = self.sortable {
4243                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Sortable", sortable)?;
4244            }
4245            ::serde::ser::SerializeMap::end(map)
4246        }
4247    }
4248
4249    impl ::codec::DeserializeValue for Search {
4250        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<Search, D::Error> {
4251            struct Visitor;
4252
4253            impl<'de> ::serde::de::Visitor<'de> for Visitor {
4254                type Value = Search;
4255
4256                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
4257                    write!(f, "a struct of type Search")
4258                }
4259
4260                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
4261                    let mut displayable: Option<::Value<bool>> = None;
4262                    let mut facetable: Option<::Value<bool>> = None;
4263                    let mut searchable: Option<::Value<bool>> = None;
4264                    let mut sortable: Option<::Value<bool>> = None;
4265
4266                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
4267                        match __cfn_key.as_ref() {
4268                            "Displayable" => {
4269                                displayable = ::serde::de::MapAccess::next_value(&mut map)?;
4270                            }
4271                            "Facetable" => {
4272                                facetable = ::serde::de::MapAccess::next_value(&mut map)?;
4273                            }
4274                            "Searchable" => {
4275                                searchable = ::serde::de::MapAccess::next_value(&mut map)?;
4276                            }
4277                            "Sortable" => {
4278                                sortable = ::serde::de::MapAccess::next_value(&mut map)?;
4279                            }
4280                            _ => {}
4281                        }
4282                    }
4283
4284                    Ok(Search {
4285                        displayable: displayable,
4286                        facetable: facetable,
4287                        searchable: searchable,
4288                        sortable: sortable,
4289                    })
4290                }
4291            }
4292
4293            d.deserialize_map(Visitor)
4294        }
4295    }
4296
4297    /// The [`AWS::Kendra::Index.ServerSideEncryptionConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-serversideencryptionconfiguration.html) property type.
4298    #[derive(Debug, Default)]
4299    pub struct ServerSideEncryptionConfiguration {
4300        /// Property [`KmsKeyId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-serversideencryptionconfiguration.html#cfn-kendra-index-serversideencryptionconfiguration-kmskeyid).
4301        ///
4302        /// Update type: _Immutable_.
4303        /// AWS CloudFormation replaces the resource when you change this property.
4304        pub kms_key_id: Option<::Value<String>>,
4305    }
4306
4307    impl ::codec::SerializeValue for ServerSideEncryptionConfiguration {
4308        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
4309            let mut map = ::serde::Serializer::serialize_map(s, None)?;
4310            if let Some(ref kms_key_id) = self.kms_key_id {
4311                ::serde::ser::SerializeMap::serialize_entry(&mut map, "KmsKeyId", kms_key_id)?;
4312            }
4313            ::serde::ser::SerializeMap::end(map)
4314        }
4315    }
4316
4317    impl ::codec::DeserializeValue for ServerSideEncryptionConfiguration {
4318        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ServerSideEncryptionConfiguration, D::Error> {
4319            struct Visitor;
4320
4321            impl<'de> ::serde::de::Visitor<'de> for Visitor {
4322                type Value = ServerSideEncryptionConfiguration;
4323
4324                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
4325                    write!(f, "a struct of type ServerSideEncryptionConfiguration")
4326                }
4327
4328                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
4329                    let mut kms_key_id: Option<::Value<String>> = None;
4330
4331                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
4332                        match __cfn_key.as_ref() {
4333                            "KmsKeyId" => {
4334                                kms_key_id = ::serde::de::MapAccess::next_value(&mut map)?;
4335                            }
4336                            _ => {}
4337                        }
4338                    }
4339
4340                    Ok(ServerSideEncryptionConfiguration {
4341                        kms_key_id: kms_key_id,
4342                    })
4343                }
4344            }
4345
4346            d.deserialize_map(Visitor)
4347        }
4348    }
4349
4350    /// The [`AWS::Kendra::Index.UserTokenConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-usertokenconfiguration.html) property type.
4351    #[derive(Debug, Default)]
4352    pub struct UserTokenConfiguration {
4353        /// Property [`JsonTokenTypeConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-usertokenconfiguration.html#cfn-kendra-index-usertokenconfiguration-jsontokentypeconfiguration).
4354        ///
4355        /// Update type: _Mutable_.
4356        /// AWS CloudFormation doesn't replace the resource when you change this property.
4357        pub json_token_type_configuration: Option<::Value<JsonTokenTypeConfiguration>>,
4358        /// Property [`JwtTokenTypeConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-usertokenconfiguration.html#cfn-kendra-index-usertokenconfiguration-jwttokentypeconfiguration).
4359        ///
4360        /// Update type: _Mutable_.
4361        /// AWS CloudFormation doesn't replace the resource when you change this property.
4362        pub jwt_token_type_configuration: Option<::Value<JwtTokenTypeConfiguration>>,
4363    }
4364
4365    impl ::codec::SerializeValue for UserTokenConfiguration {
4366        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
4367            let mut map = ::serde::Serializer::serialize_map(s, None)?;
4368            if let Some(ref json_token_type_configuration) = self.json_token_type_configuration {
4369                ::serde::ser::SerializeMap::serialize_entry(&mut map, "JsonTokenTypeConfiguration", json_token_type_configuration)?;
4370            }
4371            if let Some(ref jwt_token_type_configuration) = self.jwt_token_type_configuration {
4372                ::serde::ser::SerializeMap::serialize_entry(&mut map, "JwtTokenTypeConfiguration", jwt_token_type_configuration)?;
4373            }
4374            ::serde::ser::SerializeMap::end(map)
4375        }
4376    }
4377
4378    impl ::codec::DeserializeValue for UserTokenConfiguration {
4379        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<UserTokenConfiguration, D::Error> {
4380            struct Visitor;
4381
4382            impl<'de> ::serde::de::Visitor<'de> for Visitor {
4383                type Value = UserTokenConfiguration;
4384
4385                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
4386                    write!(f, "a struct of type UserTokenConfiguration")
4387                }
4388
4389                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
4390                    let mut json_token_type_configuration: Option<::Value<JsonTokenTypeConfiguration>> = None;
4391                    let mut jwt_token_type_configuration: Option<::Value<JwtTokenTypeConfiguration>> = None;
4392
4393                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
4394                        match __cfn_key.as_ref() {
4395                            "JsonTokenTypeConfiguration" => {
4396                                json_token_type_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
4397                            }
4398                            "JwtTokenTypeConfiguration" => {
4399                                jwt_token_type_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
4400                            }
4401                            _ => {}
4402                        }
4403                    }
4404
4405                    Ok(UserTokenConfiguration {
4406                        json_token_type_configuration: json_token_type_configuration,
4407                        jwt_token_type_configuration: jwt_token_type_configuration,
4408                    })
4409                }
4410            }
4411
4412            d.deserialize_map(Visitor)
4413        }
4414    }
4415
4416    /// The [`AWS::Kendra::Index.ValueImportanceItem`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-valueimportanceitem.html) property type.
4417    #[derive(Debug, Default)]
4418    pub struct ValueImportanceItem {
4419        /// Property [`Key`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-valueimportanceitem.html#cfn-kendra-index-valueimportanceitem-key).
4420        ///
4421        /// Update type: _Mutable_.
4422        /// AWS CloudFormation doesn't replace the resource when you change this property.
4423        pub key: Option<::Value<String>>,
4424        /// Property [`Value`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kendra-index-valueimportanceitem.html#cfn-kendra-index-valueimportanceitem-value).
4425        ///
4426        /// Update type: _Mutable_.
4427        /// AWS CloudFormation doesn't replace the resource when you change this property.
4428        pub value: Option<::Value<u32>>,
4429    }
4430
4431    impl ::codec::SerializeValue for ValueImportanceItem {
4432        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
4433            let mut map = ::serde::Serializer::serialize_map(s, None)?;
4434            if let Some(ref key) = self.key {
4435                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Key", key)?;
4436            }
4437            if let Some(ref value) = self.value {
4438                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Value", value)?;
4439            }
4440            ::serde::ser::SerializeMap::end(map)
4441        }
4442    }
4443
4444    impl ::codec::DeserializeValue for ValueImportanceItem {
4445        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ValueImportanceItem, D::Error> {
4446            struct Visitor;
4447
4448            impl<'de> ::serde::de::Visitor<'de> for Visitor {
4449                type Value = ValueImportanceItem;
4450
4451                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
4452                    write!(f, "a struct of type ValueImportanceItem")
4453                }
4454
4455                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
4456                    let mut key: Option<::Value<String>> = None;
4457                    let mut value: Option<::Value<u32>> = None;
4458
4459                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
4460                        match __cfn_key.as_ref() {
4461                            "Key" => {
4462                                key = ::serde::de::MapAccess::next_value(&mut map)?;
4463                            }
4464                            "Value" => {
4465                                value = ::serde::de::MapAccess::next_value(&mut map)?;
4466                            }
4467                            _ => {}
4468                        }
4469                    }
4470
4471                    Ok(ValueImportanceItem {
4472                        key: key,
4473                        value: value,
4474                    })
4475                }
4476            }
4477
4478            d.deserialize_map(Visitor)
4479        }
4480    }
4481}