cfn/aws/
codepipeline.rs

1//! Types for the `CodePipeline` service.
2
3/// The [`AWS::CodePipeline::CustomActionType`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-customactiontype.html) resource type.
4#[derive(Debug, Default)]
5pub struct CustomActionType {
6    properties: CustomActionTypeProperties
7}
8
9/// Properties for the `CustomActionType` resource.
10#[derive(Debug, Default)]
11pub struct CustomActionTypeProperties {
12    /// Property [`Category`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-customactiontype.html#cfn-codepipeline-customactiontype-category).
13    ///
14    /// Update type: _Immutable_.
15    /// AWS CloudFormation replaces the resource when you change this property.
16    pub category: ::Value<String>,
17    /// Property [`ConfigurationProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-customactiontype.html#cfn-codepipeline-customactiontype-configurationproperties).
18    ///
19    /// Update type: _Immutable_.
20    /// AWS CloudFormation replaces the resource when you change this property.
21    pub configuration_properties: Option<::ValueList<self::custom_action_type::ConfigurationProperties>>,
22    /// Property [`InputArtifactDetails`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-customactiontype.html#cfn-codepipeline-customactiontype-inputartifactdetails).
23    ///
24    /// Update type: _Immutable_.
25    /// AWS CloudFormation replaces the resource when you change this property.
26    pub input_artifact_details: ::Value<self::custom_action_type::ArtifactDetails>,
27    /// Property [`OutputArtifactDetails`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-customactiontype.html#cfn-codepipeline-customactiontype-outputartifactdetails).
28    ///
29    /// Update type: _Immutable_.
30    /// AWS CloudFormation replaces the resource when you change this property.
31    pub output_artifact_details: ::Value<self::custom_action_type::ArtifactDetails>,
32    /// Property [`Provider`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-customactiontype.html#cfn-codepipeline-customactiontype-provider).
33    ///
34    /// Update type: _Immutable_.
35    /// AWS CloudFormation replaces the resource when you change this property.
36    pub provider: ::Value<String>,
37    /// Property [`Settings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-customactiontype.html#cfn-codepipeline-customactiontype-settings).
38    ///
39    /// Update type: _Immutable_.
40    /// AWS CloudFormation replaces the resource when you change this property.
41    pub settings: Option<::Value<self::custom_action_type::Settings>>,
42    /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-customactiontype.html#cfn-codepipeline-customactiontype-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 [`Version`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-customactiontype.html#cfn-codepipeline-customactiontype-version).
48    ///
49    /// Update type: _Immutable_.
50    /// AWS CloudFormation replaces the resource when you change this property.
51    pub version: ::Value<String>,
52}
53
54impl ::serde::Serialize for CustomActionTypeProperties {
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        ::serde::ser::SerializeMap::serialize_entry(&mut map, "Category", &self.category)?;
58        if let Some(ref configuration_properties) = self.configuration_properties {
59            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ConfigurationProperties", configuration_properties)?;
60        }
61        ::serde::ser::SerializeMap::serialize_entry(&mut map, "InputArtifactDetails", &self.input_artifact_details)?;
62        ::serde::ser::SerializeMap::serialize_entry(&mut map, "OutputArtifactDetails", &self.output_artifact_details)?;
63        ::serde::ser::SerializeMap::serialize_entry(&mut map, "Provider", &self.provider)?;
64        if let Some(ref settings) = self.settings {
65            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Settings", settings)?;
66        }
67        if let Some(ref tags) = self.tags {
68            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?;
69        }
70        ::serde::ser::SerializeMap::serialize_entry(&mut map, "Version", &self.version)?;
71        ::serde::ser::SerializeMap::end(map)
72    }
73}
74
75impl<'de> ::serde::Deserialize<'de> for CustomActionTypeProperties {
76    fn deserialize<D: ::serde::Deserializer<'de>>(d: D) -> Result<CustomActionTypeProperties, D::Error> {
77        struct Visitor;
78
79        impl<'de> ::serde::de::Visitor<'de> for Visitor {
80            type Value = CustomActionTypeProperties;
81
82            fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
83                write!(f, "a struct of type CustomActionTypeProperties")
84            }
85
86            fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
87                let mut category: Option<::Value<String>> = None;
88                let mut configuration_properties: Option<::ValueList<self::custom_action_type::ConfigurationProperties>> = None;
89                let mut input_artifact_details: Option<::Value<self::custom_action_type::ArtifactDetails>> = None;
90                let mut output_artifact_details: Option<::Value<self::custom_action_type::ArtifactDetails>> = None;
91                let mut provider: Option<::Value<String>> = None;
92                let mut settings: Option<::Value<self::custom_action_type::Settings>> = None;
93                let mut tags: Option<::ValueList<::Tag>> = None;
94                let mut version: Option<::Value<String>> = None;
95
96                while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
97                    match __cfn_key.as_ref() {
98                        "Category" => {
99                            category = ::serde::de::MapAccess::next_value(&mut map)?;
100                        }
101                        "ConfigurationProperties" => {
102                            configuration_properties = ::serde::de::MapAccess::next_value(&mut map)?;
103                        }
104                        "InputArtifactDetails" => {
105                            input_artifact_details = ::serde::de::MapAccess::next_value(&mut map)?;
106                        }
107                        "OutputArtifactDetails" => {
108                            output_artifact_details = ::serde::de::MapAccess::next_value(&mut map)?;
109                        }
110                        "Provider" => {
111                            provider = ::serde::de::MapAccess::next_value(&mut map)?;
112                        }
113                        "Settings" => {
114                            settings = ::serde::de::MapAccess::next_value(&mut map)?;
115                        }
116                        "Tags" => {
117                            tags = ::serde::de::MapAccess::next_value(&mut map)?;
118                        }
119                        "Version" => {
120                            version = ::serde::de::MapAccess::next_value(&mut map)?;
121                        }
122                        _ => {}
123                    }
124                }
125
126                Ok(CustomActionTypeProperties {
127                    category: category.ok_or(::serde::de::Error::missing_field("Category"))?,
128                    configuration_properties: configuration_properties,
129                    input_artifact_details: input_artifact_details.ok_or(::serde::de::Error::missing_field("InputArtifactDetails"))?,
130                    output_artifact_details: output_artifact_details.ok_or(::serde::de::Error::missing_field("OutputArtifactDetails"))?,
131                    provider: provider.ok_or(::serde::de::Error::missing_field("Provider"))?,
132                    settings: settings,
133                    tags: tags,
134                    version: version.ok_or(::serde::de::Error::missing_field("Version"))?,
135                })
136            }
137        }
138
139        d.deserialize_map(Visitor)
140    }
141}
142
143impl ::Resource for CustomActionType {
144    type Properties = CustomActionTypeProperties;
145    const TYPE: &'static str = "AWS::CodePipeline::CustomActionType";
146    fn properties(&self) -> &CustomActionTypeProperties {
147        &self.properties
148    }
149    fn properties_mut(&mut self) -> &mut CustomActionTypeProperties {
150        &mut self.properties
151    }
152}
153
154impl ::private::Sealed for CustomActionType {}
155
156impl From<CustomActionTypeProperties> for CustomActionType {
157    fn from(properties: CustomActionTypeProperties) -> CustomActionType {
158        CustomActionType { properties }
159    }
160}
161
162/// The [`AWS::CodePipeline::Pipeline`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html) resource type.
163#[derive(Debug, Default)]
164pub struct Pipeline {
165    properties: PipelineProperties
166}
167
168/// Properties for the `Pipeline` resource.
169#[derive(Debug, Default)]
170pub struct PipelineProperties {
171    /// Property [`ArtifactStore`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html#cfn-codepipeline-pipeline-artifactstore).
172    ///
173    /// Update type: _Mutable_.
174    /// AWS CloudFormation doesn't replace the resource when you change this property.
175    pub artifact_store: Option<::Value<self::pipeline::ArtifactStore>>,
176    /// Property [`ArtifactStores`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html#cfn-codepipeline-pipeline-artifactstores).
177    ///
178    /// Update type: _Mutable_.
179    /// AWS CloudFormation doesn't replace the resource when you change this property.
180    pub artifact_stores: Option<::ValueList<self::pipeline::ArtifactStoreMap>>,
181    /// Property [`DisableInboundStageTransitions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html#cfn-codepipeline-pipeline-disableinboundstagetransitions).
182    ///
183    /// Update type: _Mutable_.
184    /// AWS CloudFormation doesn't replace the resource when you change this property.
185    pub disable_inbound_stage_transitions: Option<::ValueList<self::pipeline::StageTransition>>,
186    /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html#cfn-codepipeline-pipeline-name).
187    ///
188    /// Update type: _Immutable_.
189    /// AWS CloudFormation replaces the resource when you change this property.
190    pub name: Option<::Value<String>>,
191    /// Property [`RestartExecutionOnUpdate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html#cfn-codepipeline-pipeline-restartexecutiononupdate).
192    ///
193    /// Update type: _Mutable_.
194    /// AWS CloudFormation doesn't replace the resource when you change this property.
195    pub restart_execution_on_update: Option<::Value<bool>>,
196    /// Property [`RoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html#cfn-codepipeline-pipeline-rolearn).
197    ///
198    /// Update type: _Mutable_.
199    /// AWS CloudFormation doesn't replace the resource when you change this property.
200    pub role_arn: ::Value<String>,
201    /// Property [`Stages`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html#cfn-codepipeline-pipeline-stages).
202    ///
203    /// Update type: _Mutable_.
204    /// AWS CloudFormation doesn't replace the resource when you change this property.
205    pub stages: ::ValueList<self::pipeline::StageDeclaration>,
206    /// Property [`Tags`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-pipeline.html#cfn-codepipeline-pipeline-tags).
207    ///
208    /// Update type: _Mutable_.
209    /// AWS CloudFormation doesn't replace the resource when you change this property.
210    pub tags: Option<::ValueList<::Tag>>,
211}
212
213impl ::serde::Serialize for PipelineProperties {
214    fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
215        let mut map = ::serde::Serializer::serialize_map(s, None)?;
216        if let Some(ref artifact_store) = self.artifact_store {
217            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ArtifactStore", artifact_store)?;
218        }
219        if let Some(ref artifact_stores) = self.artifact_stores {
220            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ArtifactStores", artifact_stores)?;
221        }
222        if let Some(ref disable_inbound_stage_transitions) = self.disable_inbound_stage_transitions {
223            ::serde::ser::SerializeMap::serialize_entry(&mut map, "DisableInboundStageTransitions", disable_inbound_stage_transitions)?;
224        }
225        if let Some(ref name) = self.name {
226            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?;
227        }
228        if let Some(ref restart_execution_on_update) = self.restart_execution_on_update {
229            ::serde::ser::SerializeMap::serialize_entry(&mut map, "RestartExecutionOnUpdate", restart_execution_on_update)?;
230        }
231        ::serde::ser::SerializeMap::serialize_entry(&mut map, "RoleArn", &self.role_arn)?;
232        ::serde::ser::SerializeMap::serialize_entry(&mut map, "Stages", &self.stages)?;
233        if let Some(ref tags) = self.tags {
234            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Tags", tags)?;
235        }
236        ::serde::ser::SerializeMap::end(map)
237    }
238}
239
240impl<'de> ::serde::Deserialize<'de> for PipelineProperties {
241    fn deserialize<D: ::serde::Deserializer<'de>>(d: D) -> Result<PipelineProperties, D::Error> {
242        struct Visitor;
243
244        impl<'de> ::serde::de::Visitor<'de> for Visitor {
245            type Value = PipelineProperties;
246
247            fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
248                write!(f, "a struct of type PipelineProperties")
249            }
250
251            fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
252                let mut artifact_store: Option<::Value<self::pipeline::ArtifactStore>> = None;
253                let mut artifact_stores: Option<::ValueList<self::pipeline::ArtifactStoreMap>> = None;
254                let mut disable_inbound_stage_transitions: Option<::ValueList<self::pipeline::StageTransition>> = None;
255                let mut name: Option<::Value<String>> = None;
256                let mut restart_execution_on_update: Option<::Value<bool>> = None;
257                let mut role_arn: Option<::Value<String>> = None;
258                let mut stages: Option<::ValueList<self::pipeline::StageDeclaration>> = None;
259                let mut tags: Option<::ValueList<::Tag>> = None;
260
261                while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
262                    match __cfn_key.as_ref() {
263                        "ArtifactStore" => {
264                            artifact_store = ::serde::de::MapAccess::next_value(&mut map)?;
265                        }
266                        "ArtifactStores" => {
267                            artifact_stores = ::serde::de::MapAccess::next_value(&mut map)?;
268                        }
269                        "DisableInboundStageTransitions" => {
270                            disable_inbound_stage_transitions = ::serde::de::MapAccess::next_value(&mut map)?;
271                        }
272                        "Name" => {
273                            name = ::serde::de::MapAccess::next_value(&mut map)?;
274                        }
275                        "RestartExecutionOnUpdate" => {
276                            restart_execution_on_update = ::serde::de::MapAccess::next_value(&mut map)?;
277                        }
278                        "RoleArn" => {
279                            role_arn = ::serde::de::MapAccess::next_value(&mut map)?;
280                        }
281                        "Stages" => {
282                            stages = ::serde::de::MapAccess::next_value(&mut map)?;
283                        }
284                        "Tags" => {
285                            tags = ::serde::de::MapAccess::next_value(&mut map)?;
286                        }
287                        _ => {}
288                    }
289                }
290
291                Ok(PipelineProperties {
292                    artifact_store: artifact_store,
293                    artifact_stores: artifact_stores,
294                    disable_inbound_stage_transitions: disable_inbound_stage_transitions,
295                    name: name,
296                    restart_execution_on_update: restart_execution_on_update,
297                    role_arn: role_arn.ok_or(::serde::de::Error::missing_field("RoleArn"))?,
298                    stages: stages.ok_or(::serde::de::Error::missing_field("Stages"))?,
299                    tags: tags,
300                })
301            }
302        }
303
304        d.deserialize_map(Visitor)
305    }
306}
307
308impl ::Resource for Pipeline {
309    type Properties = PipelineProperties;
310    const TYPE: &'static str = "AWS::CodePipeline::Pipeline";
311    fn properties(&self) -> &PipelineProperties {
312        &self.properties
313    }
314    fn properties_mut(&mut self) -> &mut PipelineProperties {
315        &mut self.properties
316    }
317}
318
319impl ::private::Sealed for Pipeline {}
320
321impl From<PipelineProperties> for Pipeline {
322    fn from(properties: PipelineProperties) -> Pipeline {
323        Pipeline { properties }
324    }
325}
326
327/// The [`AWS::CodePipeline::Webhook`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-webhook.html) resource type.
328#[derive(Debug, Default)]
329pub struct Webhook {
330    properties: WebhookProperties
331}
332
333/// Properties for the `Webhook` resource.
334#[derive(Debug, Default)]
335pub struct WebhookProperties {
336    /// Property [`Authentication`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-webhook.html#cfn-codepipeline-webhook-authentication).
337    ///
338    /// Update type: _Mutable_.
339    /// AWS CloudFormation doesn't replace the resource when you change this property.
340    pub authentication: ::Value<String>,
341    /// Property [`AuthenticationConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-webhook.html#cfn-codepipeline-webhook-authenticationconfiguration).
342    ///
343    /// Update type: _Mutable_.
344    /// AWS CloudFormation doesn't replace the resource when you change this property.
345    pub authentication_configuration: ::Value<self::webhook::WebhookAuthConfiguration>,
346    /// Property [`Filters`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-webhook.html#cfn-codepipeline-webhook-filters).
347    ///
348    /// Update type: _Mutable_.
349    /// AWS CloudFormation doesn't replace the resource when you change this property.
350    pub filters: ::ValueList<self::webhook::WebhookFilterRule>,
351    /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-webhook.html#cfn-codepipeline-webhook-name).
352    ///
353    /// Update type: _Immutable_.
354    /// AWS CloudFormation replaces the resource when you change this property.
355    pub name: Option<::Value<String>>,
356    /// Property [`RegisterWithThirdParty`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-webhook.html#cfn-codepipeline-webhook-registerwiththirdparty).
357    ///
358    /// Update type: _Mutable_.
359    /// AWS CloudFormation doesn't replace the resource when you change this property.
360    pub register_with_third_party: Option<::Value<bool>>,
361    /// Property [`TargetAction`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-webhook.html#cfn-codepipeline-webhook-targetaction).
362    ///
363    /// Update type: _Mutable_.
364    /// AWS CloudFormation doesn't replace the resource when you change this property.
365    pub target_action: ::Value<String>,
366    /// Property [`TargetPipeline`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-webhook.html#cfn-codepipeline-webhook-targetpipeline).
367    ///
368    /// Update type: _Mutable_.
369    /// AWS CloudFormation doesn't replace the resource when you change this property.
370    pub target_pipeline: ::Value<String>,
371    /// Property [`TargetPipelineVersion`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-codepipeline-webhook.html#cfn-codepipeline-webhook-targetpipelineversion).
372    ///
373    /// Update type: _Mutable_.
374    /// AWS CloudFormation doesn't replace the resource when you change this property.
375    pub target_pipeline_version: ::Value<u32>,
376}
377
378impl ::serde::Serialize for WebhookProperties {
379    fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
380        let mut map = ::serde::Serializer::serialize_map(s, None)?;
381        ::serde::ser::SerializeMap::serialize_entry(&mut map, "Authentication", &self.authentication)?;
382        ::serde::ser::SerializeMap::serialize_entry(&mut map, "AuthenticationConfiguration", &self.authentication_configuration)?;
383        ::serde::ser::SerializeMap::serialize_entry(&mut map, "Filters", &self.filters)?;
384        if let Some(ref name) = self.name {
385            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", name)?;
386        }
387        if let Some(ref register_with_third_party) = self.register_with_third_party {
388            ::serde::ser::SerializeMap::serialize_entry(&mut map, "RegisterWithThirdParty", register_with_third_party)?;
389        }
390        ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetAction", &self.target_action)?;
391        ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetPipeline", &self.target_pipeline)?;
392        ::serde::ser::SerializeMap::serialize_entry(&mut map, "TargetPipelineVersion", &self.target_pipeline_version)?;
393        ::serde::ser::SerializeMap::end(map)
394    }
395}
396
397impl<'de> ::serde::Deserialize<'de> for WebhookProperties {
398    fn deserialize<D: ::serde::Deserializer<'de>>(d: D) -> Result<WebhookProperties, D::Error> {
399        struct Visitor;
400
401        impl<'de> ::serde::de::Visitor<'de> for Visitor {
402            type Value = WebhookProperties;
403
404            fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
405                write!(f, "a struct of type WebhookProperties")
406            }
407
408            fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
409                let mut authentication: Option<::Value<String>> = None;
410                let mut authentication_configuration: Option<::Value<self::webhook::WebhookAuthConfiguration>> = None;
411                let mut filters: Option<::ValueList<self::webhook::WebhookFilterRule>> = None;
412                let mut name: Option<::Value<String>> = None;
413                let mut register_with_third_party: Option<::Value<bool>> = None;
414                let mut target_action: Option<::Value<String>> = None;
415                let mut target_pipeline: Option<::Value<String>> = None;
416                let mut target_pipeline_version: Option<::Value<u32>> = None;
417
418                while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
419                    match __cfn_key.as_ref() {
420                        "Authentication" => {
421                            authentication = ::serde::de::MapAccess::next_value(&mut map)?;
422                        }
423                        "AuthenticationConfiguration" => {
424                            authentication_configuration = ::serde::de::MapAccess::next_value(&mut map)?;
425                        }
426                        "Filters" => {
427                            filters = ::serde::de::MapAccess::next_value(&mut map)?;
428                        }
429                        "Name" => {
430                            name = ::serde::de::MapAccess::next_value(&mut map)?;
431                        }
432                        "RegisterWithThirdParty" => {
433                            register_with_third_party = ::serde::de::MapAccess::next_value(&mut map)?;
434                        }
435                        "TargetAction" => {
436                            target_action = ::serde::de::MapAccess::next_value(&mut map)?;
437                        }
438                        "TargetPipeline" => {
439                            target_pipeline = ::serde::de::MapAccess::next_value(&mut map)?;
440                        }
441                        "TargetPipelineVersion" => {
442                            target_pipeline_version = ::serde::de::MapAccess::next_value(&mut map)?;
443                        }
444                        _ => {}
445                    }
446                }
447
448                Ok(WebhookProperties {
449                    authentication: authentication.ok_or(::serde::de::Error::missing_field("Authentication"))?,
450                    authentication_configuration: authentication_configuration.ok_or(::serde::de::Error::missing_field("AuthenticationConfiguration"))?,
451                    filters: filters.ok_or(::serde::de::Error::missing_field("Filters"))?,
452                    name: name,
453                    register_with_third_party: register_with_third_party,
454                    target_action: target_action.ok_or(::serde::de::Error::missing_field("TargetAction"))?,
455                    target_pipeline: target_pipeline.ok_or(::serde::de::Error::missing_field("TargetPipeline"))?,
456                    target_pipeline_version: target_pipeline_version.ok_or(::serde::de::Error::missing_field("TargetPipelineVersion"))?,
457                })
458            }
459        }
460
461        d.deserialize_map(Visitor)
462    }
463}
464
465impl ::Resource for Webhook {
466    type Properties = WebhookProperties;
467    const TYPE: &'static str = "AWS::CodePipeline::Webhook";
468    fn properties(&self) -> &WebhookProperties {
469        &self.properties
470    }
471    fn properties_mut(&mut self) -> &mut WebhookProperties {
472        &mut self.properties
473    }
474}
475
476impl ::private::Sealed for Webhook {}
477
478impl From<WebhookProperties> for Webhook {
479    fn from(properties: WebhookProperties) -> Webhook {
480        Webhook { properties }
481    }
482}
483
484pub mod custom_action_type {
485    //! Property types for the `CustomActionType` resource.
486
487    /// The [`AWS::CodePipeline::CustomActionType.ArtifactDetails`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-artifactdetails.html) property type.
488    #[derive(Debug, Default)]
489    pub struct ArtifactDetails {
490        /// Property [`MaximumCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-artifactdetails.html#cfn-codepipeline-customactiontype-artifactdetails-maximumcount).
491        ///
492        /// Update type: _Mutable_.
493        /// AWS CloudFormation doesn't replace the resource when you change this property.
494        pub maximum_count: ::Value<u32>,
495        /// Property [`MinimumCount`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-artifactdetails.html#cfn-codepipeline-customactiontype-artifactdetails-minimumcount).
496        ///
497        /// Update type: _Mutable_.
498        /// AWS CloudFormation doesn't replace the resource when you change this property.
499        pub minimum_count: ::Value<u32>,
500    }
501
502    impl ::codec::SerializeValue for ArtifactDetails {
503        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
504            let mut map = ::serde::Serializer::serialize_map(s, None)?;
505            ::serde::ser::SerializeMap::serialize_entry(&mut map, "MaximumCount", &self.maximum_count)?;
506            ::serde::ser::SerializeMap::serialize_entry(&mut map, "MinimumCount", &self.minimum_count)?;
507            ::serde::ser::SerializeMap::end(map)
508        }
509    }
510
511    impl ::codec::DeserializeValue for ArtifactDetails {
512        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ArtifactDetails, D::Error> {
513            struct Visitor;
514
515            impl<'de> ::serde::de::Visitor<'de> for Visitor {
516                type Value = ArtifactDetails;
517
518                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
519                    write!(f, "a struct of type ArtifactDetails")
520                }
521
522                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
523                    let mut maximum_count: Option<::Value<u32>> = None;
524                    let mut minimum_count: Option<::Value<u32>> = None;
525
526                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
527                        match __cfn_key.as_ref() {
528                            "MaximumCount" => {
529                                maximum_count = ::serde::de::MapAccess::next_value(&mut map)?;
530                            }
531                            "MinimumCount" => {
532                                minimum_count = ::serde::de::MapAccess::next_value(&mut map)?;
533                            }
534                            _ => {}
535                        }
536                    }
537
538                    Ok(ArtifactDetails {
539                        maximum_count: maximum_count.ok_or(::serde::de::Error::missing_field("MaximumCount"))?,
540                        minimum_count: minimum_count.ok_or(::serde::de::Error::missing_field("MinimumCount"))?,
541                    })
542                }
543            }
544
545            d.deserialize_map(Visitor)
546        }
547    }
548
549    /// The [`AWS::CodePipeline::CustomActionType.ConfigurationProperties`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-configurationproperties.html) property type.
550    #[derive(Debug, Default)]
551    pub struct ConfigurationProperties {
552        /// Property [`Description`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-configurationproperties.html#cfn-codepipeline-customactiontype-configurationproperties-description).
553        ///
554        /// Update type: _Mutable_.
555        /// AWS CloudFormation doesn't replace the resource when you change this property.
556        pub description: Option<::Value<String>>,
557        /// Property [`Key`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-configurationproperties.html#cfn-codepipeline-customactiontype-configurationproperties-key).
558        ///
559        /// Update type: _Mutable_.
560        /// AWS CloudFormation doesn't replace the resource when you change this property.
561        pub key: ::Value<bool>,
562        /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-configurationproperties.html#cfn-codepipeline-customactiontype-configurationproperties-name).
563        ///
564        /// Update type: _Mutable_.
565        /// AWS CloudFormation doesn't replace the resource when you change this property.
566        pub name: ::Value<String>,
567        /// Property [`Queryable`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-configurationproperties.html#cfn-codepipeline-customactiontype-configurationproperties-queryable).
568        ///
569        /// Update type: _Mutable_.
570        /// AWS CloudFormation doesn't replace the resource when you change this property.
571        pub queryable: Option<::Value<bool>>,
572        /// Property [`Required`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-configurationproperties.html#cfn-codepipeline-customactiontype-configurationproperties-required).
573        ///
574        /// Update type: _Mutable_.
575        /// AWS CloudFormation doesn't replace the resource when you change this property.
576        pub required: ::Value<bool>,
577        /// Property [`Secret`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-configurationproperties.html#cfn-codepipeline-customactiontype-configurationproperties-secret).
578        ///
579        /// Update type: _Mutable_.
580        /// AWS CloudFormation doesn't replace the resource when you change this property.
581        pub secret: ::Value<bool>,
582        /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-configurationproperties.html#cfn-codepipeline-customactiontype-configurationproperties-type).
583        ///
584        /// Update type: _Mutable_.
585        /// AWS CloudFormation doesn't replace the resource when you change this property.
586        pub r#type: Option<::Value<String>>,
587    }
588
589    impl ::codec::SerializeValue for ConfigurationProperties {
590        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
591            let mut map = ::serde::Serializer::serialize_map(s, None)?;
592            if let Some(ref description) = self.description {
593                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Description", description)?;
594            }
595            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Key", &self.key)?;
596            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?;
597            if let Some(ref queryable) = self.queryable {
598                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Queryable", queryable)?;
599            }
600            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Required", &self.required)?;
601            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Secret", &self.secret)?;
602            if let Some(ref r#type) = self.r#type {
603                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", r#type)?;
604            }
605            ::serde::ser::SerializeMap::end(map)
606        }
607    }
608
609    impl ::codec::DeserializeValue for ConfigurationProperties {
610        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ConfigurationProperties, D::Error> {
611            struct Visitor;
612
613            impl<'de> ::serde::de::Visitor<'de> for Visitor {
614                type Value = ConfigurationProperties;
615
616                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
617                    write!(f, "a struct of type ConfigurationProperties")
618                }
619
620                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
621                    let mut description: Option<::Value<String>> = None;
622                    let mut key: Option<::Value<bool>> = None;
623                    let mut name: Option<::Value<String>> = None;
624                    let mut queryable: Option<::Value<bool>> = None;
625                    let mut required: Option<::Value<bool>> = None;
626                    let mut secret: Option<::Value<bool>> = None;
627                    let mut r#type: Option<::Value<String>> = None;
628
629                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
630                        match __cfn_key.as_ref() {
631                            "Description" => {
632                                description = ::serde::de::MapAccess::next_value(&mut map)?;
633                            }
634                            "Key" => {
635                                key = ::serde::de::MapAccess::next_value(&mut map)?;
636                            }
637                            "Name" => {
638                                name = ::serde::de::MapAccess::next_value(&mut map)?;
639                            }
640                            "Queryable" => {
641                                queryable = ::serde::de::MapAccess::next_value(&mut map)?;
642                            }
643                            "Required" => {
644                                required = ::serde::de::MapAccess::next_value(&mut map)?;
645                            }
646                            "Secret" => {
647                                secret = ::serde::de::MapAccess::next_value(&mut map)?;
648                            }
649                            "Type" => {
650                                r#type = ::serde::de::MapAccess::next_value(&mut map)?;
651                            }
652                            _ => {}
653                        }
654                    }
655
656                    Ok(ConfigurationProperties {
657                        description: description,
658                        key: key.ok_or(::serde::de::Error::missing_field("Key"))?,
659                        name: name.ok_or(::serde::de::Error::missing_field("Name"))?,
660                        queryable: queryable,
661                        required: required.ok_or(::serde::de::Error::missing_field("Required"))?,
662                        secret: secret.ok_or(::serde::de::Error::missing_field("Secret"))?,
663                        r#type: r#type,
664                    })
665                }
666            }
667
668            d.deserialize_map(Visitor)
669        }
670    }
671
672    /// The [`AWS::CodePipeline::CustomActionType.Settings`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-settings.html) property type.
673    #[derive(Debug, Default)]
674    pub struct Settings {
675        /// Property [`EntityUrlTemplate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-settings.html#cfn-codepipeline-customactiontype-settings-entityurltemplate).
676        ///
677        /// Update type: _Mutable_.
678        /// AWS CloudFormation doesn't replace the resource when you change this property.
679        pub entity_url_template: Option<::Value<String>>,
680        /// Property [`ExecutionUrlTemplate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-settings.html#cfn-codepipeline-customactiontype-settings-executionurltemplate).
681        ///
682        /// Update type: _Mutable_.
683        /// AWS CloudFormation doesn't replace the resource when you change this property.
684        pub execution_url_template: Option<::Value<String>>,
685        /// Property [`RevisionUrlTemplate`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-settings.html#cfn-codepipeline-customactiontype-settings-revisionurltemplate).
686        ///
687        /// Update type: _Mutable_.
688        /// AWS CloudFormation doesn't replace the resource when you change this property.
689        pub revision_url_template: Option<::Value<String>>,
690        /// Property [`ThirdPartyConfigurationUrl`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-customactiontype-settings.html#cfn-codepipeline-customactiontype-settings-thirdpartyconfigurationurl).
691        ///
692        /// Update type: _Mutable_.
693        /// AWS CloudFormation doesn't replace the resource when you change this property.
694        pub third_party_configuration_url: Option<::Value<String>>,
695    }
696
697    impl ::codec::SerializeValue for Settings {
698        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
699            let mut map = ::serde::Serializer::serialize_map(s, None)?;
700            if let Some(ref entity_url_template) = self.entity_url_template {
701                ::serde::ser::SerializeMap::serialize_entry(&mut map, "EntityUrlTemplate", entity_url_template)?;
702            }
703            if let Some(ref execution_url_template) = self.execution_url_template {
704                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ExecutionUrlTemplate", execution_url_template)?;
705            }
706            if let Some(ref revision_url_template) = self.revision_url_template {
707                ::serde::ser::SerializeMap::serialize_entry(&mut map, "RevisionUrlTemplate", revision_url_template)?;
708            }
709            if let Some(ref third_party_configuration_url) = self.third_party_configuration_url {
710                ::serde::ser::SerializeMap::serialize_entry(&mut map, "ThirdPartyConfigurationUrl", third_party_configuration_url)?;
711            }
712            ::serde::ser::SerializeMap::end(map)
713        }
714    }
715
716    impl ::codec::DeserializeValue for Settings {
717        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<Settings, D::Error> {
718            struct Visitor;
719
720            impl<'de> ::serde::de::Visitor<'de> for Visitor {
721                type Value = Settings;
722
723                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
724                    write!(f, "a struct of type Settings")
725                }
726
727                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
728                    let mut entity_url_template: Option<::Value<String>> = None;
729                    let mut execution_url_template: Option<::Value<String>> = None;
730                    let mut revision_url_template: Option<::Value<String>> = None;
731                    let mut third_party_configuration_url: Option<::Value<String>> = None;
732
733                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
734                        match __cfn_key.as_ref() {
735                            "EntityUrlTemplate" => {
736                                entity_url_template = ::serde::de::MapAccess::next_value(&mut map)?;
737                            }
738                            "ExecutionUrlTemplate" => {
739                                execution_url_template = ::serde::de::MapAccess::next_value(&mut map)?;
740                            }
741                            "RevisionUrlTemplate" => {
742                                revision_url_template = ::serde::de::MapAccess::next_value(&mut map)?;
743                            }
744                            "ThirdPartyConfigurationUrl" => {
745                                third_party_configuration_url = ::serde::de::MapAccess::next_value(&mut map)?;
746                            }
747                            _ => {}
748                        }
749                    }
750
751                    Ok(Settings {
752                        entity_url_template: entity_url_template,
753                        execution_url_template: execution_url_template,
754                        revision_url_template: revision_url_template,
755                        third_party_configuration_url: third_party_configuration_url,
756                    })
757                }
758            }
759
760            d.deserialize_map(Visitor)
761        }
762    }
763}
764
765pub mod pipeline {
766    //! Property types for the `Pipeline` resource.
767
768    /// The [`AWS::CodePipeline::Pipeline.ActionDeclaration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions.html) property type.
769    #[derive(Debug, Default)]
770    pub struct ActionDeclaration {
771        /// Property [`ActionTypeId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions.html#cfn-codepipeline-pipeline-stages-actions-actiontypeid).
772        ///
773        /// Update type: _Mutable_.
774        /// AWS CloudFormation doesn't replace the resource when you change this property.
775        pub action_type_id: ::Value<ActionTypeId>,
776        /// Property [`Configuration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions.html#cfn-codepipeline-pipeline-stages-actions-configuration).
777        ///
778        /// Update type: _Mutable_.
779        /// AWS CloudFormation doesn't replace the resource when you change this property.
780        pub configuration: Option<::Value<::json::Value>>,
781        /// Property [`InputArtifacts`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions.html#cfn-codepipeline-pipeline-stages-actions-inputartifacts).
782        ///
783        /// Update type: _Mutable_.
784        /// AWS CloudFormation doesn't replace the resource when you change this property.
785        pub input_artifacts: Option<::ValueList<InputArtifact>>,
786        /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions.html#cfn-codepipeline-pipeline-stages-actions-name).
787        ///
788        /// Update type: _Mutable_.
789        /// AWS CloudFormation doesn't replace the resource when you change this property.
790        pub name: ::Value<String>,
791        /// Property [`Namespace`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions.html#cfn-codepipeline-pipeline-actiondeclaration-namespace).
792        ///
793        /// Update type: _Mutable_.
794        /// AWS CloudFormation doesn't replace the resource when you change this property.
795        pub namespace: Option<::Value<String>>,
796        /// Property [`OutputArtifacts`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions.html#cfn-codepipeline-pipeline-stages-actions-outputartifacts).
797        ///
798        /// Update type: _Mutable_.
799        /// AWS CloudFormation doesn't replace the resource when you change this property.
800        pub output_artifacts: Option<::ValueList<OutputArtifact>>,
801        /// Property [`Region`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions.html#cfn-codepipeline-pipeline-stages-actions-region).
802        ///
803        /// Update type: _Mutable_.
804        /// AWS CloudFormation doesn't replace the resource when you change this property.
805        pub region: Option<::Value<String>>,
806        /// Property [`RoleArn`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions.html#cfn-codepipeline-pipeline-stages-actions-rolearn).
807        ///
808        /// Update type: _Mutable_.
809        /// AWS CloudFormation doesn't replace the resource when you change this property.
810        pub role_arn: Option<::Value<String>>,
811        /// Property [`RunOrder`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions.html#cfn-codepipeline-pipeline-stages-actions-runorder).
812        ///
813        /// Update type: _Mutable_.
814        /// AWS CloudFormation doesn't replace the resource when you change this property.
815        pub run_order: Option<::Value<u32>>,
816    }
817
818    impl ::codec::SerializeValue for ActionDeclaration {
819        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
820            let mut map = ::serde::Serializer::serialize_map(s, None)?;
821            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ActionTypeId", &self.action_type_id)?;
822            if let Some(ref configuration) = self.configuration {
823                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Configuration", configuration)?;
824            }
825            if let Some(ref input_artifacts) = self.input_artifacts {
826                ::serde::ser::SerializeMap::serialize_entry(&mut map, "InputArtifacts", input_artifacts)?;
827            }
828            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?;
829            if let Some(ref namespace) = self.namespace {
830                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Namespace", namespace)?;
831            }
832            if let Some(ref output_artifacts) = self.output_artifacts {
833                ::serde::ser::SerializeMap::serialize_entry(&mut map, "OutputArtifacts", output_artifacts)?;
834            }
835            if let Some(ref region) = self.region {
836                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Region", region)?;
837            }
838            if let Some(ref role_arn) = self.role_arn {
839                ::serde::ser::SerializeMap::serialize_entry(&mut map, "RoleArn", role_arn)?;
840            }
841            if let Some(ref run_order) = self.run_order {
842                ::serde::ser::SerializeMap::serialize_entry(&mut map, "RunOrder", run_order)?;
843            }
844            ::serde::ser::SerializeMap::end(map)
845        }
846    }
847
848    impl ::codec::DeserializeValue for ActionDeclaration {
849        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ActionDeclaration, D::Error> {
850            struct Visitor;
851
852            impl<'de> ::serde::de::Visitor<'de> for Visitor {
853                type Value = ActionDeclaration;
854
855                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
856                    write!(f, "a struct of type ActionDeclaration")
857                }
858
859                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
860                    let mut action_type_id: Option<::Value<ActionTypeId>> = None;
861                    let mut configuration: Option<::Value<::json::Value>> = None;
862                    let mut input_artifacts: Option<::ValueList<InputArtifact>> = None;
863                    let mut name: Option<::Value<String>> = None;
864                    let mut namespace: Option<::Value<String>> = None;
865                    let mut output_artifacts: Option<::ValueList<OutputArtifact>> = None;
866                    let mut region: Option<::Value<String>> = None;
867                    let mut role_arn: Option<::Value<String>> = None;
868                    let mut run_order: Option<::Value<u32>> = None;
869
870                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
871                        match __cfn_key.as_ref() {
872                            "ActionTypeId" => {
873                                action_type_id = ::serde::de::MapAccess::next_value(&mut map)?;
874                            }
875                            "Configuration" => {
876                                configuration = ::serde::de::MapAccess::next_value(&mut map)?;
877                            }
878                            "InputArtifacts" => {
879                                input_artifacts = ::serde::de::MapAccess::next_value(&mut map)?;
880                            }
881                            "Name" => {
882                                name = ::serde::de::MapAccess::next_value(&mut map)?;
883                            }
884                            "Namespace" => {
885                                namespace = ::serde::de::MapAccess::next_value(&mut map)?;
886                            }
887                            "OutputArtifacts" => {
888                                output_artifacts = ::serde::de::MapAccess::next_value(&mut map)?;
889                            }
890                            "Region" => {
891                                region = ::serde::de::MapAccess::next_value(&mut map)?;
892                            }
893                            "RoleArn" => {
894                                role_arn = ::serde::de::MapAccess::next_value(&mut map)?;
895                            }
896                            "RunOrder" => {
897                                run_order = ::serde::de::MapAccess::next_value(&mut map)?;
898                            }
899                            _ => {}
900                        }
901                    }
902
903                    Ok(ActionDeclaration {
904                        action_type_id: action_type_id.ok_or(::serde::de::Error::missing_field("ActionTypeId"))?,
905                        configuration: configuration,
906                        input_artifacts: input_artifacts,
907                        name: name.ok_or(::serde::de::Error::missing_field("Name"))?,
908                        namespace: namespace,
909                        output_artifacts: output_artifacts,
910                        region: region,
911                        role_arn: role_arn,
912                        run_order: run_order,
913                    })
914                }
915            }
916
917            d.deserialize_map(Visitor)
918        }
919    }
920
921    /// The [`AWS::CodePipeline::Pipeline.ActionTypeId`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions-actiontypeid.html) property type.
922    #[derive(Debug, Default)]
923    pub struct ActionTypeId {
924        /// Property [`Category`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions-actiontypeid.html#cfn-codepipeline-pipeline-stages-actions-actiontypeid-category).
925        ///
926        /// Update type: _Mutable_.
927        /// AWS CloudFormation doesn't replace the resource when you change this property.
928        pub category: ::Value<String>,
929        /// Property [`Owner`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions-actiontypeid.html#cfn-codepipeline-pipeline-stages-actions-actiontypeid-owner).
930        ///
931        /// Update type: _Mutable_.
932        /// AWS CloudFormation doesn't replace the resource when you change this property.
933        pub owner: ::Value<String>,
934        /// Property [`Provider`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions-actiontypeid.html#cfn-codepipeline-pipeline-stages-actions-actiontypeid-provider).
935        ///
936        /// Update type: _Mutable_.
937        /// AWS CloudFormation doesn't replace the resource when you change this property.
938        pub provider: ::Value<String>,
939        /// Property [`Version`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions-actiontypeid.html#cfn-codepipeline-pipeline-stages-actions-actiontypeid-version).
940        ///
941        /// Update type: _Mutable_.
942        /// AWS CloudFormation doesn't replace the resource when you change this property.
943        pub version: ::Value<String>,
944    }
945
946    impl ::codec::SerializeValue for ActionTypeId {
947        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
948            let mut map = ::serde::Serializer::serialize_map(s, None)?;
949            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Category", &self.category)?;
950            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Owner", &self.owner)?;
951            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Provider", &self.provider)?;
952            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Version", &self.version)?;
953            ::serde::ser::SerializeMap::end(map)
954        }
955    }
956
957    impl ::codec::DeserializeValue for ActionTypeId {
958        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ActionTypeId, D::Error> {
959            struct Visitor;
960
961            impl<'de> ::serde::de::Visitor<'de> for Visitor {
962                type Value = ActionTypeId;
963
964                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
965                    write!(f, "a struct of type ActionTypeId")
966                }
967
968                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
969                    let mut category: Option<::Value<String>> = None;
970                    let mut owner: Option<::Value<String>> = None;
971                    let mut provider: Option<::Value<String>> = None;
972                    let mut version: Option<::Value<String>> = None;
973
974                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
975                        match __cfn_key.as_ref() {
976                            "Category" => {
977                                category = ::serde::de::MapAccess::next_value(&mut map)?;
978                            }
979                            "Owner" => {
980                                owner = ::serde::de::MapAccess::next_value(&mut map)?;
981                            }
982                            "Provider" => {
983                                provider = ::serde::de::MapAccess::next_value(&mut map)?;
984                            }
985                            "Version" => {
986                                version = ::serde::de::MapAccess::next_value(&mut map)?;
987                            }
988                            _ => {}
989                        }
990                    }
991
992                    Ok(ActionTypeId {
993                        category: category.ok_or(::serde::de::Error::missing_field("Category"))?,
994                        owner: owner.ok_or(::serde::de::Error::missing_field("Owner"))?,
995                        provider: provider.ok_or(::serde::de::Error::missing_field("Provider"))?,
996                        version: version.ok_or(::serde::de::Error::missing_field("Version"))?,
997                    })
998                }
999            }
1000
1001            d.deserialize_map(Visitor)
1002        }
1003    }
1004
1005    /// The [`AWS::CodePipeline::Pipeline.ArtifactStore`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-artifactstore.html) property type.
1006    #[derive(Debug, Default)]
1007    pub struct ArtifactStore {
1008        /// Property [`EncryptionKey`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-artifactstore.html#cfn-codepipeline-pipeline-artifactstore-encryptionkey).
1009        ///
1010        /// Update type: _Mutable_.
1011        /// AWS CloudFormation doesn't replace the resource when you change this property.
1012        pub encryption_key: Option<::Value<EncryptionKey>>,
1013        /// Property [`Location`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-artifactstore.html#cfn-codepipeline-pipeline-artifactstore-location).
1014        ///
1015        /// Update type: _Mutable_.
1016        /// AWS CloudFormation doesn't replace the resource when you change this property.
1017        pub location: ::Value<String>,
1018        /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-artifactstore.html#cfn-codepipeline-pipeline-artifactstore-type).
1019        ///
1020        /// Update type: _Mutable_.
1021        /// AWS CloudFormation doesn't replace the resource when you change this property.
1022        pub r#type: ::Value<String>,
1023    }
1024
1025    impl ::codec::SerializeValue for ArtifactStore {
1026        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1027            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1028            if let Some(ref encryption_key) = self.encryption_key {
1029                ::serde::ser::SerializeMap::serialize_entry(&mut map, "EncryptionKey", encryption_key)?;
1030            }
1031            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Location", &self.location)?;
1032            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?;
1033            ::serde::ser::SerializeMap::end(map)
1034        }
1035    }
1036
1037    impl ::codec::DeserializeValue for ArtifactStore {
1038        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ArtifactStore, D::Error> {
1039            struct Visitor;
1040
1041            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1042                type Value = ArtifactStore;
1043
1044                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1045                    write!(f, "a struct of type ArtifactStore")
1046                }
1047
1048                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1049                    let mut encryption_key: Option<::Value<EncryptionKey>> = None;
1050                    let mut location: Option<::Value<String>> = None;
1051                    let mut r#type: Option<::Value<String>> = None;
1052
1053                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1054                        match __cfn_key.as_ref() {
1055                            "EncryptionKey" => {
1056                                encryption_key = ::serde::de::MapAccess::next_value(&mut map)?;
1057                            }
1058                            "Location" => {
1059                                location = ::serde::de::MapAccess::next_value(&mut map)?;
1060                            }
1061                            "Type" => {
1062                                r#type = ::serde::de::MapAccess::next_value(&mut map)?;
1063                            }
1064                            _ => {}
1065                        }
1066                    }
1067
1068                    Ok(ArtifactStore {
1069                        encryption_key: encryption_key,
1070                        location: location.ok_or(::serde::de::Error::missing_field("Location"))?,
1071                        r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?,
1072                    })
1073                }
1074            }
1075
1076            d.deserialize_map(Visitor)
1077        }
1078    }
1079
1080    /// The [`AWS::CodePipeline::Pipeline.ArtifactStoreMap`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-artifactstoremap.html) property type.
1081    #[derive(Debug, Default)]
1082    pub struct ArtifactStoreMap {
1083        /// Property [`ArtifactStore`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-artifactstoremap.html#cfn-codepipeline-pipeline-artifactstoremap-artifactstore).
1084        ///
1085        /// Update type: _Mutable_.
1086        /// AWS CloudFormation doesn't replace the resource when you change this property.
1087        pub artifact_store: ::Value<ArtifactStore>,
1088        /// Property [`Region`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-artifactstoremap.html#cfn-codepipeline-pipeline-artifactstoremap-region).
1089        ///
1090        /// Update type: _Mutable_.
1091        /// AWS CloudFormation doesn't replace the resource when you change this property.
1092        pub region: ::Value<String>,
1093    }
1094
1095    impl ::codec::SerializeValue for ArtifactStoreMap {
1096        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1097            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1098            ::serde::ser::SerializeMap::serialize_entry(&mut map, "ArtifactStore", &self.artifact_store)?;
1099            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Region", &self.region)?;
1100            ::serde::ser::SerializeMap::end(map)
1101        }
1102    }
1103
1104    impl ::codec::DeserializeValue for ArtifactStoreMap {
1105        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<ArtifactStoreMap, D::Error> {
1106            struct Visitor;
1107
1108            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1109                type Value = ArtifactStoreMap;
1110
1111                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1112                    write!(f, "a struct of type ArtifactStoreMap")
1113                }
1114
1115                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1116                    let mut artifact_store: Option<::Value<ArtifactStore>> = None;
1117                    let mut region: Option<::Value<String>> = None;
1118
1119                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1120                        match __cfn_key.as_ref() {
1121                            "ArtifactStore" => {
1122                                artifact_store = ::serde::de::MapAccess::next_value(&mut map)?;
1123                            }
1124                            "Region" => {
1125                                region = ::serde::de::MapAccess::next_value(&mut map)?;
1126                            }
1127                            _ => {}
1128                        }
1129                    }
1130
1131                    Ok(ArtifactStoreMap {
1132                        artifact_store: artifact_store.ok_or(::serde::de::Error::missing_field("ArtifactStore"))?,
1133                        region: region.ok_or(::serde::de::Error::missing_field("Region"))?,
1134                    })
1135                }
1136            }
1137
1138            d.deserialize_map(Visitor)
1139        }
1140    }
1141
1142    /// The [`AWS::CodePipeline::Pipeline.BlockerDeclaration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-blockers.html) property type.
1143    #[derive(Debug, Default)]
1144    pub struct BlockerDeclaration {
1145        /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-blockers.html#cfn-codepipeline-pipeline-stages-blockers-name).
1146        ///
1147        /// Update type: _Mutable_.
1148        /// AWS CloudFormation doesn't replace the resource when you change this property.
1149        pub name: ::Value<String>,
1150        /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-blockers.html#cfn-codepipeline-pipeline-stages-blockers-type).
1151        ///
1152        /// Update type: _Mutable_.
1153        /// AWS CloudFormation doesn't replace the resource when you change this property.
1154        pub r#type: ::Value<String>,
1155    }
1156
1157    impl ::codec::SerializeValue for BlockerDeclaration {
1158        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1159            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1160            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?;
1161            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?;
1162            ::serde::ser::SerializeMap::end(map)
1163        }
1164    }
1165
1166    impl ::codec::DeserializeValue for BlockerDeclaration {
1167        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<BlockerDeclaration, D::Error> {
1168            struct Visitor;
1169
1170            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1171                type Value = BlockerDeclaration;
1172
1173                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1174                    write!(f, "a struct of type BlockerDeclaration")
1175                }
1176
1177                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1178                    let mut name: Option<::Value<String>> = None;
1179                    let mut r#type: Option<::Value<String>> = None;
1180
1181                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1182                        match __cfn_key.as_ref() {
1183                            "Name" => {
1184                                name = ::serde::de::MapAccess::next_value(&mut map)?;
1185                            }
1186                            "Type" => {
1187                                r#type = ::serde::de::MapAccess::next_value(&mut map)?;
1188                            }
1189                            _ => {}
1190                        }
1191                    }
1192
1193                    Ok(BlockerDeclaration {
1194                        name: name.ok_or(::serde::de::Error::missing_field("Name"))?,
1195                        r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?,
1196                    })
1197                }
1198            }
1199
1200            d.deserialize_map(Visitor)
1201        }
1202    }
1203
1204    /// The [`AWS::CodePipeline::Pipeline.EncryptionKey`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-artifactstore-encryptionkey.html) property type.
1205    #[derive(Debug, Default)]
1206    pub struct EncryptionKey {
1207        /// Property [`Id`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-artifactstore-encryptionkey.html#cfn-codepipeline-pipeline-artifactstore-encryptionkey-id).
1208        ///
1209        /// Update type: _Mutable_.
1210        /// AWS CloudFormation doesn't replace the resource when you change this property.
1211        pub id: ::Value<String>,
1212        /// Property [`Type`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-artifactstore-encryptionkey.html#cfn-codepipeline-pipeline-artifactstore-encryptionkey-type).
1213        ///
1214        /// Update type: _Mutable_.
1215        /// AWS CloudFormation doesn't replace the resource when you change this property.
1216        pub r#type: ::Value<String>,
1217    }
1218
1219    impl ::codec::SerializeValue for EncryptionKey {
1220        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1221            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1222            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Id", &self.id)?;
1223            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Type", &self.r#type)?;
1224            ::serde::ser::SerializeMap::end(map)
1225        }
1226    }
1227
1228    impl ::codec::DeserializeValue for EncryptionKey {
1229        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<EncryptionKey, D::Error> {
1230            struct Visitor;
1231
1232            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1233                type Value = EncryptionKey;
1234
1235                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1236                    write!(f, "a struct of type EncryptionKey")
1237                }
1238
1239                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1240                    let mut id: Option<::Value<String>> = None;
1241                    let mut r#type: 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                            "Id" => {
1246                                id = ::serde::de::MapAccess::next_value(&mut map)?;
1247                            }
1248                            "Type" => {
1249                                r#type = ::serde::de::MapAccess::next_value(&mut map)?;
1250                            }
1251                            _ => {}
1252                        }
1253                    }
1254
1255                    Ok(EncryptionKey {
1256                        id: id.ok_or(::serde::de::Error::missing_field("Id"))?,
1257                        r#type: r#type.ok_or(::serde::de::Error::missing_field("Type"))?,
1258                    })
1259                }
1260            }
1261
1262            d.deserialize_map(Visitor)
1263        }
1264    }
1265
1266    /// The [`AWS::CodePipeline::Pipeline.InputArtifact`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions-inputartifacts.html) property type.
1267    #[derive(Debug, Default)]
1268    pub struct InputArtifact {
1269        /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions-inputartifacts.html#cfn-codepipeline-pipeline-stages-actions-inputartifacts-name).
1270        ///
1271        /// Update type: _Mutable_.
1272        /// AWS CloudFormation doesn't replace the resource when you change this property.
1273        pub name: ::Value<String>,
1274    }
1275
1276    impl ::codec::SerializeValue for InputArtifact {
1277        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1278            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1279            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?;
1280            ::serde::ser::SerializeMap::end(map)
1281        }
1282    }
1283
1284    impl ::codec::DeserializeValue for InputArtifact {
1285        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<InputArtifact, D::Error> {
1286            struct Visitor;
1287
1288            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1289                type Value = InputArtifact;
1290
1291                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1292                    write!(f, "a struct of type InputArtifact")
1293                }
1294
1295                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1296                    let mut name: Option<::Value<String>> = None;
1297
1298                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1299                        match __cfn_key.as_ref() {
1300                            "Name" => {
1301                                name = ::serde::de::MapAccess::next_value(&mut map)?;
1302                            }
1303                            _ => {}
1304                        }
1305                    }
1306
1307                    Ok(InputArtifact {
1308                        name: name.ok_or(::serde::de::Error::missing_field("Name"))?,
1309                    })
1310                }
1311            }
1312
1313            d.deserialize_map(Visitor)
1314        }
1315    }
1316
1317    /// The [`AWS::CodePipeline::Pipeline.OutputArtifact`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions-outputartifacts.html) property type.
1318    #[derive(Debug, Default)]
1319    pub struct OutputArtifact {
1320        /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages-actions-outputartifacts.html#cfn-codepipeline-pipeline-stages-actions-outputartifacts-name).
1321        ///
1322        /// Update type: _Mutable_.
1323        /// AWS CloudFormation doesn't replace the resource when you change this property.
1324        pub name: ::Value<String>,
1325    }
1326
1327    impl ::codec::SerializeValue for OutputArtifact {
1328        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1329            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1330            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?;
1331            ::serde::ser::SerializeMap::end(map)
1332        }
1333    }
1334
1335    impl ::codec::DeserializeValue for OutputArtifact {
1336        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<OutputArtifact, D::Error> {
1337            struct Visitor;
1338
1339            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1340                type Value = OutputArtifact;
1341
1342                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1343                    write!(f, "a struct of type OutputArtifact")
1344                }
1345
1346                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1347                    let mut name: Option<::Value<String>> = None;
1348
1349                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1350                        match __cfn_key.as_ref() {
1351                            "Name" => {
1352                                name = ::serde::de::MapAccess::next_value(&mut map)?;
1353                            }
1354                            _ => {}
1355                        }
1356                    }
1357
1358                    Ok(OutputArtifact {
1359                        name: name.ok_or(::serde::de::Error::missing_field("Name"))?,
1360                    })
1361                }
1362            }
1363
1364            d.deserialize_map(Visitor)
1365        }
1366    }
1367
1368    /// The [`AWS::CodePipeline::Pipeline.StageDeclaration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages.html) property type.
1369    #[derive(Debug, Default)]
1370    pub struct StageDeclaration {
1371        /// Property [`Actions`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages.html#cfn-codepipeline-pipeline-stages-actions).
1372        ///
1373        /// Update type: _Mutable_.
1374        /// AWS CloudFormation doesn't replace the resource when you change this property.
1375        pub actions: ::ValueList<ActionDeclaration>,
1376        /// Property [`Blockers`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages.html#cfn-codepipeline-pipeline-stages-blockers).
1377        ///
1378        /// Update type: _Mutable_.
1379        /// AWS CloudFormation doesn't replace the resource when you change this property.
1380        pub blockers: Option<::ValueList<BlockerDeclaration>>,
1381        /// Property [`Name`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-stages.html#cfn-codepipeline-pipeline-stages-name).
1382        ///
1383        /// Update type: _Mutable_.
1384        /// AWS CloudFormation doesn't replace the resource when you change this property.
1385        pub name: ::Value<String>,
1386    }
1387
1388    impl ::codec::SerializeValue for StageDeclaration {
1389        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1390            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1391            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Actions", &self.actions)?;
1392            if let Some(ref blockers) = self.blockers {
1393                ::serde::ser::SerializeMap::serialize_entry(&mut map, "Blockers", blockers)?;
1394            }
1395            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Name", &self.name)?;
1396            ::serde::ser::SerializeMap::end(map)
1397        }
1398    }
1399
1400    impl ::codec::DeserializeValue for StageDeclaration {
1401        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<StageDeclaration, D::Error> {
1402            struct Visitor;
1403
1404            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1405                type Value = StageDeclaration;
1406
1407                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1408                    write!(f, "a struct of type StageDeclaration")
1409                }
1410
1411                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1412                    let mut actions: Option<::ValueList<ActionDeclaration>> = None;
1413                    let mut blockers: Option<::ValueList<BlockerDeclaration>> = None;
1414                    let mut name: Option<::Value<String>> = None;
1415
1416                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1417                        match __cfn_key.as_ref() {
1418                            "Actions" => {
1419                                actions = ::serde::de::MapAccess::next_value(&mut map)?;
1420                            }
1421                            "Blockers" => {
1422                                blockers = ::serde::de::MapAccess::next_value(&mut map)?;
1423                            }
1424                            "Name" => {
1425                                name = ::serde::de::MapAccess::next_value(&mut map)?;
1426                            }
1427                            _ => {}
1428                        }
1429                    }
1430
1431                    Ok(StageDeclaration {
1432                        actions: actions.ok_or(::serde::de::Error::missing_field("Actions"))?,
1433                        blockers: blockers,
1434                        name: name.ok_or(::serde::de::Error::missing_field("Name"))?,
1435                    })
1436                }
1437            }
1438
1439            d.deserialize_map(Visitor)
1440        }
1441    }
1442
1443    /// The [`AWS::CodePipeline::Pipeline.StageTransition`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-disableinboundstagetransitions.html) property type.
1444    #[derive(Debug, Default)]
1445    pub struct StageTransition {
1446        /// Property [`Reason`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-disableinboundstagetransitions.html#cfn-codepipeline-pipeline-disableinboundstagetransitions-reason).
1447        ///
1448        /// Update type: _Mutable_.
1449        /// AWS CloudFormation doesn't replace the resource when you change this property.
1450        pub reason: ::Value<String>,
1451        /// Property [`StageName`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-pipeline-disableinboundstagetransitions.html#cfn-codepipeline-pipeline-disableinboundstagetransitions-stagename).
1452        ///
1453        /// Update type: _Mutable_.
1454        /// AWS CloudFormation doesn't replace the resource when you change this property.
1455        pub stage_name: ::Value<String>,
1456    }
1457
1458    impl ::codec::SerializeValue for StageTransition {
1459        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1460            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1461            ::serde::ser::SerializeMap::serialize_entry(&mut map, "Reason", &self.reason)?;
1462            ::serde::ser::SerializeMap::serialize_entry(&mut map, "StageName", &self.stage_name)?;
1463            ::serde::ser::SerializeMap::end(map)
1464        }
1465    }
1466
1467    impl ::codec::DeserializeValue for StageTransition {
1468        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<StageTransition, D::Error> {
1469            struct Visitor;
1470
1471            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1472                type Value = StageTransition;
1473
1474                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1475                    write!(f, "a struct of type StageTransition")
1476                }
1477
1478                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1479                    let mut reason: Option<::Value<String>> = None;
1480                    let mut stage_name: Option<::Value<String>> = None;
1481
1482                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1483                        match __cfn_key.as_ref() {
1484                            "Reason" => {
1485                                reason = ::serde::de::MapAccess::next_value(&mut map)?;
1486                            }
1487                            "StageName" => {
1488                                stage_name = ::serde::de::MapAccess::next_value(&mut map)?;
1489                            }
1490                            _ => {}
1491                        }
1492                    }
1493
1494                    Ok(StageTransition {
1495                        reason: reason.ok_or(::serde::de::Error::missing_field("Reason"))?,
1496                        stage_name: stage_name.ok_or(::serde::de::Error::missing_field("StageName"))?,
1497                    })
1498                }
1499            }
1500
1501            d.deserialize_map(Visitor)
1502        }
1503    }
1504}
1505
1506pub mod webhook {
1507    //! Property types for the `Webhook` resource.
1508
1509    /// The [`AWS::CodePipeline::Webhook.WebhookAuthConfiguration`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-webhook-webhookauthconfiguration.html) property type.
1510    #[derive(Debug, Default)]
1511    pub struct WebhookAuthConfiguration {
1512        /// Property [`AllowedIPRange`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-webhook-webhookauthconfiguration.html#cfn-codepipeline-webhook-webhookauthconfiguration-allowediprange).
1513        ///
1514        /// Update type: _Mutable_.
1515        /// AWS CloudFormation doesn't replace the resource when you change this property.
1516        pub allowed_ip_range: Option<::Value<String>>,
1517        /// Property [`SecretToken`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-webhook-webhookauthconfiguration.html#cfn-codepipeline-webhook-webhookauthconfiguration-secrettoken).
1518        ///
1519        /// Update type: _Mutable_.
1520        /// AWS CloudFormation doesn't replace the resource when you change this property.
1521        pub secret_token: Option<::Value<String>>,
1522    }
1523
1524    impl ::codec::SerializeValue for WebhookAuthConfiguration {
1525        fn serialize<S: ::serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
1526            let mut map = ::serde::Serializer::serialize_map(s, None)?;
1527            if let Some(ref allowed_ip_range) = self.allowed_ip_range {
1528                ::serde::ser::SerializeMap::serialize_entry(&mut map, "AllowedIPRange", allowed_ip_range)?;
1529            }
1530            if let Some(ref secret_token) = self.secret_token {
1531                ::serde::ser::SerializeMap::serialize_entry(&mut map, "SecretToken", secret_token)?;
1532            }
1533            ::serde::ser::SerializeMap::end(map)
1534        }
1535    }
1536
1537    impl ::codec::DeserializeValue for WebhookAuthConfiguration {
1538        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<WebhookAuthConfiguration, D::Error> {
1539            struct Visitor;
1540
1541            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1542                type Value = WebhookAuthConfiguration;
1543
1544                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1545                    write!(f, "a struct of type WebhookAuthConfiguration")
1546                }
1547
1548                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1549                    let mut allowed_ip_range: Option<::Value<String>> = None;
1550                    let mut secret_token: Option<::Value<String>> = None;
1551
1552                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1553                        match __cfn_key.as_ref() {
1554                            "AllowedIPRange" => {
1555                                allowed_ip_range = ::serde::de::MapAccess::next_value(&mut map)?;
1556                            }
1557                            "SecretToken" => {
1558                                secret_token = ::serde::de::MapAccess::next_value(&mut map)?;
1559                            }
1560                            _ => {}
1561                        }
1562                    }
1563
1564                    Ok(WebhookAuthConfiguration {
1565                        allowed_ip_range: allowed_ip_range,
1566                        secret_token: secret_token,
1567                    })
1568                }
1569            }
1570
1571            d.deserialize_map(Visitor)
1572        }
1573    }
1574
1575    /// The [`AWS::CodePipeline::Webhook.WebhookFilterRule`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-webhook-webhookfilterrule.html) property type.
1576    #[derive(Debug, Default)]
1577    pub struct WebhookFilterRule {
1578        /// Property [`JsonPath`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-webhook-webhookfilterrule.html#cfn-codepipeline-webhook-webhookfilterrule-jsonpath).
1579        ///
1580        /// Update type: _Mutable_.
1581        /// AWS CloudFormation doesn't replace the resource when you change this property.
1582        pub json_path: ::Value<String>,
1583        /// Property [`MatchEquals`](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-codepipeline-webhook-webhookfilterrule.html#cfn-codepipeline-webhook-webhookfilterrule-matchequals).
1584        ///
1585        /// Update type: _Mutable_.
1586        /// AWS CloudFormation doesn't replace the resource when you change this property.
1587        pub match_equals: Option<::Value<String>>,
1588    }
1589
1590    impl ::codec::SerializeValue for WebhookFilterRule {
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            ::serde::ser::SerializeMap::serialize_entry(&mut map, "JsonPath", &self.json_path)?;
1594            if let Some(ref match_equals) = self.match_equals {
1595                ::serde::ser::SerializeMap::serialize_entry(&mut map, "MatchEquals", match_equals)?;
1596            }
1597            ::serde::ser::SerializeMap::end(map)
1598        }
1599    }
1600
1601    impl ::codec::DeserializeValue for WebhookFilterRule {
1602        fn deserialize<'de, D: ::serde::Deserializer<'de>>(d: D) -> Result<WebhookFilterRule, D::Error> {
1603            struct Visitor;
1604
1605            impl<'de> ::serde::de::Visitor<'de> for Visitor {
1606                type Value = WebhookFilterRule;
1607
1608                fn expecting(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
1609                    write!(f, "a struct of type WebhookFilterRule")
1610                }
1611
1612                fn visit_map<A: ::serde::de::MapAccess<'de>>(self, mut map: A) -> Result<Self::Value, A::Error> {
1613                    let mut json_path: Option<::Value<String>> = None;
1614                    let mut match_equals: Option<::Value<String>> = None;
1615
1616                    while let Some(__cfn_key) = ::serde::de::MapAccess::next_key::<String>(&mut map)? {
1617                        match __cfn_key.as_ref() {
1618                            "JsonPath" => {
1619                                json_path = ::serde::de::MapAccess::next_value(&mut map)?;
1620                            }
1621                            "MatchEquals" => {
1622                                match_equals = ::serde::de::MapAccess::next_value(&mut map)?;
1623                            }
1624                            _ => {}
1625                        }
1626                    }
1627
1628                    Ok(WebhookFilterRule {
1629                        json_path: json_path.ok_or(::serde::de::Error::missing_field("JsonPath"))?,
1630                        match_equals: match_equals,
1631                    })
1632                }
1633            }
1634
1635            d.deserialize_map(Visitor)
1636        }
1637    }
1638}