rusoto_cloudformation/
generated.rs

1// =================================================================
2//
3//                           * WARNING *
4//
5//                    This file is generated!
6//
7//  Changes made to this file will be overwritten. If changes are
8//  required to the generated code, the service_crategen project
9//  must be updated to generate the changes.
10//
11// =================================================================
12
13use std::error::Error;
14use std::fmt;
15
16use async_trait::async_trait;
17use rusoto_core::credential::ProvideAwsCredentials;
18use rusoto_core::region;
19use rusoto_core::request::{BufferedHttpResponse, DispatchSignedRequest};
20use rusoto_core::{Client, RusotoError};
21
22use rusoto_core::param::{Params, ServiceParams};
23use rusoto_core::proto::xml::error::*;
24use rusoto_core::proto::xml::util::{
25    self as xml_util, deserialize_elements, find_start_element, skip_tree,
26};
27use rusoto_core::proto::xml::util::{Next, Peek, XmlParseError, XmlResponse};
28use rusoto_core::request::HttpResponse;
29use rusoto_core::signature::SignedRequest;
30#[cfg(feature = "deserialize_structs")]
31use serde::Deserialize;
32#[cfg(feature = "serialize_structs")]
33use serde::Serialize;
34use serde_urlencoded;
35use std::str::FromStr;
36use xml::EventReader;
37
38impl CloudFormationClient {
39    fn new_params(&self, operation_name: &str) -> Params {
40        let mut params = Params::new();
41
42        params.put("Action", operation_name);
43        params.put("Version", "2010-05-15");
44
45        params
46    }
47
48    async fn sign_and_dispatch<E>(
49        &self,
50        request: SignedRequest,
51        from_response: fn(BufferedHttpResponse) -> RusotoError<E>,
52    ) -> Result<HttpResponse, RusotoError<E>> {
53        let mut response = self.client.sign_and_dispatch(request).await?;
54        if !response.status.is_success() {
55            let response = response.buffer().await.map_err(RusotoError::HttpDispatch)?;
56            return Err(from_response(response));
57        }
58
59        Ok(response)
60    }
61}
62
63#[allow(dead_code)]
64struct AccountDeserializer;
65impl AccountDeserializer {
66    #[allow(dead_code, unused_variables)]
67    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
68        xml_util::deserialize_primitive(tag_name, stack, Ok)
69    }
70}
71/// <p>Structure that contains the results of the account gate function which AWS CloudFormation invokes, if present, before proceeding with a stack set operation in an account and Region.</p> <p>For each account and Region, AWS CloudFormation lets you specify a Lamdba function that encapsulates any requirements that must be met before CloudFormation can proceed with a stack set operation in that account and Region. CloudFormation invokes the function each time a stack set operation is requested for that account and Region; if the function returns <code>FAILED</code>, CloudFormation cancels the operation in that account and Region, and sets the stack set operation result status for that account and Region to <code>FAILED</code>. </p> <p>For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-account-gating.html">Configuring a target account gate</a>.</p>
72#[derive(Clone, Debug, Default, PartialEq)]
73#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
74pub struct AccountGateResult {
75    /// <p><p>The status of the account gate function.</p> <ul> <li> <p> <code>SUCCEEDED</code>: The account gate function has determined that the account and Region passes any requirements for a stack set operation to occur. AWS CloudFormation proceeds with the stack operation in that account and Region. </p> </li> <li> <p> <code>FAILED</code>: The account gate function has determined that the account and Region does not meet the requirements for a stack set operation to occur. AWS CloudFormation cancels the stack set operation in that account and Region, and sets the stack set operation result status for that account and Region to <code>FAILED</code>. </p> </li> <li> <p> <code>SKIPPED</code>: AWS CloudFormation has skipped calling the account gate function for this account and Region, for one of the following reasons:</p> <ul> <li> <p>An account gate function has not been specified for the account and Region. AWS CloudFormation proceeds with the stack set operation in this account and Region.</p> </li> <li> <p>The <code>AWSCloudFormationStackSetExecutionRole</code> of the stack set adminstration account lacks permissions to invoke the function. AWS CloudFormation proceeds with the stack set operation in this account and Region.</p> </li> <li> <p>Either no action is necessary, or no action is possible, on the stack. AWS CloudFormation skips the stack set operation in this account and Region.</p> </li> </ul> </li> </ul></p>
76    pub status: Option<String>,
77    /// <p>The reason for the account gate status assigned to this account and Region for the stack set operation.</p>
78    pub status_reason: Option<String>,
79}
80
81#[allow(dead_code)]
82struct AccountGateResultDeserializer;
83impl AccountGateResultDeserializer {
84    #[allow(dead_code, unused_variables)]
85    fn deserialize<T: Peek + Next>(
86        tag_name: &str,
87        stack: &mut T,
88    ) -> Result<AccountGateResult, XmlParseError> {
89        deserialize_elements::<_, AccountGateResult, _>(tag_name, stack, |name, stack, obj| {
90            match name {
91                "Status" => {
92                    obj.status = Some(AccountGateStatusDeserializer::deserialize("Status", stack)?);
93                }
94                "StatusReason" => {
95                    obj.status_reason = Some(AccountGateStatusReasonDeserializer::deserialize(
96                        "StatusReason",
97                        stack,
98                    )?);
99                }
100                _ => skip_tree(stack),
101            }
102            Ok(())
103        })
104    }
105}
106#[allow(dead_code)]
107struct AccountGateStatusDeserializer;
108impl AccountGateStatusDeserializer {
109    #[allow(dead_code, unused_variables)]
110    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
111        xml_util::deserialize_primitive(tag_name, stack, Ok)
112    }
113}
114#[allow(dead_code)]
115struct AccountGateStatusReasonDeserializer;
116impl AccountGateStatusReasonDeserializer {
117    #[allow(dead_code, unused_variables)]
118    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
119        xml_util::deserialize_primitive(tag_name, stack, Ok)
120    }
121}
122/// <p>The AccountLimit data type. </p> <p>CloudFormation has the following limits per account:</p> <ul> <li> <p>Number of concurrent resources</p> </li> <li> <p>Number of stacks</p> </li> <li> <p>Number of stack outputs</p> </li> </ul> <p>For more information about these account limits, and other CloudFormation limits, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html">AWS CloudFormation Limits</a> in the <i>AWS CloudFormation User Guide</i>.</p>
123#[derive(Clone, Debug, Default, PartialEq)]
124#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
125pub struct AccountLimit {
126    /// <p>The name of the account limit.</p> <p>Values: <code>ConcurrentResourcesLimit</code> | <code>StackLimit</code> | <code>StackOutputsLimit</code> </p>
127    pub name: Option<String>,
128    /// <p>The value that is associated with the account limit name.</p>
129    pub value: Option<i64>,
130}
131
132#[allow(dead_code)]
133struct AccountLimitDeserializer;
134impl AccountLimitDeserializer {
135    #[allow(dead_code, unused_variables)]
136    fn deserialize<T: Peek + Next>(
137        tag_name: &str,
138        stack: &mut T,
139    ) -> Result<AccountLimit, XmlParseError> {
140        deserialize_elements::<_, AccountLimit, _>(tag_name, stack, |name, stack, obj| {
141            match name {
142                "Name" => {
143                    obj.name = Some(LimitNameDeserializer::deserialize("Name", stack)?);
144                }
145                "Value" => {
146                    obj.value = Some(LimitValueDeserializer::deserialize("Value", stack)?);
147                }
148                _ => skip_tree(stack),
149            }
150            Ok(())
151        })
152    }
153}
154#[allow(dead_code)]
155struct AccountLimitListDeserializer;
156impl AccountLimitListDeserializer {
157    #[allow(dead_code, unused_variables)]
158    fn deserialize<T: Peek + Next>(
159        tag_name: &str,
160        stack: &mut T,
161    ) -> Result<Vec<AccountLimit>, XmlParseError> {
162        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
163            if name == "member" {
164                obj.push(AccountLimitDeserializer::deserialize("member", stack)?);
165            } else {
166                skip_tree(stack);
167            }
168            Ok(())
169        })
170    }
171}
172#[allow(dead_code)]
173struct AccountListDeserializer;
174impl AccountListDeserializer {
175    #[allow(dead_code, unused_variables)]
176    fn deserialize<T: Peek + Next>(
177        tag_name: &str,
178        stack: &mut T,
179    ) -> Result<Vec<String>, XmlParseError> {
180        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
181            if name == "member" {
182                obj.push(AccountDeserializer::deserialize("member", stack)?);
183            } else {
184                skip_tree(stack);
185            }
186            Ok(())
187        })
188    }
189}
190
191/// Serialize `AccountList` contents to a `SignedRequest`.
192struct AccountListSerializer;
193impl AccountListSerializer {
194    fn serialize(params: &mut Params, name: &str, obj: &Vec<String>) {
195        for (index, obj) in obj.iter().enumerate() {
196            let key = format!("{}.member.{}", name, index + 1);
197            params.put(&key, &obj);
198        }
199    }
200}
201
202#[allow(dead_code)]
203struct AllowedValueDeserializer;
204impl AllowedValueDeserializer {
205    #[allow(dead_code, unused_variables)]
206    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
207        xml_util::deserialize_primitive(tag_name, stack, Ok)
208    }
209}
210#[allow(dead_code)]
211struct AllowedValuesDeserializer;
212impl AllowedValuesDeserializer {
213    #[allow(dead_code, unused_variables)]
214    fn deserialize<T: Peek + Next>(
215        tag_name: &str,
216        stack: &mut T,
217    ) -> Result<Vec<String>, XmlParseError> {
218        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
219            if name == "member" {
220                obj.push(AllowedValueDeserializer::deserialize("member", stack)?);
221            } else {
222                skip_tree(stack);
223            }
224            Ok(())
225        })
226    }
227}
228#[allow(dead_code)]
229struct ArnDeserializer;
230impl ArnDeserializer {
231    #[allow(dead_code, unused_variables)]
232    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
233        xml_util::deserialize_primitive(tag_name, stack, Ok)
234    }
235}
236/// <p>[<code>Service-managed</code> permissions] Describes whether StackSets automatically deploys to AWS Organizations accounts that are added to a target organization or organizational unit (OU).</p>
237#[derive(Clone, Debug, Default, PartialEq)]
238#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
239#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
240pub struct AutoDeployment {
241    /// <p>If set to <code>true</code>, StackSets automatically deploys additional stack instances to AWS Organizations accounts that are added to a target organization or organizational unit (OU) in the specified Regions. If an account is removed from a target organization or OU, StackSets deletes stack instances from the account in the specified Regions.</p>
242    pub enabled: Option<bool>,
243    /// <p>If set to <code>true</code>, stack resources are retained when an account is removed from a target organization or OU. If set to <code>false</code>, stack resources are deleted. Specify only if <code>Enabled</code> is set to <code>True</code>.</p>
244    pub retain_stacks_on_account_removal: Option<bool>,
245}
246
247#[allow(dead_code)]
248struct AutoDeploymentDeserializer;
249impl AutoDeploymentDeserializer {
250    #[allow(dead_code, unused_variables)]
251    fn deserialize<T: Peek + Next>(
252        tag_name: &str,
253        stack: &mut T,
254    ) -> Result<AutoDeployment, XmlParseError> {
255        deserialize_elements::<_, AutoDeployment, _>(tag_name, stack, |name, stack, obj| {
256            match name {
257                "Enabled" => {
258                    obj.enabled = Some(AutoDeploymentNullableDeserializer::deserialize(
259                        "Enabled", stack,
260                    )?);
261                }
262                "RetainStacksOnAccountRemoval" => {
263                    obj.retain_stacks_on_account_removal = Some(
264                        RetainStacksOnAccountRemovalNullableDeserializer::deserialize(
265                            "RetainStacksOnAccountRemoval",
266                            stack,
267                        )?,
268                    );
269                }
270                _ => skip_tree(stack),
271            }
272            Ok(())
273        })
274    }
275}
276
277/// Serialize `AutoDeployment` contents to a `SignedRequest`.
278struct AutoDeploymentSerializer;
279impl AutoDeploymentSerializer {
280    fn serialize(params: &mut Params, name: &str, obj: &AutoDeployment) {
281        let mut prefix = name.to_string();
282        if prefix != "" {
283            prefix.push_str(".");
284        }
285
286        if let Some(ref field_value) = obj.enabled {
287            params.put(&format!("{}{}", prefix, "Enabled"), &field_value);
288        }
289        if let Some(ref field_value) = obj.retain_stacks_on_account_removal {
290            params.put(
291                &format!("{}{}", prefix, "RetainStacksOnAccountRemoval"),
292                &field_value,
293            );
294        }
295    }
296}
297
298#[allow(dead_code)]
299struct AutoDeploymentNullableDeserializer;
300impl AutoDeploymentNullableDeserializer {
301    #[allow(dead_code, unused_variables)]
302    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<bool, XmlParseError> {
303        xml_util::deserialize_primitive(tag_name, stack, |s| Ok(bool::from_str(&s).unwrap()))
304    }
305}
306#[allow(dead_code)]
307struct BoxedIntegerDeserializer;
308impl BoxedIntegerDeserializer {
309    #[allow(dead_code, unused_variables)]
310    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<i64, XmlParseError> {
311        xml_util::deserialize_primitive(tag_name, stack, |s| Ok(i64::from_str(&s).unwrap()))
312    }
313}
314/// <p>The input for the <a>CancelUpdateStack</a> action.</p>
315#[derive(Clone, Debug, Default, PartialEq)]
316#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
317pub struct CancelUpdateStackInput {
318    /// <p>A unique identifier for this <code>CancelUpdateStack</code> request. Specify this token if you plan to retry requests so that AWS CloudFormation knows that you're not attempting to cancel an update on a stack with the same name. You might retry <code>CancelUpdateStack</code> requests to ensure that AWS CloudFormation successfully received them.</p>
319    pub client_request_token: Option<String>,
320    /// <p>The name or the unique stack ID that is associated with the stack.</p>
321    pub stack_name: String,
322}
323
324/// Serialize `CancelUpdateStackInput` contents to a `SignedRequest`.
325struct CancelUpdateStackInputSerializer;
326impl CancelUpdateStackInputSerializer {
327    fn serialize(params: &mut Params, name: &str, obj: &CancelUpdateStackInput) {
328        let mut prefix = name.to_string();
329        if prefix != "" {
330            prefix.push_str(".");
331        }
332
333        if let Some(ref field_value) = obj.client_request_token {
334            params.put(&format!("{}{}", prefix, "ClientRequestToken"), &field_value);
335        }
336        params.put(&format!("{}{}", prefix, "StackName"), &obj.stack_name);
337    }
338}
339
340#[allow(dead_code)]
341struct CapabilitiesDeserializer;
342impl CapabilitiesDeserializer {
343    #[allow(dead_code, unused_variables)]
344    fn deserialize<T: Peek + Next>(
345        tag_name: &str,
346        stack: &mut T,
347    ) -> Result<Vec<String>, XmlParseError> {
348        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
349            if name == "member" {
350                obj.push(CapabilityDeserializer::deserialize("member", stack)?);
351            } else {
352                skip_tree(stack);
353            }
354            Ok(())
355        })
356    }
357}
358
359/// Serialize `Capabilities` contents to a `SignedRequest`.
360struct CapabilitiesSerializer;
361impl CapabilitiesSerializer {
362    fn serialize(params: &mut Params, name: &str, obj: &Vec<String>) {
363        for (index, obj) in obj.iter().enumerate() {
364            let key = format!("{}.member.{}", name, index + 1);
365            params.put(&key, &obj);
366        }
367    }
368}
369
370#[allow(dead_code)]
371struct CapabilitiesReasonDeserializer;
372impl CapabilitiesReasonDeserializer {
373    #[allow(dead_code, unused_variables)]
374    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
375        xml_util::deserialize_primitive(tag_name, stack, Ok)
376    }
377}
378#[allow(dead_code)]
379struct CapabilityDeserializer;
380impl CapabilityDeserializer {
381    #[allow(dead_code, unused_variables)]
382    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
383        xml_util::deserialize_primitive(tag_name, stack, Ok)
384    }
385}
386#[allow(dead_code)]
387struct CausingEntityDeserializer;
388impl CausingEntityDeserializer {
389    #[allow(dead_code, unused_variables)]
390    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
391        xml_util::deserialize_primitive(tag_name, stack, Ok)
392    }
393}
394/// <p>The <code>Change</code> structure describes the changes AWS CloudFormation will perform if you execute the change set.</p>
395#[derive(Clone, Debug, Default, PartialEq)]
396#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
397pub struct Change {
398    /// <p>A <code>ResourceChange</code> structure that describes the resource and action that AWS CloudFormation will perform.</p>
399    pub resource_change: Option<ResourceChange>,
400    /// <p>The type of entity that AWS CloudFormation changes. Currently, the only entity type is <code>Resource</code>.</p>
401    pub type_: Option<String>,
402}
403
404#[allow(dead_code)]
405struct ChangeDeserializer;
406impl ChangeDeserializer {
407    #[allow(dead_code, unused_variables)]
408    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<Change, XmlParseError> {
409        deserialize_elements::<_, Change, _>(tag_name, stack, |name, stack, obj| {
410            match name {
411                "ResourceChange" => {
412                    obj.resource_change = Some(ResourceChangeDeserializer::deserialize(
413                        "ResourceChange",
414                        stack,
415                    )?);
416                }
417                "Type" => {
418                    obj.type_ = Some(ChangeTypeDeserializer::deserialize("Type", stack)?);
419                }
420                _ => skip_tree(stack),
421            }
422            Ok(())
423        })
424    }
425}
426#[allow(dead_code)]
427struct ChangeActionDeserializer;
428impl ChangeActionDeserializer {
429    #[allow(dead_code, unused_variables)]
430    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
431        xml_util::deserialize_primitive(tag_name, stack, Ok)
432    }
433}
434#[allow(dead_code)]
435struct ChangeSetIdDeserializer;
436impl ChangeSetIdDeserializer {
437    #[allow(dead_code, unused_variables)]
438    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
439        xml_util::deserialize_primitive(tag_name, stack, Ok)
440    }
441}
442#[allow(dead_code)]
443struct ChangeSetNameDeserializer;
444impl ChangeSetNameDeserializer {
445    #[allow(dead_code, unused_variables)]
446    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
447        xml_util::deserialize_primitive(tag_name, stack, Ok)
448    }
449}
450#[allow(dead_code)]
451struct ChangeSetStatusDeserializer;
452impl ChangeSetStatusDeserializer {
453    #[allow(dead_code, unused_variables)]
454    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
455        xml_util::deserialize_primitive(tag_name, stack, Ok)
456    }
457}
458#[allow(dead_code)]
459struct ChangeSetStatusReasonDeserializer;
460impl ChangeSetStatusReasonDeserializer {
461    #[allow(dead_code, unused_variables)]
462    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
463        xml_util::deserialize_primitive(tag_name, stack, Ok)
464    }
465}
466#[allow(dead_code)]
467struct ChangeSetSummariesDeserializer;
468impl ChangeSetSummariesDeserializer {
469    #[allow(dead_code, unused_variables)]
470    fn deserialize<T: Peek + Next>(
471        tag_name: &str,
472        stack: &mut T,
473    ) -> Result<Vec<ChangeSetSummary>, XmlParseError> {
474        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
475            if name == "member" {
476                obj.push(ChangeSetSummaryDeserializer::deserialize("member", stack)?);
477            } else {
478                skip_tree(stack);
479            }
480            Ok(())
481        })
482    }
483}
484/// <p>The <code>ChangeSetSummary</code> structure describes a change set, its status, and the stack with which it's associated.</p>
485#[derive(Clone, Debug, Default, PartialEq)]
486#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
487pub struct ChangeSetSummary {
488    /// <p>The ID of the change set.</p>
489    pub change_set_id: Option<String>,
490    /// <p>The name of the change set.</p>
491    pub change_set_name: Option<String>,
492    /// <p>The start time when the change set was created, in UTC.</p>
493    pub creation_time: Option<String>,
494    /// <p>Descriptive information about the change set.</p>
495    pub description: Option<String>,
496    /// <p>If the change set execution status is <code>AVAILABLE</code>, you can execute the change set. If you can’t execute the change set, the status indicates why. For example, a change set might be in an <code>UNAVAILABLE</code> state because AWS CloudFormation is still creating it or in an <code>OBSOLETE</code> state because the stack was already updated.</p>
497    pub execution_status: Option<String>,
498    /// <p>The ID of the stack with which the change set is associated.</p>
499    pub stack_id: Option<String>,
500    /// <p>The name of the stack with which the change set is associated.</p>
501    pub stack_name: Option<String>,
502    /// <p>The state of the change set, such as <code>CREATE_IN_PROGRESS</code>, <code>CREATE_COMPLETE</code>, or <code>FAILED</code>.</p>
503    pub status: Option<String>,
504    /// <p>A description of the change set's status. For example, if your change set is in the <code>FAILED</code> state, AWS CloudFormation shows the error message.</p>
505    pub status_reason: Option<String>,
506}
507
508#[allow(dead_code)]
509struct ChangeSetSummaryDeserializer;
510impl ChangeSetSummaryDeserializer {
511    #[allow(dead_code, unused_variables)]
512    fn deserialize<T: Peek + Next>(
513        tag_name: &str,
514        stack: &mut T,
515    ) -> Result<ChangeSetSummary, XmlParseError> {
516        deserialize_elements::<_, ChangeSetSummary, _>(tag_name, stack, |name, stack, obj| {
517            match name {
518                "ChangeSetId" => {
519                    obj.change_set_id =
520                        Some(ChangeSetIdDeserializer::deserialize("ChangeSetId", stack)?);
521                }
522                "ChangeSetName" => {
523                    obj.change_set_name = Some(ChangeSetNameDeserializer::deserialize(
524                        "ChangeSetName",
525                        stack,
526                    )?);
527                }
528                "CreationTime" => {
529                    obj.creation_time = Some(CreationTimeDeserializer::deserialize(
530                        "CreationTime",
531                        stack,
532                    )?);
533                }
534                "Description" => {
535                    obj.description =
536                        Some(DescriptionDeserializer::deserialize("Description", stack)?);
537                }
538                "ExecutionStatus" => {
539                    obj.execution_status = Some(ExecutionStatusDeserializer::deserialize(
540                        "ExecutionStatus",
541                        stack,
542                    )?);
543                }
544                "StackId" => {
545                    obj.stack_id = Some(StackIdDeserializer::deserialize("StackId", stack)?);
546                }
547                "StackName" => {
548                    obj.stack_name = Some(StackNameDeserializer::deserialize("StackName", stack)?);
549                }
550                "Status" => {
551                    obj.status = Some(ChangeSetStatusDeserializer::deserialize("Status", stack)?);
552                }
553                "StatusReason" => {
554                    obj.status_reason = Some(ChangeSetStatusReasonDeserializer::deserialize(
555                        "StatusReason",
556                        stack,
557                    )?);
558                }
559                _ => skip_tree(stack),
560            }
561            Ok(())
562        })
563    }
564}
565#[allow(dead_code)]
566struct ChangeSourceDeserializer;
567impl ChangeSourceDeserializer {
568    #[allow(dead_code, unused_variables)]
569    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
570        xml_util::deserialize_primitive(tag_name, stack, Ok)
571    }
572}
573#[allow(dead_code)]
574struct ChangeTypeDeserializer;
575impl ChangeTypeDeserializer {
576    #[allow(dead_code, unused_variables)]
577    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
578        xml_util::deserialize_primitive(tag_name, stack, Ok)
579    }
580}
581#[allow(dead_code)]
582struct ChangesDeserializer;
583impl ChangesDeserializer {
584    #[allow(dead_code, unused_variables)]
585    fn deserialize<T: Peek + Next>(
586        tag_name: &str,
587        stack: &mut T,
588    ) -> Result<Vec<Change>, XmlParseError> {
589        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
590            if name == "member" {
591                obj.push(ChangeDeserializer::deserialize("member", stack)?);
592            } else {
593                skip_tree(stack);
594            }
595            Ok(())
596        })
597    }
598}
599#[allow(dead_code)]
600struct ClientRequestTokenDeserializer;
601impl ClientRequestTokenDeserializer {
602    #[allow(dead_code, unused_variables)]
603    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
604        xml_util::deserialize_primitive(tag_name, stack, Ok)
605    }
606}
607/// <p>The input for the <a>ContinueUpdateRollback</a> action.</p>
608#[derive(Clone, Debug, Default, PartialEq)]
609#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
610pub struct ContinueUpdateRollbackInput {
611    /// <p>A unique identifier for this <code>ContinueUpdateRollback</code> request. Specify this token if you plan to retry requests so that AWS CloudFormation knows that you're not attempting to continue the rollback to a stack with the same name. You might retry <code>ContinueUpdateRollback</code> requests to ensure that AWS CloudFormation successfully received them.</p>
612    pub client_request_token: Option<String>,
613    /// <p><p>A list of the logical IDs of the resources that AWS CloudFormation skips during the continue update rollback operation. You can specify only resources that are in the <code>UPDATE<em>FAILED</code> state because a rollback failed. You can&#39;t specify resources that are in the <code>UPDATE</em>FAILED</code> state for other reasons, for example, because an update was cancelled. To check why a resource update failed, use the <a>DescribeStackResources</a> action, and view the resource status reason. </p> <important> <p>Specify this property to skip rolling back resources that AWS CloudFormation can&#39;t successfully roll back. We recommend that you <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/troubleshooting.html#troubleshooting-errors-update-rollback-failed"> troubleshoot</a> resources before skipping them. AWS CloudFormation sets the status of the specified resources to <code>UPDATE<em>COMPLETE</code> and continues to roll back the stack. After the rollback is complete, the state of the skipped resources will be inconsistent with the state of the resources in the stack template. Before performing another stack update, you must update the stack or resources to be consistent with each other. If you don&#39;t, subsequent stack updates might fail, and the stack will become unrecoverable. </p> </important> <p>Specify the minimum number of resources required to successfully roll back your stack. For example, a failed resource update might cause dependent resources to fail. In this case, it might not be necessary to skip the dependent resources. </p> <p>To skip resources that are part of nested stacks, use the following format: <code>NestedStackName.ResourceLogicalID</code>. If you want to specify the logical ID of a stack resource (<code>Type: AWS::CloudFormation::Stack</code>) in the <code>ResourcesToSkip</code> list, then its corresponding embedded stack must be in one of the following states: <code>DELETE</em>IN<em>PROGRESS</code>, <code>DELETE</em>COMPLETE</code>, or <code>DELETE_FAILED</code>. </p> <note> <p>Don&#39;t confuse a child stack&#39;s name with its corresponding logical ID defined in the parent stack. For an example of a continue update rollback operation with nested stacks, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-continueupdaterollback.html#nested-stacks">Using ResourcesToSkip to recover a nested stacks hierarchy</a>. </p> </note></p>
614    pub resources_to_skip: Option<Vec<String>>,
615    /// <p>The Amazon Resource Name (ARN) of an AWS Identity and Access Management (IAM) role that AWS CloudFormation assumes to roll back the stack. AWS CloudFormation uses the role's credentials to make calls on your behalf. AWS CloudFormation always uses this role for all future operations on the stack. As long as users have permission to operate on the stack, AWS CloudFormation uses this role even if the users don't have permission to pass it. Ensure that the role grants least privilege.</p> <p>If you don't specify a value, AWS CloudFormation uses the role that was previously associated with the stack. If no role is available, AWS CloudFormation uses a temporary session that is generated from your user credentials.</p>
616    pub role_arn: Option<String>,
617    /// <p><p>The name or the unique ID of the stack that you want to continue rolling back.</p> <note> <p>Don&#39;t specify the name of a nested stack (a stack that was created by using the <code>AWS::CloudFormation::Stack</code> resource). Instead, use this operation on the parent stack (the stack that contains the <code>AWS::CloudFormation::Stack</code> resource).</p> </note></p>
618    pub stack_name: String,
619}
620
621/// Serialize `ContinueUpdateRollbackInput` contents to a `SignedRequest`.
622struct ContinueUpdateRollbackInputSerializer;
623impl ContinueUpdateRollbackInputSerializer {
624    fn serialize(params: &mut Params, name: &str, obj: &ContinueUpdateRollbackInput) {
625        let mut prefix = name.to_string();
626        if prefix != "" {
627            prefix.push_str(".");
628        }
629
630        if let Some(ref field_value) = obj.client_request_token {
631            params.put(&format!("{}{}", prefix, "ClientRequestToken"), &field_value);
632        }
633        if let Some(ref field_value) = obj.resources_to_skip {
634            ResourcesToSkipSerializer::serialize(
635                params,
636                &format!("{}{}", prefix, "ResourcesToSkip"),
637                field_value,
638            );
639        }
640        if let Some(ref field_value) = obj.role_arn {
641            params.put(&format!("{}{}", prefix, "RoleARN"), &field_value);
642        }
643        params.put(&format!("{}{}", prefix, "StackName"), &obj.stack_name);
644    }
645}
646
647/// <p>The output for a <a>ContinueUpdateRollback</a> action.</p>
648#[derive(Clone, Debug, Default, PartialEq)]
649#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
650pub struct ContinueUpdateRollbackOutput {}
651
652#[allow(dead_code)]
653struct ContinueUpdateRollbackOutputDeserializer;
654impl ContinueUpdateRollbackOutputDeserializer {
655    #[allow(dead_code, unused_variables)]
656    fn deserialize<T: Peek + Next>(
657        tag_name: &str,
658        stack: &mut T,
659    ) -> Result<ContinueUpdateRollbackOutput, XmlParseError> {
660        xml_util::start_element(tag_name, stack)?;
661
662        let obj = ContinueUpdateRollbackOutput::default();
663
664        xml_util::end_element(tag_name, stack)?;
665
666        Ok(obj)
667    }
668}
669/// <p>The input for the <a>CreateChangeSet</a> action.</p>
670#[derive(Clone, Debug, Default, PartialEq)]
671#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
672pub struct CreateChangeSetInput {
673    /// <p><p>In some cases, you must explicitly acknowledge that your stack template contains certain capabilities in order for AWS CloudFormation to create the stack.</p> <ul> <li> <p> <code>CAPABILITY<em>IAM</code> and <code>CAPABILITY</em>NAMED<em>IAM</code> </p> <p>Some stack templates might include resources that can affect permissions in your AWS account; for example, by creating new AWS Identity and Access Management (IAM) users. For those stacks, you must explicitly acknowledge this by specifying one of these capabilities.</p> <p>The following IAM resources require you to specify either the <code>CAPABILITY</em>IAM</code> or <code>CAPABILITY<em>NAMED</em>IAM</code> capability.</p> <ul> <li> <p>If you have IAM resources, you can specify either capability. </p> </li> <li> <p>If you have IAM resources with custom names, you <i>must</i> specify <code>CAPABILITY<em>NAMED</em>IAM</code>. </p> </li> <li> <p>If you don&#39;t specify either of these capabilities, AWS CloudFormation returns an <code>InsufficientCapabilities</code> error.</p> </li> </ul> <p>If your stack template contains these resources, we recommend that you review all permissions associated with them and edit their permissions if necessary.</p> <ul> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-accesskey.html"> AWS::IAM::AccessKey</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-group.html"> AWS::IAM::Group</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-instanceprofile.html"> AWS::IAM::InstanceProfile</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html"> AWS::IAM::Policy</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html"> AWS::IAM::Role</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user.html"> AWS::IAM::User</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-addusertogroup.html"> AWS::IAM::UserToGroupAddition</a> </p> </li> </ul> <p>For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html#capabilities">Acknowledging IAM Resources in AWS CloudFormation Templates</a>.</p> </li> <li> <p> <code>CAPABILITY<em>AUTO</em>EXPAND</code> </p> <p>Some template contain macros. Macros perform custom processing on templates; this can include simple actions like find-and-replace operations, all the way to extensive transformations of entire templates. Because of this, users typically create a change set from the processed template, so that they can review the changes resulting from the macros before actually creating the stack. If your stack template contains one or more macros, and you choose to create a stack directly from the processed template, without first reviewing the resulting changes in a change set, you must acknowledge this capability. This includes the <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/create-reusable-transform-function-snippets-and-add-to-your-template-with-aws-include-transform.html">AWS::Include</a> and <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/transform-aws-serverless.html">AWS::Serverless</a> transforms, which are macros hosted by AWS CloudFormation.</p> <note> <p>This capacity does not apply to creating change sets, and specifying it when creating change sets has no effect.</p> <p>Also, change sets do not currently support nested stacks. If you want to create a stack from a stack template that contains macros <i>and</i> nested stacks, you must create or update the stack directly from the template using the <a>CreateStack</a> or <a>UpdateStack</a> action, and specifying this capability.</p> </note> <p>For more information on macros, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-macros.html">Using AWS CloudFormation Macros to Perform Custom Processing on Templates</a>.</p> </li> </ul></p>
674    pub capabilities: Option<Vec<String>>,
675    /// <p>The name of the change set. The name must be unique among all change sets that are associated with the specified stack.</p> <p>A change set name can contain only alphanumeric, case sensitive characters and hyphens. It must start with an alphabetic character and cannot exceed 128 characters.</p>
676    pub change_set_name: String,
677    /// <p>The type of change set operation. To create a change set for a new stack, specify <code>CREATE</code>. To create a change set for an existing stack, specify <code>UPDATE</code>. To create a change set for an import operation, specify <code>IMPORT</code>.</p> <p>If you create a change set for a new stack, AWS Cloudformation creates a stack with a unique stack ID, but no template or resources. The stack will be in the <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html#d0e11995"> <code>REVIEW_IN_PROGRESS</code> </a> state until you execute the change set.</p> <p>By default, AWS CloudFormation specifies <code>UPDATE</code>. You can't use the <code>UPDATE</code> type to create a change set for a new stack or the <code>CREATE</code> type to create a change set for an existing stack.</p>
678    pub change_set_type: Option<String>,
679    /// <p>A unique identifier for this <code>CreateChangeSet</code> request. Specify this token if you plan to retry requests so that AWS CloudFormation knows that you're not attempting to create another change set with the same name. You might retry <code>CreateChangeSet</code> requests to ensure that AWS CloudFormation successfully received them.</p>
680    pub client_token: Option<String>,
681    /// <p>A description to help you identify this change set.</p>
682    pub description: Option<String>,
683    /// <p>The Amazon Resource Names (ARNs) of Amazon Simple Notification Service (Amazon SNS) topics that AWS CloudFormation associates with the stack. To remove all associated notification topics, specify an empty list.</p>
684    pub notification_ar_ns: Option<Vec<String>>,
685    /// <p>A list of <code>Parameter</code> structures that specify input parameters for the change set. For more information, see the <a>Parameter</a> data type.</p>
686    pub parameters: Option<Vec<Parameter>>,
687    /// <p>The template resource types that you have permissions to work with if you execute this change set, such as <code>AWS::EC2::Instance</code>, <code>AWS::EC2::*</code>, or <code>Custom::MyCustomInstance</code>.</p> <p>If the list of resource types doesn't include a resource type that you're updating, the stack update fails. By default, AWS CloudFormation grants permissions to all resource types. AWS Identity and Access Management (IAM) uses this parameter for condition keys in IAM policies for AWS CloudFormation. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html">Controlling Access with AWS Identity and Access Management</a> in the AWS CloudFormation User Guide.</p>
688    pub resource_types: Option<Vec<String>>,
689    /// <p>The resources to import into your stack.</p>
690    pub resources_to_import: Option<Vec<ResourceToImport>>,
691    /// <p>The Amazon Resource Name (ARN) of an AWS Identity and Access Management (IAM) role that AWS CloudFormation assumes when executing the change set. AWS CloudFormation uses the role's credentials to make calls on your behalf. AWS CloudFormation uses this role for all future operations on the stack. As long as users have permission to operate on the stack, AWS CloudFormation uses this role even if the users don't have permission to pass it. Ensure that the role grants least privilege.</p> <p>If you don't specify a value, AWS CloudFormation uses the role that was previously associated with the stack. If no role is available, AWS CloudFormation uses a temporary session that is generated from your user credentials.</p>
692    pub role_arn: Option<String>,
693    /// <p>The rollback triggers for AWS CloudFormation to monitor during stack creation and updating operations, and for the specified monitoring period afterwards.</p>
694    pub rollback_configuration: Option<RollbackConfiguration>,
695    /// <p>The name or the unique ID of the stack for which you are creating a change set. AWS CloudFormation generates the change set by comparing this stack's information with the information that you submit, such as a modified template or different parameter input values.</p>
696    pub stack_name: String,
697    /// <p>Key-value pairs to associate with this stack. AWS CloudFormation also propagates these tags to resources in the stack. You can specify a maximum of 50 tags.</p>
698    pub tags: Option<Vec<Tag>>,
699    /// <p>A structure that contains the body of the revised template, with a minimum length of 1 byte and a maximum length of 51,200 bytes. AWS CloudFormation generates the change set by comparing this template with the template of the stack that you specified.</p> <p>Conditional: You must specify only <code>TemplateBody</code> or <code>TemplateURL</code>.</p>
700    pub template_body: Option<String>,
701    /// <p>The location of the file that contains the revised template. The URL must point to a template (max size: 460,800 bytes) that is located in an S3 bucket. AWS CloudFormation generates the change set by comparing this template with the stack that you specified.</p> <p>Conditional: You must specify only <code>TemplateBody</code> or <code>TemplateURL</code>.</p>
702    pub template_url: Option<String>,
703    /// <p>Whether to reuse the template that is associated with the stack to create the change set.</p>
704    pub use_previous_template: Option<bool>,
705}
706
707/// Serialize `CreateChangeSetInput` contents to a `SignedRequest`.
708struct CreateChangeSetInputSerializer;
709impl CreateChangeSetInputSerializer {
710    fn serialize(params: &mut Params, name: &str, obj: &CreateChangeSetInput) {
711        let mut prefix = name.to_string();
712        if prefix != "" {
713            prefix.push_str(".");
714        }
715
716        if let Some(ref field_value) = obj.capabilities {
717            CapabilitiesSerializer::serialize(
718                params,
719                &format!("{}{}", prefix, "Capabilities"),
720                field_value,
721            );
722        }
723        params.put(
724            &format!("{}{}", prefix, "ChangeSetName"),
725            &obj.change_set_name,
726        );
727        if let Some(ref field_value) = obj.change_set_type {
728            params.put(&format!("{}{}", prefix, "ChangeSetType"), &field_value);
729        }
730        if let Some(ref field_value) = obj.client_token {
731            params.put(&format!("{}{}", prefix, "ClientToken"), &field_value);
732        }
733        if let Some(ref field_value) = obj.description {
734            params.put(&format!("{}{}", prefix, "Description"), &field_value);
735        }
736        if let Some(ref field_value) = obj.notification_ar_ns {
737            NotificationARNsSerializer::serialize(
738                params,
739                &format!("{}{}", prefix, "NotificationARNs"),
740                field_value,
741            );
742        }
743        if let Some(ref field_value) = obj.parameters {
744            ParametersSerializer::serialize(
745                params,
746                &format!("{}{}", prefix, "Parameters"),
747                field_value,
748            );
749        }
750        if let Some(ref field_value) = obj.resource_types {
751            ResourceTypesSerializer::serialize(
752                params,
753                &format!("{}{}", prefix, "ResourceTypes"),
754                field_value,
755            );
756        }
757        if let Some(ref field_value) = obj.resources_to_import {
758            ResourcesToImportSerializer::serialize(
759                params,
760                &format!("{}{}", prefix, "ResourcesToImport"),
761                field_value,
762            );
763        }
764        if let Some(ref field_value) = obj.role_arn {
765            params.put(&format!("{}{}", prefix, "RoleARN"), &field_value);
766        }
767        if let Some(ref field_value) = obj.rollback_configuration {
768            RollbackConfigurationSerializer::serialize(
769                params,
770                &format!("{}{}", prefix, "RollbackConfiguration"),
771                field_value,
772            );
773        }
774        params.put(&format!("{}{}", prefix, "StackName"), &obj.stack_name);
775        if let Some(ref field_value) = obj.tags {
776            TagsSerializer::serialize(params, &format!("{}{}", prefix, "Tags"), field_value);
777        }
778        if let Some(ref field_value) = obj.template_body {
779            params.put(&format!("{}{}", prefix, "TemplateBody"), &field_value);
780        }
781        if let Some(ref field_value) = obj.template_url {
782            params.put(&format!("{}{}", prefix, "TemplateURL"), &field_value);
783        }
784        if let Some(ref field_value) = obj.use_previous_template {
785            params.put(
786                &format!("{}{}", prefix, "UsePreviousTemplate"),
787                &field_value,
788            );
789        }
790    }
791}
792
793/// <p>The output for the <a>CreateChangeSet</a> action.</p>
794#[derive(Clone, Debug, Default, PartialEq)]
795#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
796pub struct CreateChangeSetOutput {
797    /// <p>The Amazon Resource Name (ARN) of the change set.</p>
798    pub id: Option<String>,
799    /// <p>The unique ID of the stack.</p>
800    pub stack_id: Option<String>,
801}
802
803#[allow(dead_code)]
804struct CreateChangeSetOutputDeserializer;
805impl CreateChangeSetOutputDeserializer {
806    #[allow(dead_code, unused_variables)]
807    fn deserialize<T: Peek + Next>(
808        tag_name: &str,
809        stack: &mut T,
810    ) -> Result<CreateChangeSetOutput, XmlParseError> {
811        deserialize_elements::<_, CreateChangeSetOutput, _>(tag_name, stack, |name, stack, obj| {
812            match name {
813                "Id" => {
814                    obj.id = Some(ChangeSetIdDeserializer::deserialize("Id", stack)?);
815                }
816                "StackId" => {
817                    obj.stack_id = Some(StackIdDeserializer::deserialize("StackId", stack)?);
818                }
819                _ => skip_tree(stack),
820            }
821            Ok(())
822        })
823    }
824}
825/// <p>The input for <a>CreateStack</a> action.</p>
826#[derive(Clone, Debug, Default, PartialEq)]
827#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
828pub struct CreateStackInput {
829    /// <p><p>In some cases, you must explicitly acknowledge that your stack template contains certain capabilities in order for AWS CloudFormation to create the stack.</p> <ul> <li> <p> <code>CAPABILITY<em>IAM</code> and <code>CAPABILITY</em>NAMED<em>IAM</code> </p> <p>Some stack templates might include resources that can affect permissions in your AWS account; for example, by creating new AWS Identity and Access Management (IAM) users. For those stacks, you must explicitly acknowledge this by specifying one of these capabilities.</p> <p>The following IAM resources require you to specify either the <code>CAPABILITY</em>IAM</code> or <code>CAPABILITY<em>NAMED</em>IAM</code> capability.</p> <ul> <li> <p>If you have IAM resources, you can specify either capability. </p> </li> <li> <p>If you have IAM resources with custom names, you <i>must</i> specify <code>CAPABILITY<em>NAMED</em>IAM</code>. </p> </li> <li> <p>If you don&#39;t specify either of these capabilities, AWS CloudFormation returns an <code>InsufficientCapabilities</code> error.</p> </li> </ul> <p>If your stack template contains these resources, we recommend that you review all permissions associated with them and edit their permissions if necessary.</p> <ul> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-accesskey.html"> AWS::IAM::AccessKey</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-group.html"> AWS::IAM::Group</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-instanceprofile.html"> AWS::IAM::InstanceProfile</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html"> AWS::IAM::Policy</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html"> AWS::IAM::Role</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user.html"> AWS::IAM::User</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-addusertogroup.html"> AWS::IAM::UserToGroupAddition</a> </p> </li> </ul> <p>For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html#capabilities">Acknowledging IAM Resources in AWS CloudFormation Templates</a>.</p> </li> <li> <p> <code>CAPABILITY<em>AUTO</em>EXPAND</code> </p> <p>Some template contain macros. Macros perform custom processing on templates; this can include simple actions like find-and-replace operations, all the way to extensive transformations of entire templates. Because of this, users typically create a change set from the processed template, so that they can review the changes resulting from the macros before actually creating the stack. If your stack template contains one or more macros, and you choose to create a stack directly from the processed template, without first reviewing the resulting changes in a change set, you must acknowledge this capability. This includes the <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/create-reusable-transform-function-snippets-and-add-to-your-template-with-aws-include-transform.html">AWS::Include</a> and <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/transform-aws-serverless.html">AWS::Serverless</a> transforms, which are macros hosted by AWS CloudFormation.</p> <p>Change sets do not currently support nested stacks. If you want to create a stack from a stack template that contains macros <i>and</i> nested stacks, you must create the stack directly from the template using this capability.</p> <important> <p>You should only create stacks directly from a stack template that contains macros if you know what processing the macro performs.</p> <p>Each macro relies on an underlying Lambda service function for processing stack templates. Be aware that the Lambda function owner can update the function operation without AWS CloudFormation being notified.</p> </important> <p>For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-macros.html">Using AWS CloudFormation Macros to Perform Custom Processing on Templates</a>.</p> </li> </ul></p>
830    pub capabilities: Option<Vec<String>>,
831    /// <p>A unique identifier for this <code>CreateStack</code> request. Specify this token if you plan to retry requests so that AWS CloudFormation knows that you're not attempting to create a stack with the same name. You might retry <code>CreateStack</code> requests to ensure that AWS CloudFormation successfully received them.</p> <p>All events triggered by a given stack operation are assigned the same client request token, which you can use to track operations. For example, if you execute a <code>CreateStack</code> operation with the token <code>token1</code>, then all the <code>StackEvents</code> generated by that operation will have <code>ClientRequestToken</code> set as <code>token1</code>.</p> <p>In the console, stack operations display the client request token on the Events tab. Stack operations that are initiated from the console use the token format <i>Console-StackOperation-ID</i>, which helps you easily identify the stack operation . For example, if you create a stack using the console, each stack event would be assigned the same token in the following format: <code>Console-CreateStack-7f59c3cf-00d2-40c7-b2ff-e75db0987002</code>. </p>
832    pub client_request_token: Option<String>,
833    /// <p>Set to <code>true</code> to disable rollback of the stack if stack creation failed. You can specify either <code>DisableRollback</code> or <code>OnFailure</code>, but not both.</p> <p>Default: <code>false</code> </p>
834    pub disable_rollback: Option<bool>,
835    /// <p>Whether to enable termination protection on the specified stack. If a user attempts to delete a stack with termination protection enabled, the operation fails and the stack remains unchanged. For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-protect-stacks.html">Protecting a Stack From Being Deleted</a> in the <i>AWS CloudFormation User Guide</i>. Termination protection is disabled on stacks by default. </p> <p> For <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-nested-stacks.html">nested stacks</a>, termination protection is set on the root stack and cannot be changed directly on the nested stack.</p>
836    pub enable_termination_protection: Option<bool>,
837    /// <p>The Simple Notification Service (SNS) topic ARNs to publish stack related events. You can find your SNS topic ARNs using the SNS console or your Command Line Interface (CLI).</p>
838    pub notification_ar_ns: Option<Vec<String>>,
839    /// <p>Determines what action will be taken if stack creation fails. This must be one of: DO_NOTHING, ROLLBACK, or DELETE. You can specify either <code>OnFailure</code> or <code>DisableRollback</code>, but not both.</p> <p>Default: <code>ROLLBACK</code> </p>
840    pub on_failure: Option<String>,
841    /// <p>A list of <code>Parameter</code> structures that specify input parameters for the stack. For more information, see the <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_Parameter.html">Parameter</a> data type.</p>
842    pub parameters: Option<Vec<Parameter>>,
843    /// <p>The template resource types that you have permissions to work with for this create stack action, such as <code>AWS::EC2::Instance</code>, <code>AWS::EC2::*</code>, or <code>Custom::MyCustomInstance</code>. Use the following syntax to describe template resource types: <code>AWS::*</code> (for all AWS resource), <code>Custom::*</code> (for all custom resources), <code>Custom::<i>logical_ID</i> </code> (for a specific custom resource), <code>AWS::<i>service_name</i>::*</code> (for all resources of a particular AWS service), and <code>AWS::<i>service_name</i>::<i>resource_logical_ID</i> </code> (for a specific AWS resource).</p> <p>If the list of resource types doesn't include a resource that you're creating, the stack creation fails. By default, AWS CloudFormation grants permissions to all resource types. AWS Identity and Access Management (IAM) uses this parameter for AWS CloudFormation-specific condition keys in IAM policies. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html">Controlling Access with AWS Identity and Access Management</a>.</p>
844    pub resource_types: Option<Vec<String>>,
845    /// <p>The Amazon Resource Name (ARN) of an AWS Identity and Access Management (IAM) role that AWS CloudFormation assumes to create the stack. AWS CloudFormation uses the role's credentials to make calls on your behalf. AWS CloudFormation always uses this role for all future operations on the stack. As long as users have permission to operate on the stack, AWS CloudFormation uses this role even if the users don't have permission to pass it. Ensure that the role grants least privilege.</p> <p>If you don't specify a value, AWS CloudFormation uses the role that was previously associated with the stack. If no role is available, AWS CloudFormation uses a temporary session that is generated from your user credentials.</p>
846    pub role_arn: Option<String>,
847    /// <p>The rollback triggers for AWS CloudFormation to monitor during stack creation and updating operations, and for the specified monitoring period afterwards.</p>
848    pub rollback_configuration: Option<RollbackConfiguration>,
849    /// <p><p>The name that is associated with the stack. The name must be unique in the Region in which you are creating the stack.</p> <note> <p>A stack name can contain only alphanumeric characters (case sensitive) and hyphens. It must start with an alphabetic character and cannot be longer than 128 characters.</p> </note></p>
850    pub stack_name: String,
851    /// <p>Structure containing the stack policy body. For more information, go to <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html"> Prevent Updates to Stack Resources</a> in the <i>AWS CloudFormation User Guide</i>. You can specify either the <code>StackPolicyBody</code> or the <code>StackPolicyURL</code> parameter, but not both.</p>
852    pub stack_policy_body: Option<String>,
853    /// <p>Location of a file containing the stack policy. The URL must point to a policy (maximum size: 16 KB) located in an S3 bucket in the same Region as the stack. You can specify either the <code>StackPolicyBody</code> or the <code>StackPolicyURL</code> parameter, but not both.</p>
854    pub stack_policy_url: Option<String>,
855    /// <p>Key-value pairs to associate with this stack. AWS CloudFormation also propagates these tags to the resources created in the stack. A maximum number of 50 tags can be specified.</p>
856    pub tags: Option<Vec<Tag>>,
857    /// <p>Structure containing the template body with a minimum length of 1 byte and a maximum length of 51,200 bytes. For more information, go to <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html">Template Anatomy</a> in the AWS CloudFormation User Guide.</p> <p>Conditional: You must specify either the <code>TemplateBody</code> or the <code>TemplateURL</code> parameter, but not both.</p>
858    pub template_body: Option<String>,
859    /// <p>Location of file containing the template body. The URL must point to a template (max size: 460,800 bytes) that is located in an Amazon S3 bucket. For more information, go to the <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html">Template Anatomy</a> in the AWS CloudFormation User Guide.</p> <p>Conditional: You must specify either the <code>TemplateBody</code> or the <code>TemplateURL</code> parameter, but not both.</p>
860    pub template_url: Option<String>,
861    /// <p>The amount of time that can pass before the stack status becomes CREATE_FAILED; if <code>DisableRollback</code> is not set or is set to <code>false</code>, the stack will be rolled back.</p>
862    pub timeout_in_minutes: Option<i64>,
863}
864
865/// Serialize `CreateStackInput` contents to a `SignedRequest`.
866struct CreateStackInputSerializer;
867impl CreateStackInputSerializer {
868    fn serialize(params: &mut Params, name: &str, obj: &CreateStackInput) {
869        let mut prefix = name.to_string();
870        if prefix != "" {
871            prefix.push_str(".");
872        }
873
874        if let Some(ref field_value) = obj.capabilities {
875            CapabilitiesSerializer::serialize(
876                params,
877                &format!("{}{}", prefix, "Capabilities"),
878                field_value,
879            );
880        }
881        if let Some(ref field_value) = obj.client_request_token {
882            params.put(&format!("{}{}", prefix, "ClientRequestToken"), &field_value);
883        }
884        if let Some(ref field_value) = obj.disable_rollback {
885            params.put(&format!("{}{}", prefix, "DisableRollback"), &field_value);
886        }
887        if let Some(ref field_value) = obj.enable_termination_protection {
888            params.put(
889                &format!("{}{}", prefix, "EnableTerminationProtection"),
890                &field_value,
891            );
892        }
893        if let Some(ref field_value) = obj.notification_ar_ns {
894            NotificationARNsSerializer::serialize(
895                params,
896                &format!("{}{}", prefix, "NotificationARNs"),
897                field_value,
898            );
899        }
900        if let Some(ref field_value) = obj.on_failure {
901            params.put(&format!("{}{}", prefix, "OnFailure"), &field_value);
902        }
903        if let Some(ref field_value) = obj.parameters {
904            ParametersSerializer::serialize(
905                params,
906                &format!("{}{}", prefix, "Parameters"),
907                field_value,
908            );
909        }
910        if let Some(ref field_value) = obj.resource_types {
911            ResourceTypesSerializer::serialize(
912                params,
913                &format!("{}{}", prefix, "ResourceTypes"),
914                field_value,
915            );
916        }
917        if let Some(ref field_value) = obj.role_arn {
918            params.put(&format!("{}{}", prefix, "RoleARN"), &field_value);
919        }
920        if let Some(ref field_value) = obj.rollback_configuration {
921            RollbackConfigurationSerializer::serialize(
922                params,
923                &format!("{}{}", prefix, "RollbackConfiguration"),
924                field_value,
925            );
926        }
927        params.put(&format!("{}{}", prefix, "StackName"), &obj.stack_name);
928        if let Some(ref field_value) = obj.stack_policy_body {
929            params.put(&format!("{}{}", prefix, "StackPolicyBody"), &field_value);
930        }
931        if let Some(ref field_value) = obj.stack_policy_url {
932            params.put(&format!("{}{}", prefix, "StackPolicyURL"), &field_value);
933        }
934        if let Some(ref field_value) = obj.tags {
935            TagsSerializer::serialize(params, &format!("{}{}", prefix, "Tags"), field_value);
936        }
937        if let Some(ref field_value) = obj.template_body {
938            params.put(&format!("{}{}", prefix, "TemplateBody"), &field_value);
939        }
940        if let Some(ref field_value) = obj.template_url {
941            params.put(&format!("{}{}", prefix, "TemplateURL"), &field_value);
942        }
943        if let Some(ref field_value) = obj.timeout_in_minutes {
944            params.put(&format!("{}{}", prefix, "TimeoutInMinutes"), &field_value);
945        }
946    }
947}
948
949#[derive(Clone, Debug, Default, PartialEq)]
950#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
951pub struct CreateStackInstancesInput {
952    /// <p>[<code>Self-managed</code> permissions] The names of one or more AWS accounts that you want to create stack instances in the specified Region(s) for.</p> <p>You can specify <code>Accounts</code> or <code>DeploymentTargets</code>, but not both.</p>
953    pub accounts: Option<Vec<String>>,
954    /// <p>[<code>Service-managed</code> permissions] The AWS Organizations accounts for which to create stack instances in the specified Regions.</p> <p>You can specify <code>Accounts</code> or <code>DeploymentTargets</code>, but not both.</p>
955    pub deployment_targets: Option<DeploymentTargets>,
956    /// <p>The unique identifier for this stack set operation. </p> <p>The operation ID also functions as an idempotency token, to ensure that AWS CloudFormation performs the stack set operation only once, even if you retry the request multiple times. You might retry stack set operation requests to ensure that AWS CloudFormation successfully received them.</p> <p>If you don't specify an operation ID, the SDK generates one automatically. </p> <p>Repeating this stack set operation with a new operation ID retries all stack instances whose status is <code>OUTDATED</code>. </p>
957    pub operation_id: Option<String>,
958    /// <p>Preferences for how AWS CloudFormation performs this stack set operation.</p>
959    pub operation_preferences: Option<StackSetOperationPreferences>,
960    /// <p>A list of stack set parameters whose values you want to override in the selected stack instances.</p> <p>Any overridden parameter values will be applied to all stack instances in the specified accounts and Regions. When specifying parameters and their values, be aware of how AWS CloudFormation sets parameter values during stack instance operations:</p> <ul> <li> <p>To override the current value for a parameter, include the parameter and specify its value.</p> </li> <li> <p>To leave a parameter set to its present value, you can do one of the following:</p> <ul> <li> <p>Do not include the parameter in the list.</p> </li> <li> <p>Include the parameter and specify <code>UsePreviousValue</code> as <code>true</code>. (You cannot specify both a value and set <code>UsePreviousValue</code> to <code>true</code>.)</p> </li> </ul> </li> <li> <p>To set all overridden parameter back to the values specified in the stack set, specify a parameter list but do not include any parameters.</p> </li> <li> <p>To leave all parameters set to their present values, do not specify this property at all.</p> </li> </ul> <p>During stack set updates, any parameter values overridden for a stack instance are not updated, but retain their overridden value.</p> <p>You can only override the parameter <i>values</i> that are specified in the stack set; to add or delete a parameter itself, use <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStackSet.html">UpdateStackSet</a> to update the stack set template.</p>
961    pub parameter_overrides: Option<Vec<Parameter>>,
962    /// <p>The names of one or more Regions where you want to create stack instances using the specified AWS account(s). </p>
963    pub regions: Vec<String>,
964    /// <p>The name or unique ID of the stack set that you want to create stack instances from.</p>
965    pub stack_set_name: String,
966}
967
968/// Serialize `CreateStackInstancesInput` contents to a `SignedRequest`.
969struct CreateStackInstancesInputSerializer;
970impl CreateStackInstancesInputSerializer {
971    fn serialize(params: &mut Params, name: &str, obj: &CreateStackInstancesInput) {
972        let mut prefix = name.to_string();
973        if prefix != "" {
974            prefix.push_str(".");
975        }
976
977        if let Some(ref field_value) = obj.accounts {
978            AccountListSerializer::serialize(
979                params,
980                &format!("{}{}", prefix, "Accounts"),
981                field_value,
982            );
983        }
984        if let Some(ref field_value) = obj.deployment_targets {
985            DeploymentTargetsSerializer::serialize(
986                params,
987                &format!("{}{}", prefix, "DeploymentTargets"),
988                field_value,
989            );
990        }
991        if let Some(ref field_value) = obj.operation_id {
992            params.put(&format!("{}{}", prefix, "OperationId"), &field_value);
993        }
994        if let Some(ref field_value) = obj.operation_preferences {
995            StackSetOperationPreferencesSerializer::serialize(
996                params,
997                &format!("{}{}", prefix, "OperationPreferences"),
998                field_value,
999            );
1000        }
1001        if let Some(ref field_value) = obj.parameter_overrides {
1002            ParametersSerializer::serialize(
1003                params,
1004                &format!("{}{}", prefix, "ParameterOverrides"),
1005                field_value,
1006            );
1007        }
1008        RegionListSerializer::serialize(params, &format!("{}{}", prefix, "Regions"), &obj.regions);
1009        params.put(
1010            &format!("{}{}", prefix, "StackSetName"),
1011            &obj.stack_set_name,
1012        );
1013    }
1014}
1015
1016#[derive(Clone, Debug, Default, PartialEq)]
1017#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
1018pub struct CreateStackInstancesOutput {
1019    /// <p>The unique identifier for this stack set operation.</p>
1020    pub operation_id: Option<String>,
1021}
1022
1023#[allow(dead_code)]
1024struct CreateStackInstancesOutputDeserializer;
1025impl CreateStackInstancesOutputDeserializer {
1026    #[allow(dead_code, unused_variables)]
1027    fn deserialize<T: Peek + Next>(
1028        tag_name: &str,
1029        stack: &mut T,
1030    ) -> Result<CreateStackInstancesOutput, XmlParseError> {
1031        deserialize_elements::<_, CreateStackInstancesOutput, _>(
1032            tag_name,
1033            stack,
1034            |name, stack, obj| {
1035                match name {
1036                    "OperationId" => {
1037                        obj.operation_id = Some(ClientRequestTokenDeserializer::deserialize(
1038                            "OperationId",
1039                            stack,
1040                        )?);
1041                    }
1042                    _ => skip_tree(stack),
1043                }
1044                Ok(())
1045            },
1046        )
1047    }
1048}
1049/// <p>The output for a <a>CreateStack</a> action.</p>
1050#[derive(Clone, Debug, Default, PartialEq)]
1051#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
1052pub struct CreateStackOutput {
1053    /// <p>Unique identifier of the stack.</p>
1054    pub stack_id: Option<String>,
1055}
1056
1057#[allow(dead_code)]
1058struct CreateStackOutputDeserializer;
1059impl CreateStackOutputDeserializer {
1060    #[allow(dead_code, unused_variables)]
1061    fn deserialize<T: Peek + Next>(
1062        tag_name: &str,
1063        stack: &mut T,
1064    ) -> Result<CreateStackOutput, XmlParseError> {
1065        deserialize_elements::<_, CreateStackOutput, _>(tag_name, stack, |name, stack, obj| {
1066            match name {
1067                "StackId" => {
1068                    obj.stack_id = Some(StackIdDeserializer::deserialize("StackId", stack)?);
1069                }
1070                _ => skip_tree(stack),
1071            }
1072            Ok(())
1073        })
1074    }
1075}
1076#[derive(Clone, Debug, Default, PartialEq)]
1077#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
1078pub struct CreateStackSetInput {
1079    /// <p>The Amazon Resource Number (ARN) of the IAM role to use to create this stack set. </p> <p>Specify an IAM role only if you are using customized administrator roles to control which users or groups can manage specific stack sets within the same administrator account. For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-prereqs.html">Prerequisites: Granting Permissions for Stack Set Operations</a> in the <i>AWS CloudFormation User Guide</i>.</p>
1080    pub administration_role_arn: Option<String>,
1081    /// <p>Describes whether StackSets automatically deploys to AWS Organizations accounts that are added to the target organization or organizational unit (OU). Specify only if <code>PermissionModel</code> is <code>SERVICE_MANAGED</code>.</p>
1082    pub auto_deployment: Option<AutoDeployment>,
1083    /// <p><p>In some cases, you must explicitly acknowledge that your stack set template contains certain capabilities in order for AWS CloudFormation to create the stack set and related stack instances.</p> <ul> <li> <p> <code>CAPABILITY<em>IAM</code> and <code>CAPABILITY</em>NAMED<em>IAM</code> </p> <p>Some stack templates might include resources that can affect permissions in your AWS account; for example, by creating new AWS Identity and Access Management (IAM) users. For those stack sets, you must explicitly acknowledge this by specifying one of these capabilities.</p> <p>The following IAM resources require you to specify either the <code>CAPABILITY</em>IAM</code> or <code>CAPABILITY<em>NAMED</em>IAM</code> capability.</p> <ul> <li> <p>If you have IAM resources, you can specify either capability. </p> </li> <li> <p>If you have IAM resources with custom names, you <i>must</i> specify <code>CAPABILITY<em>NAMED</em>IAM</code>. </p> </li> <li> <p>If you don&#39;t specify either of these capabilities, AWS CloudFormation returns an <code>InsufficientCapabilities</code> error.</p> </li> </ul> <p>If your stack template contains these resources, we recommend that you review all permissions associated with them and edit their permissions if necessary.</p> <ul> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-accesskey.html"> AWS::IAM::AccessKey</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-group.html"> AWS::IAM::Group</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-instanceprofile.html"> AWS::IAM::InstanceProfile</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html"> AWS::IAM::Policy</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html"> AWS::IAM::Role</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user.html"> AWS::IAM::User</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-addusertogroup.html"> AWS::IAM::UserToGroupAddition</a> </p> </li> </ul> <p>For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html#capabilities">Acknowledging IAM Resources in AWS CloudFormation Templates</a>.</p> </li> <li> <p> <code>CAPABILITY<em>AUTO</em>EXPAND</code> </p> <p>Some templates contain macros. If your stack template contains one or more macros, and you choose to create a stack directly from the processed template, without first reviewing the resulting changes in a change set, you must acknowledge this capability. For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-macros.html">Using AWS CloudFormation Macros to Perform Custom Processing on Templates</a>.</p> <note> <p>Stack sets do not currently support macros in stack templates. (This includes the <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/create-reusable-transform-function-snippets-and-add-to-your-template-with-aws-include-transform.html">AWS::Include</a> and <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/transform-aws-serverless.html">AWS::Serverless</a> transforms, which are macros hosted by AWS CloudFormation.) Even if you specify this capability, if you include a macro in your template the stack set operation will fail.</p> </note> </li> </ul></p>
1084    pub capabilities: Option<Vec<String>>,
1085    /// <p>A unique identifier for this <code>CreateStackSet</code> request. Specify this token if you plan to retry requests so that AWS CloudFormation knows that you're not attempting to create another stack set with the same name. You might retry <code>CreateStackSet</code> requests to ensure that AWS CloudFormation successfully received them.</p> <p>If you don't specify an operation ID, the SDK generates one automatically. </p>
1086    pub client_request_token: Option<String>,
1087    /// <p>A description of the stack set. You can use the description to identify the stack set's purpose or other important information.</p>
1088    pub description: Option<String>,
1089    /// <p>The name of the IAM execution role to use to create the stack set. If you do not specify an execution role, AWS CloudFormation uses the <code>AWSCloudFormationStackSetExecutionRole</code> role for the stack set operation.</p> <p>Specify an IAM role only if you are using customized execution roles to control which stack resources users and groups can include in their stack sets. </p>
1090    pub execution_role_name: Option<String>,
1091    /// <p>The input parameters for the stack set template. </p>
1092    pub parameters: Option<Vec<Parameter>>,
1093    /// <p><p>Describes how the IAM roles required for stack set operations are created. By default, <code>SELF-MANAGED</code> is specified.</p> <ul> <li> <p>With <code>self-managed</code> permissions, you must create the administrator and execution roles required to deploy to target accounts. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-prereqs-self-managed.html">Grant Self-Managed Stack Set Permissions</a>.</p> </li> <li> <p>With <code>service-managed</code> permissions, StackSets automatically creates the IAM roles required to deploy to accounts managed by AWS Organizations. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-prereqs-service-managed.html">Grant Service-Managed Stack Set Permissions</a>.</p> </li> </ul></p>
1094    pub permission_model: Option<String>,
1095    /// <p><p>The name to associate with the stack set. The name must be unique in the Region where you create your stack set.</p> <note> <p>A stack name can contain only alphanumeric characters (case-sensitive) and hyphens. It must start with an alphabetic character and can&#39;t be longer than 128 characters.</p> </note></p>
1096    pub stack_set_name: String,
1097    /// <p>The key-value pairs to associate with this stack set and the stacks created from it. AWS CloudFormation also propagates these tags to supported resources that are created in the stacks. A maximum number of 50 tags can be specified.</p> <p>If you specify tags as part of a <code>CreateStackSet</code> action, AWS CloudFormation checks to see if you have the required IAM permission to tag resources. If you don't, the entire <code>CreateStackSet</code> action fails with an <code>access denied</code> error, and the stack set is not created.</p>
1098    pub tags: Option<Vec<Tag>>,
1099    /// <p>The structure that contains the template body, with a minimum length of 1 byte and a maximum length of 51,200 bytes. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html">Template Anatomy</a> in the AWS CloudFormation User Guide.</p> <p>Conditional: You must specify either the TemplateBody or the TemplateURL parameter, but not both.</p>
1100    pub template_body: Option<String>,
1101    /// <p>The location of the file that contains the template body. The URL must point to a template (maximum size: 460,800 bytes) that's located in an Amazon S3 bucket. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html">Template Anatomy</a> in the AWS CloudFormation User Guide.</p> <p>Conditional: You must specify either the TemplateBody or the TemplateURL parameter, but not both.</p>
1102    pub template_url: Option<String>,
1103}
1104
1105/// Serialize `CreateStackSetInput` contents to a `SignedRequest`.
1106struct CreateStackSetInputSerializer;
1107impl CreateStackSetInputSerializer {
1108    fn serialize(params: &mut Params, name: &str, obj: &CreateStackSetInput) {
1109        let mut prefix = name.to_string();
1110        if prefix != "" {
1111            prefix.push_str(".");
1112        }
1113
1114        if let Some(ref field_value) = obj.administration_role_arn {
1115            params.put(
1116                &format!("{}{}", prefix, "AdministrationRoleARN"),
1117                &field_value,
1118            );
1119        }
1120        if let Some(ref field_value) = obj.auto_deployment {
1121            AutoDeploymentSerializer::serialize(
1122                params,
1123                &format!("{}{}", prefix, "AutoDeployment"),
1124                field_value,
1125            );
1126        }
1127        if let Some(ref field_value) = obj.capabilities {
1128            CapabilitiesSerializer::serialize(
1129                params,
1130                &format!("{}{}", prefix, "Capabilities"),
1131                field_value,
1132            );
1133        }
1134        if let Some(ref field_value) = obj.client_request_token {
1135            params.put(&format!("{}{}", prefix, "ClientRequestToken"), &field_value);
1136        }
1137        if let Some(ref field_value) = obj.description {
1138            params.put(&format!("{}{}", prefix, "Description"), &field_value);
1139        }
1140        if let Some(ref field_value) = obj.execution_role_name {
1141            params.put(&format!("{}{}", prefix, "ExecutionRoleName"), &field_value);
1142        }
1143        if let Some(ref field_value) = obj.parameters {
1144            ParametersSerializer::serialize(
1145                params,
1146                &format!("{}{}", prefix, "Parameters"),
1147                field_value,
1148            );
1149        }
1150        if let Some(ref field_value) = obj.permission_model {
1151            params.put(&format!("{}{}", prefix, "PermissionModel"), &field_value);
1152        }
1153        params.put(
1154            &format!("{}{}", prefix, "StackSetName"),
1155            &obj.stack_set_name,
1156        );
1157        if let Some(ref field_value) = obj.tags {
1158            TagsSerializer::serialize(params, &format!("{}{}", prefix, "Tags"), field_value);
1159        }
1160        if let Some(ref field_value) = obj.template_body {
1161            params.put(&format!("{}{}", prefix, "TemplateBody"), &field_value);
1162        }
1163        if let Some(ref field_value) = obj.template_url {
1164            params.put(&format!("{}{}", prefix, "TemplateURL"), &field_value);
1165        }
1166    }
1167}
1168
1169#[derive(Clone, Debug, Default, PartialEq)]
1170#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
1171pub struct CreateStackSetOutput {
1172    /// <p>The ID of the stack set that you're creating.</p>
1173    pub stack_set_id: Option<String>,
1174}
1175
1176#[allow(dead_code)]
1177struct CreateStackSetOutputDeserializer;
1178impl CreateStackSetOutputDeserializer {
1179    #[allow(dead_code, unused_variables)]
1180    fn deserialize<T: Peek + Next>(
1181        tag_name: &str,
1182        stack: &mut T,
1183    ) -> Result<CreateStackSetOutput, XmlParseError> {
1184        deserialize_elements::<_, CreateStackSetOutput, _>(tag_name, stack, |name, stack, obj| {
1185            match name {
1186                "StackSetId" => {
1187                    obj.stack_set_id =
1188                        Some(StackSetIdDeserializer::deserialize("StackSetId", stack)?);
1189                }
1190                _ => skip_tree(stack),
1191            }
1192            Ok(())
1193        })
1194    }
1195}
1196#[allow(dead_code)]
1197struct CreationTimeDeserializer;
1198impl CreationTimeDeserializer {
1199    #[allow(dead_code, unused_variables)]
1200    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
1201        xml_util::deserialize_primitive(tag_name, stack, Ok)
1202    }
1203}
1204/// <p>The input for the <a>DeleteChangeSet</a> action.</p>
1205#[derive(Clone, Debug, Default, PartialEq)]
1206#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
1207pub struct DeleteChangeSetInput {
1208    /// <p>The name or Amazon Resource Name (ARN) of the change set that you want to delete.</p>
1209    pub change_set_name: String,
1210    /// <p>If you specified the name of a change set to delete, specify the stack name or ID (ARN) that is associated with it.</p>
1211    pub stack_name: Option<String>,
1212}
1213
1214/// Serialize `DeleteChangeSetInput` contents to a `SignedRequest`.
1215struct DeleteChangeSetInputSerializer;
1216impl DeleteChangeSetInputSerializer {
1217    fn serialize(params: &mut Params, name: &str, obj: &DeleteChangeSetInput) {
1218        let mut prefix = name.to_string();
1219        if prefix != "" {
1220            prefix.push_str(".");
1221        }
1222
1223        params.put(
1224            &format!("{}{}", prefix, "ChangeSetName"),
1225            &obj.change_set_name,
1226        );
1227        if let Some(ref field_value) = obj.stack_name {
1228            params.put(&format!("{}{}", prefix, "StackName"), &field_value);
1229        }
1230    }
1231}
1232
1233/// <p>The output for the <a>DeleteChangeSet</a> action.</p>
1234#[derive(Clone, Debug, Default, PartialEq)]
1235#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
1236pub struct DeleteChangeSetOutput {}
1237
1238#[allow(dead_code)]
1239struct DeleteChangeSetOutputDeserializer;
1240impl DeleteChangeSetOutputDeserializer {
1241    #[allow(dead_code, unused_variables)]
1242    fn deserialize<T: Peek + Next>(
1243        tag_name: &str,
1244        stack: &mut T,
1245    ) -> Result<DeleteChangeSetOutput, XmlParseError> {
1246        xml_util::start_element(tag_name, stack)?;
1247
1248        let obj = DeleteChangeSetOutput::default();
1249
1250        xml_util::end_element(tag_name, stack)?;
1251
1252        Ok(obj)
1253    }
1254}
1255/// <p>The input for <a>DeleteStack</a> action.</p>
1256#[derive(Clone, Debug, Default, PartialEq)]
1257#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
1258pub struct DeleteStackInput {
1259    /// <p>A unique identifier for this <code>DeleteStack</code> request. Specify this token if you plan to retry requests so that AWS CloudFormation knows that you're not attempting to delete a stack with the same name. You might retry <code>DeleteStack</code> requests to ensure that AWS CloudFormation successfully received them.</p> <p>All events triggered by a given stack operation are assigned the same client request token, which you can use to track operations. For example, if you execute a <code>CreateStack</code> operation with the token <code>token1</code>, then all the <code>StackEvents</code> generated by that operation will have <code>ClientRequestToken</code> set as <code>token1</code>.</p> <p>In the console, stack operations display the client request token on the Events tab. Stack operations that are initiated from the console use the token format <i>Console-StackOperation-ID</i>, which helps you easily identify the stack operation . For example, if you create a stack using the console, each stack event would be assigned the same token in the following format: <code>Console-CreateStack-7f59c3cf-00d2-40c7-b2ff-e75db0987002</code>. </p>
1260    pub client_request_token: Option<String>,
1261    /// <p>For stacks in the <code>DELETE_FAILED</code> state, a list of resource logical IDs that are associated with the resources you want to retain. During deletion, AWS CloudFormation deletes the stack but does not delete the retained resources.</p> <p>Retaining resources is useful when you cannot delete a resource, such as a non-empty S3 bucket, but you want to delete the stack.</p>
1262    pub retain_resources: Option<Vec<String>>,
1263    /// <p>The Amazon Resource Name (ARN) of an AWS Identity and Access Management (IAM) role that AWS CloudFormation assumes to delete the stack. AWS CloudFormation uses the role's credentials to make calls on your behalf.</p> <p>If you don't specify a value, AWS CloudFormation uses the role that was previously associated with the stack. If no role is available, AWS CloudFormation uses a temporary session that is generated from your user credentials.</p>
1264    pub role_arn: Option<String>,
1265    /// <p>The name or the unique stack ID that is associated with the stack.</p>
1266    pub stack_name: String,
1267}
1268
1269/// Serialize `DeleteStackInput` contents to a `SignedRequest`.
1270struct DeleteStackInputSerializer;
1271impl DeleteStackInputSerializer {
1272    fn serialize(params: &mut Params, name: &str, obj: &DeleteStackInput) {
1273        let mut prefix = name.to_string();
1274        if prefix != "" {
1275            prefix.push_str(".");
1276        }
1277
1278        if let Some(ref field_value) = obj.client_request_token {
1279            params.put(&format!("{}{}", prefix, "ClientRequestToken"), &field_value);
1280        }
1281        if let Some(ref field_value) = obj.retain_resources {
1282            RetainResourcesSerializer::serialize(
1283                params,
1284                &format!("{}{}", prefix, "RetainResources"),
1285                field_value,
1286            );
1287        }
1288        if let Some(ref field_value) = obj.role_arn {
1289            params.put(&format!("{}{}", prefix, "RoleARN"), &field_value);
1290        }
1291        params.put(&format!("{}{}", prefix, "StackName"), &obj.stack_name);
1292    }
1293}
1294
1295#[derive(Clone, Debug, Default, PartialEq)]
1296#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
1297pub struct DeleteStackInstancesInput {
1298    /// <p>[<code>Self-managed</code> permissions] The names of the AWS accounts that you want to delete stack instances for.</p> <p>You can specify <code>Accounts</code> or <code>DeploymentTargets</code>, but not both.</p>
1299    pub accounts: Option<Vec<String>>,
1300    /// <p>[<code>Service-managed</code> permissions] The AWS Organizations accounts from which to delete stack instances.</p> <p>You can specify <code>Accounts</code> or <code>DeploymentTargets</code>, but not both.</p>
1301    pub deployment_targets: Option<DeploymentTargets>,
1302    /// <p>The unique identifier for this stack set operation. </p> <p>If you don't specify an operation ID, the SDK generates one automatically. </p> <p>The operation ID also functions as an idempotency token, to ensure that AWS CloudFormation performs the stack set operation only once, even if you retry the request multiple times. You can retry stack set operation requests to ensure that AWS CloudFormation successfully received them.</p> <p>Repeating this stack set operation with a new operation ID retries all stack instances whose status is <code>OUTDATED</code>. </p>
1303    pub operation_id: Option<String>,
1304    /// <p>Preferences for how AWS CloudFormation performs this stack set operation.</p>
1305    pub operation_preferences: Option<StackSetOperationPreferences>,
1306    /// <p>The Regions where you want to delete stack set instances. </p>
1307    pub regions: Vec<String>,
1308    /// <p>Removes the stack instances from the specified stack set, but doesn't delete the stacks. You can't reassociate a retained stack or add an existing, saved stack to a new stack set.</p> <p>For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-concepts.html#stackset-ops-options">Stack set operation options</a>.</p>
1309    pub retain_stacks: bool,
1310    /// <p>The name or unique ID of the stack set that you want to delete stack instances for.</p>
1311    pub stack_set_name: String,
1312}
1313
1314/// Serialize `DeleteStackInstancesInput` contents to a `SignedRequest`.
1315struct DeleteStackInstancesInputSerializer;
1316impl DeleteStackInstancesInputSerializer {
1317    fn serialize(params: &mut Params, name: &str, obj: &DeleteStackInstancesInput) {
1318        let mut prefix = name.to_string();
1319        if prefix != "" {
1320            prefix.push_str(".");
1321        }
1322
1323        if let Some(ref field_value) = obj.accounts {
1324            AccountListSerializer::serialize(
1325                params,
1326                &format!("{}{}", prefix, "Accounts"),
1327                field_value,
1328            );
1329        }
1330        if let Some(ref field_value) = obj.deployment_targets {
1331            DeploymentTargetsSerializer::serialize(
1332                params,
1333                &format!("{}{}", prefix, "DeploymentTargets"),
1334                field_value,
1335            );
1336        }
1337        if let Some(ref field_value) = obj.operation_id {
1338            params.put(&format!("{}{}", prefix, "OperationId"), &field_value);
1339        }
1340        if let Some(ref field_value) = obj.operation_preferences {
1341            StackSetOperationPreferencesSerializer::serialize(
1342                params,
1343                &format!("{}{}", prefix, "OperationPreferences"),
1344                field_value,
1345            );
1346        }
1347        RegionListSerializer::serialize(params, &format!("{}{}", prefix, "Regions"), &obj.regions);
1348        params.put(&format!("{}{}", prefix, "RetainStacks"), &obj.retain_stacks);
1349        params.put(
1350            &format!("{}{}", prefix, "StackSetName"),
1351            &obj.stack_set_name,
1352        );
1353    }
1354}
1355
1356#[derive(Clone, Debug, Default, PartialEq)]
1357#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
1358pub struct DeleteStackInstancesOutput {
1359    /// <p>The unique identifier for this stack set operation.</p>
1360    pub operation_id: Option<String>,
1361}
1362
1363#[allow(dead_code)]
1364struct DeleteStackInstancesOutputDeserializer;
1365impl DeleteStackInstancesOutputDeserializer {
1366    #[allow(dead_code, unused_variables)]
1367    fn deserialize<T: Peek + Next>(
1368        tag_name: &str,
1369        stack: &mut T,
1370    ) -> Result<DeleteStackInstancesOutput, XmlParseError> {
1371        deserialize_elements::<_, DeleteStackInstancesOutput, _>(
1372            tag_name,
1373            stack,
1374            |name, stack, obj| {
1375                match name {
1376                    "OperationId" => {
1377                        obj.operation_id = Some(ClientRequestTokenDeserializer::deserialize(
1378                            "OperationId",
1379                            stack,
1380                        )?);
1381                    }
1382                    _ => skip_tree(stack),
1383                }
1384                Ok(())
1385            },
1386        )
1387    }
1388}
1389#[derive(Clone, Debug, Default, PartialEq)]
1390#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
1391pub struct DeleteStackSetInput {
1392    /// <p>The name or unique ID of the stack set that you're deleting. You can obtain this value by running <a>ListStackSets</a>.</p>
1393    pub stack_set_name: String,
1394}
1395
1396/// Serialize `DeleteStackSetInput` contents to a `SignedRequest`.
1397struct DeleteStackSetInputSerializer;
1398impl DeleteStackSetInputSerializer {
1399    fn serialize(params: &mut Params, name: &str, obj: &DeleteStackSetInput) {
1400        let mut prefix = name.to_string();
1401        if prefix != "" {
1402            prefix.push_str(".");
1403        }
1404
1405        params.put(
1406            &format!("{}{}", prefix, "StackSetName"),
1407            &obj.stack_set_name,
1408        );
1409    }
1410}
1411
1412#[derive(Clone, Debug, Default, PartialEq)]
1413#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
1414pub struct DeleteStackSetOutput {}
1415
1416#[allow(dead_code)]
1417struct DeleteStackSetOutputDeserializer;
1418impl DeleteStackSetOutputDeserializer {
1419    #[allow(dead_code, unused_variables)]
1420    fn deserialize<T: Peek + Next>(
1421        tag_name: &str,
1422        stack: &mut T,
1423    ) -> Result<DeleteStackSetOutput, XmlParseError> {
1424        xml_util::start_element(tag_name, stack)?;
1425
1426        let obj = DeleteStackSetOutput::default();
1427
1428        xml_util::end_element(tag_name, stack)?;
1429
1430        Ok(obj)
1431    }
1432}
1433#[allow(dead_code)]
1434struct DeletionTimeDeserializer;
1435impl DeletionTimeDeserializer {
1436    #[allow(dead_code, unused_variables)]
1437    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
1438        xml_util::deserialize_primitive(tag_name, stack, Ok)
1439    }
1440}
1441/// <p>[<code>Service-managed</code> permissions] The AWS Organizations accounts to which StackSets deploys. StackSets does not deploy stack instances to the organization master account, even if the master account is in your organization or in an OU in your organization.</p> <p>For update operations, you can specify either <code>Accounts</code> or <code>OrganizationalUnitIds</code>. For create and delete operations, specify <code>OrganizationalUnitIds</code>.</p>
1442#[derive(Clone, Debug, Default, PartialEq)]
1443#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
1444#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
1445pub struct DeploymentTargets {
1446    /// <p>The names of one or more AWS accounts for which you want to deploy stack set updates.</p>
1447    pub accounts: Option<Vec<String>>,
1448    /// <p>The organization root ID or organizational unit (OU) IDs to which StackSets deploys.</p>
1449    pub organizational_unit_ids: Option<Vec<String>>,
1450}
1451
1452#[allow(dead_code)]
1453struct DeploymentTargetsDeserializer;
1454impl DeploymentTargetsDeserializer {
1455    #[allow(dead_code, unused_variables)]
1456    fn deserialize<T: Peek + Next>(
1457        tag_name: &str,
1458        stack: &mut T,
1459    ) -> Result<DeploymentTargets, XmlParseError> {
1460        deserialize_elements::<_, DeploymentTargets, _>(tag_name, stack, |name, stack, obj| {
1461            match name {
1462                "Accounts" => {
1463                    obj.accounts
1464                        .get_or_insert(vec![])
1465                        .extend(AccountListDeserializer::deserialize("Accounts", stack)?);
1466                }
1467                "OrganizationalUnitIds" => {
1468                    obj.organizational_unit_ids.get_or_insert(vec![]).extend(
1469                        OrganizationalUnitIdListDeserializer::deserialize(
1470                            "OrganizationalUnitIds",
1471                            stack,
1472                        )?,
1473                    );
1474                }
1475                _ => skip_tree(stack),
1476            }
1477            Ok(())
1478        })
1479    }
1480}
1481
1482/// Serialize `DeploymentTargets` contents to a `SignedRequest`.
1483struct DeploymentTargetsSerializer;
1484impl DeploymentTargetsSerializer {
1485    fn serialize(params: &mut Params, name: &str, obj: &DeploymentTargets) {
1486        let mut prefix = name.to_string();
1487        if prefix != "" {
1488            prefix.push_str(".");
1489        }
1490
1491        if let Some(ref field_value) = obj.accounts {
1492            AccountListSerializer::serialize(
1493                params,
1494                &format!("{}{}", prefix, "Accounts"),
1495                field_value,
1496            );
1497        }
1498        if let Some(ref field_value) = obj.organizational_unit_ids {
1499            OrganizationalUnitIdListSerializer::serialize(
1500                params,
1501                &format!("{}{}", prefix, "OrganizationalUnitIds"),
1502                field_value,
1503            );
1504        }
1505    }
1506}
1507
1508#[allow(dead_code)]
1509struct DeprecatedStatusDeserializer;
1510impl DeprecatedStatusDeserializer {
1511    #[allow(dead_code, unused_variables)]
1512    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
1513        xml_util::deserialize_primitive(tag_name, stack, Ok)
1514    }
1515}
1516#[derive(Clone, Debug, Default, PartialEq)]
1517#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
1518pub struct DeregisterTypeInput {
1519    /// <p>The Amazon Resource Name (ARN) of the type.</p> <p>Conditional: You must specify either <code>TypeName</code> and <code>Type</code>, or <code>Arn</code>.</p>
1520    pub arn: Option<String>,
1521    /// <p>The kind of type.</p> <p>Currently the only valid value is <code>RESOURCE</code>.</p> <p>Conditional: You must specify either <code>TypeName</code> and <code>Type</code>, or <code>Arn</code>.</p>
1522    pub type_: Option<String>,
1523    /// <p>The name of the type.</p> <p>Conditional: You must specify either <code>TypeName</code> and <code>Type</code>, or <code>Arn</code>.</p>
1524    pub type_name: Option<String>,
1525    /// <p>The ID of a specific version of the type. The version ID is the value at the end of the Amazon Resource Name (ARN) assigned to the type version when it is registered.</p>
1526    pub version_id: Option<String>,
1527}
1528
1529/// Serialize `DeregisterTypeInput` contents to a `SignedRequest`.
1530struct DeregisterTypeInputSerializer;
1531impl DeregisterTypeInputSerializer {
1532    fn serialize(params: &mut Params, name: &str, obj: &DeregisterTypeInput) {
1533        let mut prefix = name.to_string();
1534        if prefix != "" {
1535            prefix.push_str(".");
1536        }
1537
1538        if let Some(ref field_value) = obj.arn {
1539            params.put(&format!("{}{}", prefix, "Arn"), &field_value);
1540        }
1541        if let Some(ref field_value) = obj.type_ {
1542            params.put(&format!("{}{}", prefix, "Type"), &field_value);
1543        }
1544        if let Some(ref field_value) = obj.type_name {
1545            params.put(&format!("{}{}", prefix, "TypeName"), &field_value);
1546        }
1547        if let Some(ref field_value) = obj.version_id {
1548            params.put(&format!("{}{}", prefix, "VersionId"), &field_value);
1549        }
1550    }
1551}
1552
1553#[derive(Clone, Debug, Default, PartialEq)]
1554#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
1555pub struct DeregisterTypeOutput {}
1556
1557#[allow(dead_code)]
1558struct DeregisterTypeOutputDeserializer;
1559impl DeregisterTypeOutputDeserializer {
1560    #[allow(dead_code, unused_variables)]
1561    fn deserialize<T: Peek + Next>(
1562        tag_name: &str,
1563        stack: &mut T,
1564    ) -> Result<DeregisterTypeOutput, XmlParseError> {
1565        xml_util::start_element(tag_name, stack)?;
1566
1567        let obj = DeregisterTypeOutput::default();
1568
1569        xml_util::end_element(tag_name, stack)?;
1570
1571        Ok(obj)
1572    }
1573}
1574/// <p>The input for the <a>DescribeAccountLimits</a> action.</p>
1575#[derive(Clone, Debug, Default, PartialEq)]
1576#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
1577pub struct DescribeAccountLimitsInput {
1578    /// <p>A string that identifies the next page of limits that you want to retrieve.</p>
1579    pub next_token: Option<String>,
1580}
1581
1582/// Serialize `DescribeAccountLimitsInput` contents to a `SignedRequest`.
1583struct DescribeAccountLimitsInputSerializer;
1584impl DescribeAccountLimitsInputSerializer {
1585    fn serialize(params: &mut Params, name: &str, obj: &DescribeAccountLimitsInput) {
1586        let mut prefix = name.to_string();
1587        if prefix != "" {
1588            prefix.push_str(".");
1589        }
1590
1591        if let Some(ref field_value) = obj.next_token {
1592            params.put(&format!("{}{}", prefix, "NextToken"), &field_value);
1593        }
1594    }
1595}
1596
1597/// <p>The output for the <a>DescribeAccountLimits</a> action.</p>
1598#[derive(Clone, Debug, Default, PartialEq)]
1599#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
1600pub struct DescribeAccountLimitsOutput {
1601    /// <p>An account limit structure that contain a list of AWS CloudFormation account limits and their values.</p>
1602    pub account_limits: Option<Vec<AccountLimit>>,
1603    /// <p>If the output exceeds 1 MB in size, a string that identifies the next page of limits. If no additional page exists, this value is null.</p>
1604    pub next_token: Option<String>,
1605}
1606
1607#[allow(dead_code)]
1608struct DescribeAccountLimitsOutputDeserializer;
1609impl DescribeAccountLimitsOutputDeserializer {
1610    #[allow(dead_code, unused_variables)]
1611    fn deserialize<T: Peek + Next>(
1612        tag_name: &str,
1613        stack: &mut T,
1614    ) -> Result<DescribeAccountLimitsOutput, XmlParseError> {
1615        deserialize_elements::<_, DescribeAccountLimitsOutput, _>(
1616            tag_name,
1617            stack,
1618            |name, stack, obj| {
1619                match name {
1620                    "AccountLimits" => {
1621                        obj.account_limits.get_or_insert(vec![]).extend(
1622                            AccountLimitListDeserializer::deserialize("AccountLimits", stack)?,
1623                        );
1624                    }
1625                    "NextToken" => {
1626                        obj.next_token =
1627                            Some(NextTokenDeserializer::deserialize("NextToken", stack)?);
1628                    }
1629                    _ => skip_tree(stack),
1630                }
1631                Ok(())
1632            },
1633        )
1634    }
1635}
1636/// <p>The input for the <a>DescribeChangeSet</a> action.</p>
1637#[derive(Clone, Debug, Default, PartialEq)]
1638#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
1639pub struct DescribeChangeSetInput {
1640    /// <p>The name or Amazon Resource Name (ARN) of the change set that you want to describe.</p>
1641    pub change_set_name: String,
1642    /// <p>A string (provided by the <a>DescribeChangeSet</a> response output) that identifies the next page of information that you want to retrieve.</p>
1643    pub next_token: Option<String>,
1644    /// <p>If you specified the name of a change set, specify the stack name or ID (ARN) of the change set you want to describe.</p>
1645    pub stack_name: Option<String>,
1646}
1647
1648/// Serialize `DescribeChangeSetInput` contents to a `SignedRequest`.
1649struct DescribeChangeSetInputSerializer;
1650impl DescribeChangeSetInputSerializer {
1651    fn serialize(params: &mut Params, name: &str, obj: &DescribeChangeSetInput) {
1652        let mut prefix = name.to_string();
1653        if prefix != "" {
1654            prefix.push_str(".");
1655        }
1656
1657        params.put(
1658            &format!("{}{}", prefix, "ChangeSetName"),
1659            &obj.change_set_name,
1660        );
1661        if let Some(ref field_value) = obj.next_token {
1662            params.put(&format!("{}{}", prefix, "NextToken"), &field_value);
1663        }
1664        if let Some(ref field_value) = obj.stack_name {
1665            params.put(&format!("{}{}", prefix, "StackName"), &field_value);
1666        }
1667    }
1668}
1669
1670/// <p>The output for the <a>DescribeChangeSet</a> action.</p>
1671#[derive(Clone, Debug, Default, PartialEq)]
1672#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
1673pub struct DescribeChangeSetOutput {
1674    /// <p>If you execute the change set, the list of capabilities that were explicitly acknowledged when the change set was created.</p>
1675    pub capabilities: Option<Vec<String>>,
1676    /// <p>The ARN of the change set.</p>
1677    pub change_set_id: Option<String>,
1678    /// <p>The name of the change set.</p>
1679    pub change_set_name: Option<String>,
1680    /// <p>A list of <code>Change</code> structures that describes the resources AWS CloudFormation changes if you execute the change set.</p>
1681    pub changes: Option<Vec<Change>>,
1682    /// <p>The start time when the change set was created, in UTC.</p>
1683    pub creation_time: Option<String>,
1684    /// <p>Information about the change set.</p>
1685    pub description: Option<String>,
1686    /// <p>If the change set execution status is <code>AVAILABLE</code>, you can execute the change set. If you can’t execute the change set, the status indicates why. For example, a change set might be in an <code>UNAVAILABLE</code> state because AWS CloudFormation is still creating it or in an <code>OBSOLETE</code> state because the stack was already updated.</p>
1687    pub execution_status: Option<String>,
1688    /// <p>If the output exceeds 1 MB, a string that identifies the next page of changes. If there is no additional page, this value is null.</p>
1689    pub next_token: Option<String>,
1690    /// <p>The ARNs of the Amazon Simple Notification Service (Amazon SNS) topics that will be associated with the stack if you execute the change set.</p>
1691    pub notification_ar_ns: Option<Vec<String>>,
1692    /// <p>A list of <code>Parameter</code> structures that describes the input parameters and their values used to create the change set. For more information, see the <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_Parameter.html">Parameter</a> data type.</p>
1693    pub parameters: Option<Vec<Parameter>>,
1694    /// <p>The rollback triggers for AWS CloudFormation to monitor during stack creation and updating operations, and for the specified monitoring period afterwards.</p>
1695    pub rollback_configuration: Option<RollbackConfiguration>,
1696    /// <p>The ARN of the stack that is associated with the change set.</p>
1697    pub stack_id: Option<String>,
1698    /// <p>The name of the stack that is associated with the change set.</p>
1699    pub stack_name: Option<String>,
1700    /// <p>The current status of the change set, such as <code>CREATE_IN_PROGRESS</code>, <code>CREATE_COMPLETE</code>, or <code>FAILED</code>.</p>
1701    pub status: Option<String>,
1702    /// <p>A description of the change set's status. For example, if your attempt to create a change set failed, AWS CloudFormation shows the error message.</p>
1703    pub status_reason: Option<String>,
1704    /// <p>If you execute the change set, the tags that will be associated with the stack.</p>
1705    pub tags: Option<Vec<Tag>>,
1706}
1707
1708#[allow(dead_code)]
1709struct DescribeChangeSetOutputDeserializer;
1710impl DescribeChangeSetOutputDeserializer {
1711    #[allow(dead_code, unused_variables)]
1712    fn deserialize<T: Peek + Next>(
1713        tag_name: &str,
1714        stack: &mut T,
1715    ) -> Result<DescribeChangeSetOutput, XmlParseError> {
1716        deserialize_elements::<_, DescribeChangeSetOutput, _>(
1717            tag_name,
1718            stack,
1719            |name, stack, obj| {
1720                match name {
1721                    "Capabilities" => {
1722                        obj.capabilities.get_or_insert(vec![]).extend(
1723                            CapabilitiesDeserializer::deserialize("Capabilities", stack)?,
1724                        );
1725                    }
1726                    "ChangeSetId" => {
1727                        obj.change_set_id =
1728                            Some(ChangeSetIdDeserializer::deserialize("ChangeSetId", stack)?);
1729                    }
1730                    "ChangeSetName" => {
1731                        obj.change_set_name = Some(ChangeSetNameDeserializer::deserialize(
1732                            "ChangeSetName",
1733                            stack,
1734                        )?);
1735                    }
1736                    "Changes" => {
1737                        obj.changes
1738                            .get_or_insert(vec![])
1739                            .extend(ChangesDeserializer::deserialize("Changes", stack)?);
1740                    }
1741                    "CreationTime" => {
1742                        obj.creation_time = Some(CreationTimeDeserializer::deserialize(
1743                            "CreationTime",
1744                            stack,
1745                        )?);
1746                    }
1747                    "Description" => {
1748                        obj.description =
1749                            Some(DescriptionDeserializer::deserialize("Description", stack)?);
1750                    }
1751                    "ExecutionStatus" => {
1752                        obj.execution_status = Some(ExecutionStatusDeserializer::deserialize(
1753                            "ExecutionStatus",
1754                            stack,
1755                        )?);
1756                    }
1757                    "NextToken" => {
1758                        obj.next_token =
1759                            Some(NextTokenDeserializer::deserialize("NextToken", stack)?);
1760                    }
1761                    "NotificationARNs" => {
1762                        obj.notification_ar_ns.get_or_insert(vec![]).extend(
1763                            NotificationARNsDeserializer::deserialize("NotificationARNs", stack)?,
1764                        );
1765                    }
1766                    "Parameters" => {
1767                        obj.parameters
1768                            .get_or_insert(vec![])
1769                            .extend(ParametersDeserializer::deserialize("Parameters", stack)?);
1770                    }
1771                    "RollbackConfiguration" => {
1772                        obj.rollback_configuration =
1773                            Some(RollbackConfigurationDeserializer::deserialize(
1774                                "RollbackConfiguration",
1775                                stack,
1776                            )?);
1777                    }
1778                    "StackId" => {
1779                        obj.stack_id = Some(StackIdDeserializer::deserialize("StackId", stack)?);
1780                    }
1781                    "StackName" => {
1782                        obj.stack_name =
1783                            Some(StackNameDeserializer::deserialize("StackName", stack)?);
1784                    }
1785                    "Status" => {
1786                        obj.status =
1787                            Some(ChangeSetStatusDeserializer::deserialize("Status", stack)?);
1788                    }
1789                    "StatusReason" => {
1790                        obj.status_reason = Some(ChangeSetStatusReasonDeserializer::deserialize(
1791                            "StatusReason",
1792                            stack,
1793                        )?);
1794                    }
1795                    "Tags" => {
1796                        obj.tags
1797                            .get_or_insert(vec![])
1798                            .extend(TagsDeserializer::deserialize("Tags", stack)?);
1799                    }
1800                    _ => skip_tree(stack),
1801                }
1802                Ok(())
1803            },
1804        )
1805    }
1806}
1807#[derive(Clone, Debug, Default, PartialEq)]
1808#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
1809pub struct DescribeStackDriftDetectionStatusInput {
1810    /// <p>The ID of the drift detection results of this operation. </p> <p>AWS CloudFormation generates new results, with a new drift detection ID, each time this operation is run. However, the number of drift results AWS CloudFormation retains for any given stack, and for how long, may vary. </p>
1811    pub stack_drift_detection_id: String,
1812}
1813
1814/// Serialize `DescribeStackDriftDetectionStatusInput` contents to a `SignedRequest`.
1815struct DescribeStackDriftDetectionStatusInputSerializer;
1816impl DescribeStackDriftDetectionStatusInputSerializer {
1817    fn serialize(params: &mut Params, name: &str, obj: &DescribeStackDriftDetectionStatusInput) {
1818        let mut prefix = name.to_string();
1819        if prefix != "" {
1820            prefix.push_str(".");
1821        }
1822
1823        params.put(
1824            &format!("{}{}", prefix, "StackDriftDetectionId"),
1825            &obj.stack_drift_detection_id,
1826        );
1827    }
1828}
1829
1830#[derive(Clone, Debug, Default, PartialEq)]
1831#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
1832pub struct DescribeStackDriftDetectionStatusOutput {
1833    /// <p><p>The status of the stack drift detection operation.</p> <ul> <li> <p> <code>DETECTION<em>COMPLETE</code>: The stack drift detection operation has successfully completed for all resources in the stack that support drift detection. (Resources that do not currently support stack detection remain unchecked.)</p> <p>If you specified logical resource IDs for AWS CloudFormation to use as a filter for the stack drift detection operation, only the resources with those logical IDs are checked for drift.</p> </li> <li> <p> <code>DETECTION</em>FAILED</code>: The stack drift detection operation has failed for at least one resource in the stack. Results will be available for resources on which AWS CloudFormation successfully completed drift detection.</p> </li> <li> <p> <code>DETECTION<em>IN</em>PROGRESS</code>: The stack drift detection operation is currently in progress.</p> </li> </ul></p>
1834    pub detection_status: String,
1835    /// <p>The reason the stack drift detection operation has its current status.</p>
1836    pub detection_status_reason: Option<String>,
1837    /// <p>Total number of stack resources that have drifted. This is NULL until the drift detection operation reaches a status of <code>DETECTION_COMPLETE</code>. This value will be 0 for stacks whose drift status is <code>IN_SYNC</code>.</p>
1838    pub drifted_stack_resource_count: Option<i64>,
1839    /// <p>The ID of the drift detection results of this operation. </p> <p>AWS CloudFormation generates new results, with a new drift detection ID, each time this operation is run. However, the number of reports AWS CloudFormation retains for any given stack, and for how long, may vary.</p>
1840    pub stack_drift_detection_id: String,
1841    /// <p><p>Status of the stack&#39;s actual configuration compared to its expected configuration. </p> <ul> <li> <p> <code>DRIFTED</code>: The stack differs from its expected template configuration. A stack is considered to have drifted if one or more of its resources have drifted.</p> </li> <li> <p> <code>NOT<em>CHECKED</code>: AWS CloudFormation has not checked if the stack differs from its expected template configuration.</p> </li> <li> <p> <code>IN</em>SYNC</code>: The stack&#39;s actual configuration matches its expected template configuration.</p> </li> <li> <p> <code>UNKNOWN</code>: This value is reserved for future use.</p> </li> </ul></p>
1842    pub stack_drift_status: Option<String>,
1843    /// <p>The ID of the stack.</p>
1844    pub stack_id: String,
1845    /// <p>Time at which the stack drift detection operation was initiated.</p>
1846    pub timestamp: String,
1847}
1848
1849#[allow(dead_code)]
1850struct DescribeStackDriftDetectionStatusOutputDeserializer;
1851impl DescribeStackDriftDetectionStatusOutputDeserializer {
1852    #[allow(dead_code, unused_variables)]
1853    fn deserialize<T: Peek + Next>(
1854        tag_name: &str,
1855        stack: &mut T,
1856    ) -> Result<DescribeStackDriftDetectionStatusOutput, XmlParseError> {
1857        deserialize_elements::<_, DescribeStackDriftDetectionStatusOutput, _>(
1858            tag_name,
1859            stack,
1860            |name, stack, obj| {
1861                match name {
1862                    "DetectionStatus" => {
1863                        obj.detection_status = StackDriftDetectionStatusDeserializer::deserialize(
1864                            "DetectionStatus",
1865                            stack,
1866                        )?;
1867                    }
1868                    "DetectionStatusReason" => {
1869                        obj.detection_status_reason =
1870                            Some(StackDriftDetectionStatusReasonDeserializer::deserialize(
1871                                "DetectionStatusReason",
1872                                stack,
1873                            )?);
1874                    }
1875                    "DriftedStackResourceCount" => {
1876                        obj.drifted_stack_resource_count =
1877                            Some(BoxedIntegerDeserializer::deserialize(
1878                                "DriftedStackResourceCount",
1879                                stack,
1880                            )?);
1881                    }
1882                    "StackDriftDetectionId" => {
1883                        obj.stack_drift_detection_id =
1884                            StackDriftDetectionIdDeserializer::deserialize(
1885                                "StackDriftDetectionId",
1886                                stack,
1887                            )?;
1888                    }
1889                    "StackDriftStatus" => {
1890                        obj.stack_drift_status = Some(StackDriftStatusDeserializer::deserialize(
1891                            "StackDriftStatus",
1892                            stack,
1893                        )?);
1894                    }
1895                    "StackId" => {
1896                        obj.stack_id = StackIdDeserializer::deserialize("StackId", stack)?;
1897                    }
1898                    "Timestamp" => {
1899                        obj.timestamp = TimestampDeserializer::deserialize("Timestamp", stack)?;
1900                    }
1901                    _ => skip_tree(stack),
1902                }
1903                Ok(())
1904            },
1905        )
1906    }
1907}
1908/// <p>The input for <a>DescribeStackEvents</a> action.</p>
1909#[derive(Clone, Debug, Default, PartialEq)]
1910#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
1911pub struct DescribeStackEventsInput {
1912    /// <p>A string that identifies the next page of events that you want to retrieve.</p>
1913    pub next_token: Option<String>,
1914    /// <p>The name or the unique stack ID that is associated with the stack, which are not always interchangeable:</p> <ul> <li> <p>Running stacks: You can specify either the stack's name or its unique stack ID.</p> </li> <li> <p>Deleted stacks: You must specify the unique stack ID.</p> </li> </ul> <p>Default: There is no default value.</p>
1915    pub stack_name: Option<String>,
1916}
1917
1918/// Serialize `DescribeStackEventsInput` contents to a `SignedRequest`.
1919struct DescribeStackEventsInputSerializer;
1920impl DescribeStackEventsInputSerializer {
1921    fn serialize(params: &mut Params, name: &str, obj: &DescribeStackEventsInput) {
1922        let mut prefix = name.to_string();
1923        if prefix != "" {
1924            prefix.push_str(".");
1925        }
1926
1927        if let Some(ref field_value) = obj.next_token {
1928            params.put(&format!("{}{}", prefix, "NextToken"), &field_value);
1929        }
1930        if let Some(ref field_value) = obj.stack_name {
1931            params.put(&format!("{}{}", prefix, "StackName"), &field_value);
1932        }
1933    }
1934}
1935
1936/// <p>The output for a <a>DescribeStackEvents</a> action.</p>
1937#[derive(Clone, Debug, Default, PartialEq)]
1938#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
1939pub struct DescribeStackEventsOutput {
1940    /// <p>If the output exceeds 1 MB in size, a string that identifies the next page of events. If no additional page exists, this value is null.</p>
1941    pub next_token: Option<String>,
1942    /// <p>A list of <code>StackEvents</code> structures.</p>
1943    pub stack_events: Option<Vec<StackEvent>>,
1944}
1945
1946#[allow(dead_code)]
1947struct DescribeStackEventsOutputDeserializer;
1948impl DescribeStackEventsOutputDeserializer {
1949    #[allow(dead_code, unused_variables)]
1950    fn deserialize<T: Peek + Next>(
1951        tag_name: &str,
1952        stack: &mut T,
1953    ) -> Result<DescribeStackEventsOutput, XmlParseError> {
1954        deserialize_elements::<_, DescribeStackEventsOutput, _>(
1955            tag_name,
1956            stack,
1957            |name, stack, obj| {
1958                match name {
1959                    "NextToken" => {
1960                        obj.next_token =
1961                            Some(NextTokenDeserializer::deserialize("NextToken", stack)?);
1962                    }
1963                    "StackEvents" => {
1964                        obj.stack_events
1965                            .get_or_insert(vec![])
1966                            .extend(StackEventsDeserializer::deserialize("StackEvents", stack)?);
1967                    }
1968                    _ => skip_tree(stack),
1969                }
1970                Ok(())
1971            },
1972        )
1973    }
1974}
1975#[derive(Clone, Debug, Default, PartialEq)]
1976#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
1977pub struct DescribeStackInstanceInput {
1978    /// <p>The ID of an AWS account that's associated with this stack instance.</p>
1979    pub stack_instance_account: String,
1980    /// <p>The name of a Region that's associated with this stack instance.</p>
1981    pub stack_instance_region: String,
1982    /// <p>The name or the unique stack ID of the stack set that you want to get stack instance information for.</p>
1983    pub stack_set_name: String,
1984}
1985
1986/// Serialize `DescribeStackInstanceInput` contents to a `SignedRequest`.
1987struct DescribeStackInstanceInputSerializer;
1988impl DescribeStackInstanceInputSerializer {
1989    fn serialize(params: &mut Params, name: &str, obj: &DescribeStackInstanceInput) {
1990        let mut prefix = name.to_string();
1991        if prefix != "" {
1992            prefix.push_str(".");
1993        }
1994
1995        params.put(
1996            &format!("{}{}", prefix, "StackInstanceAccount"),
1997            &obj.stack_instance_account,
1998        );
1999        params.put(
2000            &format!("{}{}", prefix, "StackInstanceRegion"),
2001            &obj.stack_instance_region,
2002        );
2003        params.put(
2004            &format!("{}{}", prefix, "StackSetName"),
2005            &obj.stack_set_name,
2006        );
2007    }
2008}
2009
2010#[derive(Clone, Debug, Default, PartialEq)]
2011#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
2012pub struct DescribeStackInstanceOutput {
2013    /// <p>The stack instance that matches the specified request parameters.</p>
2014    pub stack_instance: Option<StackInstance>,
2015}
2016
2017#[allow(dead_code)]
2018struct DescribeStackInstanceOutputDeserializer;
2019impl DescribeStackInstanceOutputDeserializer {
2020    #[allow(dead_code, unused_variables)]
2021    fn deserialize<T: Peek + Next>(
2022        tag_name: &str,
2023        stack: &mut T,
2024    ) -> Result<DescribeStackInstanceOutput, XmlParseError> {
2025        deserialize_elements::<_, DescribeStackInstanceOutput, _>(
2026            tag_name,
2027            stack,
2028            |name, stack, obj| {
2029                match name {
2030                    "StackInstance" => {
2031                        obj.stack_instance = Some(StackInstanceDeserializer::deserialize(
2032                            "StackInstance",
2033                            stack,
2034                        )?);
2035                    }
2036                    _ => skip_tree(stack),
2037                }
2038                Ok(())
2039            },
2040        )
2041    }
2042}
2043#[derive(Clone, Debug, Default, PartialEq)]
2044#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
2045pub struct DescribeStackResourceDriftsInput {
2046    /// <p>The maximum number of results to be returned with a single call. If the number of available results exceeds this maximum, the response includes a <code>NextToken</code> value that you can assign to the <code>NextToken</code> request parameter to get the next set of results.</p>
2047    pub max_results: Option<i64>,
2048    /// <p>A string that identifies the next page of stack resource drift results.</p>
2049    pub next_token: Option<String>,
2050    /// <p>The name of the stack for which you want drift information.</p>
2051    pub stack_name: String,
2052    /// <p><p>The resource drift status values to use as filters for the resource drift results returned.</p> <ul> <li> <p> <code>DELETED</code>: The resource differs from its expected template configuration in that the resource has been deleted.</p> </li> <li> <p> <code>MODIFIED</code>: One or more resource properties differ from their expected template values.</p> </li> <li> <p> <code>IN<em>SYNC</code>: The resources&#39;s actual configuration matches its expected template configuration.</p> </li> <li> <p> <code>NOT</em>CHECKED</code>: AWS CloudFormation does not currently return this value.</p> </li> </ul></p>
2053    pub stack_resource_drift_status_filters: Option<Vec<String>>,
2054}
2055
2056/// Serialize `DescribeStackResourceDriftsInput` contents to a `SignedRequest`.
2057struct DescribeStackResourceDriftsInputSerializer;
2058impl DescribeStackResourceDriftsInputSerializer {
2059    fn serialize(params: &mut Params, name: &str, obj: &DescribeStackResourceDriftsInput) {
2060        let mut prefix = name.to_string();
2061        if prefix != "" {
2062            prefix.push_str(".");
2063        }
2064
2065        if let Some(ref field_value) = obj.max_results {
2066            params.put(&format!("{}{}", prefix, "MaxResults"), &field_value);
2067        }
2068        if let Some(ref field_value) = obj.next_token {
2069            params.put(&format!("{}{}", prefix, "NextToken"), &field_value);
2070        }
2071        params.put(&format!("{}{}", prefix, "StackName"), &obj.stack_name);
2072        if let Some(ref field_value) = obj.stack_resource_drift_status_filters {
2073            StackResourceDriftStatusFiltersSerializer::serialize(
2074                params,
2075                &format!("{}{}", prefix, "StackResourceDriftStatusFilters"),
2076                field_value,
2077            );
2078        }
2079    }
2080}
2081
2082#[derive(Clone, Debug, Default, PartialEq)]
2083#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
2084pub struct DescribeStackResourceDriftsOutput {
2085    /// <p>If the request doesn't return all of the remaining results, <code>NextToken</code> is set to a token. To retrieve the next set of results, call <code>DescribeStackResourceDrifts</code> again and assign that token to the request object's <code>NextToken</code> parameter. If the request returns all results, <code>NextToken</code> is set to <code>null</code>.</p>
2086    pub next_token: Option<String>,
2087    /// <p>Drift information for the resources that have been checked for drift in the specified stack. This includes actual and expected configuration values for resources where AWS CloudFormation detects drift.</p> <p>For a given stack, there will be one <code>StackResourceDrift</code> for each stack resource that has been checked for drift. Resources that have not yet been checked for drift are not included. Resources that do not currently support drift detection are not checked, and so not included. For a list of resources that support drift detection, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift-resource-list.html">Resources that Support Drift Detection</a>.</p>
2088    pub stack_resource_drifts: Vec<StackResourceDrift>,
2089}
2090
2091#[allow(dead_code)]
2092struct DescribeStackResourceDriftsOutputDeserializer;
2093impl DescribeStackResourceDriftsOutputDeserializer {
2094    #[allow(dead_code, unused_variables)]
2095    fn deserialize<T: Peek + Next>(
2096        tag_name: &str,
2097        stack: &mut T,
2098    ) -> Result<DescribeStackResourceDriftsOutput, XmlParseError> {
2099        deserialize_elements::<_, DescribeStackResourceDriftsOutput, _>(
2100            tag_name,
2101            stack,
2102            |name, stack, obj| {
2103                match name {
2104                    "NextToken" => {
2105                        obj.next_token =
2106                            Some(NextTokenDeserializer::deserialize("NextToken", stack)?);
2107                    }
2108                    "StackResourceDrifts" => {
2109                        obj.stack_resource_drifts.extend(
2110                            StackResourceDriftsDeserializer::deserialize(
2111                                "StackResourceDrifts",
2112                                stack,
2113                            )?,
2114                        );
2115                    }
2116                    _ => skip_tree(stack),
2117                }
2118                Ok(())
2119            },
2120        )
2121    }
2122}
2123/// <p>The input for <a>DescribeStackResource</a> action.</p>
2124#[derive(Clone, Debug, Default, PartialEq)]
2125#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
2126pub struct DescribeStackResourceInput {
2127    /// <p>The logical name of the resource as specified in the template.</p> <p>Default: There is no default value.</p>
2128    pub logical_resource_id: String,
2129    /// <p>The name or the unique stack ID that is associated with the stack, which are not always interchangeable:</p> <ul> <li> <p>Running stacks: You can specify either the stack's name or its unique stack ID.</p> </li> <li> <p>Deleted stacks: You must specify the unique stack ID.</p> </li> </ul> <p>Default: There is no default value.</p>
2130    pub stack_name: String,
2131}
2132
2133/// Serialize `DescribeStackResourceInput` contents to a `SignedRequest`.
2134struct DescribeStackResourceInputSerializer;
2135impl DescribeStackResourceInputSerializer {
2136    fn serialize(params: &mut Params, name: &str, obj: &DescribeStackResourceInput) {
2137        let mut prefix = name.to_string();
2138        if prefix != "" {
2139            prefix.push_str(".");
2140        }
2141
2142        params.put(
2143            &format!("{}{}", prefix, "LogicalResourceId"),
2144            &obj.logical_resource_id,
2145        );
2146        params.put(&format!("{}{}", prefix, "StackName"), &obj.stack_name);
2147    }
2148}
2149
2150/// <p>The output for a <a>DescribeStackResource</a> action.</p>
2151#[derive(Clone, Debug, Default, PartialEq)]
2152#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
2153pub struct DescribeStackResourceOutput {
2154    /// <p>A <code>StackResourceDetail</code> structure containing the description of the specified resource in the specified stack.</p>
2155    pub stack_resource_detail: Option<StackResourceDetail>,
2156}
2157
2158#[allow(dead_code)]
2159struct DescribeStackResourceOutputDeserializer;
2160impl DescribeStackResourceOutputDeserializer {
2161    #[allow(dead_code, unused_variables)]
2162    fn deserialize<T: Peek + Next>(
2163        tag_name: &str,
2164        stack: &mut T,
2165    ) -> Result<DescribeStackResourceOutput, XmlParseError> {
2166        deserialize_elements::<_, DescribeStackResourceOutput, _>(
2167            tag_name,
2168            stack,
2169            |name, stack, obj| {
2170                match name {
2171                    "StackResourceDetail" => {
2172                        obj.stack_resource_detail =
2173                            Some(StackResourceDetailDeserializer::deserialize(
2174                                "StackResourceDetail",
2175                                stack,
2176                            )?);
2177                    }
2178                    _ => skip_tree(stack),
2179                }
2180                Ok(())
2181            },
2182        )
2183    }
2184}
2185/// <p>The input for <a>DescribeStackResources</a> action.</p>
2186#[derive(Clone, Debug, Default, PartialEq)]
2187#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
2188pub struct DescribeStackResourcesInput {
2189    /// <p>The logical name of the resource as specified in the template.</p> <p>Default: There is no default value.</p>
2190    pub logical_resource_id: Option<String>,
2191    /// <p>The name or unique identifier that corresponds to a physical instance ID of a resource supported by AWS CloudFormation.</p> <p>For example, for an Amazon Elastic Compute Cloud (EC2) instance, <code>PhysicalResourceId</code> corresponds to the <code>InstanceId</code>. You can pass the EC2 <code>InstanceId</code> to <code>DescribeStackResources</code> to find which stack the instance belongs to and what other resources are part of the stack.</p> <p>Required: Conditional. If you do not specify <code>PhysicalResourceId</code>, you must specify <code>StackName</code>.</p> <p>Default: There is no default value.</p>
2192    pub physical_resource_id: Option<String>,
2193    /// <p>The name or the unique stack ID that is associated with the stack, which are not always interchangeable:</p> <ul> <li> <p>Running stacks: You can specify either the stack's name or its unique stack ID.</p> </li> <li> <p>Deleted stacks: You must specify the unique stack ID.</p> </li> </ul> <p>Default: There is no default value.</p> <p>Required: Conditional. If you do not specify <code>StackName</code>, you must specify <code>PhysicalResourceId</code>.</p>
2194    pub stack_name: Option<String>,
2195}
2196
2197/// Serialize `DescribeStackResourcesInput` contents to a `SignedRequest`.
2198struct DescribeStackResourcesInputSerializer;
2199impl DescribeStackResourcesInputSerializer {
2200    fn serialize(params: &mut Params, name: &str, obj: &DescribeStackResourcesInput) {
2201        let mut prefix = name.to_string();
2202        if prefix != "" {
2203            prefix.push_str(".");
2204        }
2205
2206        if let Some(ref field_value) = obj.logical_resource_id {
2207            params.put(&format!("{}{}", prefix, "LogicalResourceId"), &field_value);
2208        }
2209        if let Some(ref field_value) = obj.physical_resource_id {
2210            params.put(&format!("{}{}", prefix, "PhysicalResourceId"), &field_value);
2211        }
2212        if let Some(ref field_value) = obj.stack_name {
2213            params.put(&format!("{}{}", prefix, "StackName"), &field_value);
2214        }
2215    }
2216}
2217
2218/// <p>The output for a <a>DescribeStackResources</a> action.</p>
2219#[derive(Clone, Debug, Default, PartialEq)]
2220#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
2221pub struct DescribeStackResourcesOutput {
2222    /// <p>A list of <code>StackResource</code> structures.</p>
2223    pub stack_resources: Option<Vec<StackResource>>,
2224}
2225
2226#[allow(dead_code)]
2227struct DescribeStackResourcesOutputDeserializer;
2228impl DescribeStackResourcesOutputDeserializer {
2229    #[allow(dead_code, unused_variables)]
2230    fn deserialize<T: Peek + Next>(
2231        tag_name: &str,
2232        stack: &mut T,
2233    ) -> Result<DescribeStackResourcesOutput, XmlParseError> {
2234        deserialize_elements::<_, DescribeStackResourcesOutput, _>(
2235            tag_name,
2236            stack,
2237            |name, stack, obj| {
2238                match name {
2239                    "StackResources" => {
2240                        obj.stack_resources.get_or_insert(vec![]).extend(
2241                            StackResourcesDeserializer::deserialize("StackResources", stack)?,
2242                        );
2243                    }
2244                    _ => skip_tree(stack),
2245                }
2246                Ok(())
2247            },
2248        )
2249    }
2250}
2251#[derive(Clone, Debug, Default, PartialEq)]
2252#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
2253pub struct DescribeStackSetInput {
2254    /// <p>The name or unique ID of the stack set whose description you want.</p>
2255    pub stack_set_name: String,
2256}
2257
2258/// Serialize `DescribeStackSetInput` contents to a `SignedRequest`.
2259struct DescribeStackSetInputSerializer;
2260impl DescribeStackSetInputSerializer {
2261    fn serialize(params: &mut Params, name: &str, obj: &DescribeStackSetInput) {
2262        let mut prefix = name.to_string();
2263        if prefix != "" {
2264            prefix.push_str(".");
2265        }
2266
2267        params.put(
2268            &format!("{}{}", prefix, "StackSetName"),
2269            &obj.stack_set_name,
2270        );
2271    }
2272}
2273
2274#[derive(Clone, Debug, Default, PartialEq)]
2275#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
2276pub struct DescribeStackSetOperationInput {
2277    /// <p>The unique ID of the stack set operation. </p>
2278    pub operation_id: String,
2279    /// <p>The name or the unique stack ID of the stack set for the stack operation.</p>
2280    pub stack_set_name: String,
2281}
2282
2283/// Serialize `DescribeStackSetOperationInput` contents to a `SignedRequest`.
2284struct DescribeStackSetOperationInputSerializer;
2285impl DescribeStackSetOperationInputSerializer {
2286    fn serialize(params: &mut Params, name: &str, obj: &DescribeStackSetOperationInput) {
2287        let mut prefix = name.to_string();
2288        if prefix != "" {
2289            prefix.push_str(".");
2290        }
2291
2292        params.put(&format!("{}{}", prefix, "OperationId"), &obj.operation_id);
2293        params.put(
2294            &format!("{}{}", prefix, "StackSetName"),
2295            &obj.stack_set_name,
2296        );
2297    }
2298}
2299
2300#[derive(Clone, Debug, Default, PartialEq)]
2301#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
2302pub struct DescribeStackSetOperationOutput {
2303    /// <p>The specified stack set operation.</p>
2304    pub stack_set_operation: Option<StackSetOperation>,
2305}
2306
2307#[allow(dead_code)]
2308struct DescribeStackSetOperationOutputDeserializer;
2309impl DescribeStackSetOperationOutputDeserializer {
2310    #[allow(dead_code, unused_variables)]
2311    fn deserialize<T: Peek + Next>(
2312        tag_name: &str,
2313        stack: &mut T,
2314    ) -> Result<DescribeStackSetOperationOutput, XmlParseError> {
2315        deserialize_elements::<_, DescribeStackSetOperationOutput, _>(
2316            tag_name,
2317            stack,
2318            |name, stack, obj| {
2319                match name {
2320                    "StackSetOperation" => {
2321                        obj.stack_set_operation = Some(StackSetOperationDeserializer::deserialize(
2322                            "StackSetOperation",
2323                            stack,
2324                        )?);
2325                    }
2326                    _ => skip_tree(stack),
2327                }
2328                Ok(())
2329            },
2330        )
2331    }
2332}
2333#[derive(Clone, Debug, Default, PartialEq)]
2334#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
2335pub struct DescribeStackSetOutput {
2336    /// <p>The specified stack set.</p>
2337    pub stack_set: Option<StackSet>,
2338}
2339
2340#[allow(dead_code)]
2341struct DescribeStackSetOutputDeserializer;
2342impl DescribeStackSetOutputDeserializer {
2343    #[allow(dead_code, unused_variables)]
2344    fn deserialize<T: Peek + Next>(
2345        tag_name: &str,
2346        stack: &mut T,
2347    ) -> Result<DescribeStackSetOutput, XmlParseError> {
2348        deserialize_elements::<_, DescribeStackSetOutput, _>(tag_name, stack, |name, stack, obj| {
2349            match name {
2350                "StackSet" => {
2351                    obj.stack_set = Some(StackSetDeserializer::deserialize("StackSet", stack)?);
2352                }
2353                _ => skip_tree(stack),
2354            }
2355            Ok(())
2356        })
2357    }
2358}
2359/// <p>The input for <a>DescribeStacks</a> action.</p>
2360#[derive(Clone, Debug, Default, PartialEq)]
2361#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
2362pub struct DescribeStacksInput {
2363    /// <p>A string that identifies the next page of stacks that you want to retrieve.</p>
2364    pub next_token: Option<String>,
2365    /// <p>The name or the unique stack ID that is associated with the stack, which are not always interchangeable:</p> <ul> <li> <p>Running stacks: You can specify either the stack's name or its unique stack ID.</p> </li> <li> <p>Deleted stacks: You must specify the unique stack ID.</p> </li> </ul> <p>Default: There is no default value.</p>
2366    pub stack_name: Option<String>,
2367}
2368
2369/// Serialize `DescribeStacksInput` contents to a `SignedRequest`.
2370struct DescribeStacksInputSerializer;
2371impl DescribeStacksInputSerializer {
2372    fn serialize(params: &mut Params, name: &str, obj: &DescribeStacksInput) {
2373        let mut prefix = name.to_string();
2374        if prefix != "" {
2375            prefix.push_str(".");
2376        }
2377
2378        if let Some(ref field_value) = obj.next_token {
2379            params.put(&format!("{}{}", prefix, "NextToken"), &field_value);
2380        }
2381        if let Some(ref field_value) = obj.stack_name {
2382            params.put(&format!("{}{}", prefix, "StackName"), &field_value);
2383        }
2384    }
2385}
2386
2387/// <p>The output for a <a>DescribeStacks</a> action.</p>
2388#[derive(Clone, Debug, Default, PartialEq)]
2389#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
2390pub struct DescribeStacksOutput {
2391    /// <p>If the output exceeds 1 MB in size, a string that identifies the next page of stacks. If no additional page exists, this value is null.</p>
2392    pub next_token: Option<String>,
2393    /// <p>A list of stack structures.</p>
2394    pub stacks: Option<Vec<Stack>>,
2395}
2396
2397#[allow(dead_code)]
2398struct DescribeStacksOutputDeserializer;
2399impl DescribeStacksOutputDeserializer {
2400    #[allow(dead_code, unused_variables)]
2401    fn deserialize<T: Peek + Next>(
2402        tag_name: &str,
2403        stack: &mut T,
2404    ) -> Result<DescribeStacksOutput, XmlParseError> {
2405        deserialize_elements::<_, DescribeStacksOutput, _>(tag_name, stack, |name, stack, obj| {
2406            match name {
2407                "NextToken" => {
2408                    obj.next_token = Some(NextTokenDeserializer::deserialize("NextToken", stack)?);
2409                }
2410                "Stacks" => {
2411                    obj.stacks
2412                        .get_or_insert(vec![])
2413                        .extend(StacksDeserializer::deserialize("Stacks", stack)?);
2414                }
2415                _ => skip_tree(stack),
2416            }
2417            Ok(())
2418        })
2419    }
2420}
2421#[derive(Clone, Debug, Default, PartialEq)]
2422#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
2423pub struct DescribeTypeInput {
2424    /// <p>The Amazon Resource Name (ARN) of the type.</p> <p>Conditional: You must specify either <code>TypeName</code> and <code>Type</code>, or <code>Arn</code>.</p>
2425    pub arn: Option<String>,
2426    /// <p>The kind of type. </p> <p>Currently the only valid value is <code>RESOURCE</code>.</p> <p>Conditional: You must specify either <code>TypeName</code> and <code>Type</code>, or <code>Arn</code>.</p>
2427    pub type_: Option<String>,
2428    /// <p>The name of the type.</p> <p>Conditional: You must specify either <code>TypeName</code> and <code>Type</code>, or <code>Arn</code>.</p>
2429    pub type_name: Option<String>,
2430    /// <p>The ID of a specific version of the type. The version ID is the value at the end of the Amazon Resource Name (ARN) assigned to the type version when it is registered.</p> <p>If you specify a <code>VersionId</code>, <code>DescribeType</code> returns information about that specific type version. Otherwise, it returns information about the default type version.</p>
2431    pub version_id: Option<String>,
2432}
2433
2434/// Serialize `DescribeTypeInput` contents to a `SignedRequest`.
2435struct DescribeTypeInputSerializer;
2436impl DescribeTypeInputSerializer {
2437    fn serialize(params: &mut Params, name: &str, obj: &DescribeTypeInput) {
2438        let mut prefix = name.to_string();
2439        if prefix != "" {
2440            prefix.push_str(".");
2441        }
2442
2443        if let Some(ref field_value) = obj.arn {
2444            params.put(&format!("{}{}", prefix, "Arn"), &field_value);
2445        }
2446        if let Some(ref field_value) = obj.type_ {
2447            params.put(&format!("{}{}", prefix, "Type"), &field_value);
2448        }
2449        if let Some(ref field_value) = obj.type_name {
2450            params.put(&format!("{}{}", prefix, "TypeName"), &field_value);
2451        }
2452        if let Some(ref field_value) = obj.version_id {
2453            params.put(&format!("{}{}", prefix, "VersionId"), &field_value);
2454        }
2455    }
2456}
2457
2458#[derive(Clone, Debug, Default, PartialEq)]
2459#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
2460pub struct DescribeTypeOutput {
2461    /// <p>The Amazon Resource Name (ARN) of the type.</p>
2462    pub arn: Option<String>,
2463    /// <p>The ID of the default version of the type. The default version is used when the type version is not specified.</p> <p>To set the default version of a type, use <code> <a>SetTypeDefaultVersion</a> </code>. </p>
2464    pub default_version_id: Option<String>,
2465    /// <p><p>The deprecation status of the type.</p> <p>Valid values include:</p> <ul> <li> <p> <code>LIVE</code>: The type is registered and can be used in CloudFormation operations, dependent on its provisioning behavior and visibility scope.</p> </li> <li> <p> <code>DEPRECATED</code>: The type has been deregistered and can no longer be used in CloudFormation operations. </p> </li> </ul></p>
2466    pub deprecated_status: Option<String>,
2467    /// <p>The description of the registered type.</p>
2468    pub description: Option<String>,
2469    /// <p>The URL of a page providing detailed documentation for this type.</p>
2470    pub documentation_url: Option<String>,
2471    /// <p>The Amazon Resource Name (ARN) of the IAM execution role used to register the type. If your resource type calls AWS APIs in any of its handlers, you must create an <i> <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html">IAM execution role</a> </i> that includes the necessary permissions to call those AWS APIs, and provision that execution role in your account. CloudFormation then assumes that execution role to provide your resource type with the appropriate credentials.</p>
2472    pub execution_role_arn: Option<String>,
2473    /// <p>Whether the specified type version is set as the default version.</p>
2474    pub is_default_version: Option<bool>,
2475    /// <p>When the specified type version was registered.</p>
2476    pub last_updated: Option<String>,
2477    /// <p>Contains logging configuration information for a type.</p>
2478    pub logging_config: Option<LoggingConfig>,
2479    /// <p><p>The provisioning behavior of the type. AWS CloudFormation determines the provisioning type during registration, based on the types of handlers in the schema handler package submitted.</p> <p>Valid values include:</p> <ul> <li> <p> <code>FULLY<em>MUTABLE</code>: The type includes an update handler to process updates to the type during stack update operations.</p> </li> <li> <p> <code>IMMUTABLE</code>: The type does not include an update handler, so the type cannot be updated and must instead be replaced during stack update operations.</p> </li> <li> <p> <code>NON</em>PROVISIONABLE</code>: The type does not include all of the following handlers, and therefore cannot actually be provisioned.</p> <ul> <li> <p>create</p> </li> <li> <p>read</p> </li> <li> <p>delete</p> </li> </ul> </li> </ul></p>
2480    pub provisioning_type: Option<String>,
2481    /// <p>The schema that defines the type.</p> <p>For more information on type schemas, see <a href="https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/resource-type-schema.html">Resource Provider Schema</a> in the <i>CloudFormation CLI User Guide</i>.</p>
2482    pub schema: Option<String>,
2483    /// <p>The URL of the source code for the type.</p>
2484    pub source_url: Option<String>,
2485    /// <p>When the specified type version was registered.</p>
2486    pub time_created: Option<String>,
2487    /// <p>The kind of type. </p> <p>Currently the only valid value is <code>RESOURCE</code>.</p>
2488    pub type_: Option<String>,
2489    /// <p>The name of the registered type.</p>
2490    pub type_name: Option<String>,
2491    /// <p><p>The scope at which the type is visible and usable in CloudFormation operations.</p> <p>Valid values include:</p> <ul> <li> <p> <code>PRIVATE</code>: The type is only visible and usable within the account in which it is registered. Currently, AWS CloudFormation marks any types you register as <code>PRIVATE</code>.</p> </li> <li> <p> <code>PUBLIC</code>: The type is publically visible and usable within any Amazon account.</p> </li> </ul></p>
2492    pub visibility: Option<String>,
2493}
2494
2495#[allow(dead_code)]
2496struct DescribeTypeOutputDeserializer;
2497impl DescribeTypeOutputDeserializer {
2498    #[allow(dead_code, unused_variables)]
2499    fn deserialize<T: Peek + Next>(
2500        tag_name: &str,
2501        stack: &mut T,
2502    ) -> Result<DescribeTypeOutput, XmlParseError> {
2503        deserialize_elements::<_, DescribeTypeOutput, _>(tag_name, stack, |name, stack, obj| {
2504            match name {
2505                "Arn" => {
2506                    obj.arn = Some(TypeArnDeserializer::deserialize("Arn", stack)?);
2507                }
2508                "DefaultVersionId" => {
2509                    obj.default_version_id = Some(TypeVersionIdDeserializer::deserialize(
2510                        "DefaultVersionId",
2511                        stack,
2512                    )?);
2513                }
2514                "DeprecatedStatus" => {
2515                    obj.deprecated_status = Some(DeprecatedStatusDeserializer::deserialize(
2516                        "DeprecatedStatus",
2517                        stack,
2518                    )?);
2519                }
2520                "Description" => {
2521                    obj.description =
2522                        Some(DescriptionDeserializer::deserialize("Description", stack)?);
2523                }
2524                "DocumentationUrl" => {
2525                    obj.documentation_url = Some(OptionalSecureUrlDeserializer::deserialize(
2526                        "DocumentationUrl",
2527                        stack,
2528                    )?);
2529                }
2530                "ExecutionRoleArn" => {
2531                    obj.execution_role_arn =
2532                        Some(RoleArnDeserializer::deserialize("ExecutionRoleArn", stack)?);
2533                }
2534                "IsDefaultVersion" => {
2535                    obj.is_default_version = Some(IsDefaultVersionDeserializer::deserialize(
2536                        "IsDefaultVersion",
2537                        stack,
2538                    )?);
2539                }
2540                "LastUpdated" => {
2541                    obj.last_updated =
2542                        Some(TimestampDeserializer::deserialize("LastUpdated", stack)?);
2543                }
2544                "LoggingConfig" => {
2545                    obj.logging_config = Some(LoggingConfigDeserializer::deserialize(
2546                        "LoggingConfig",
2547                        stack,
2548                    )?);
2549                }
2550                "ProvisioningType" => {
2551                    obj.provisioning_type = Some(ProvisioningTypeDeserializer::deserialize(
2552                        "ProvisioningType",
2553                        stack,
2554                    )?);
2555                }
2556                "Schema" => {
2557                    obj.schema = Some(TypeSchemaDeserializer::deserialize("Schema", stack)?);
2558                }
2559                "SourceUrl" => {
2560                    obj.source_url = Some(OptionalSecureUrlDeserializer::deserialize(
2561                        "SourceUrl",
2562                        stack,
2563                    )?);
2564                }
2565                "TimeCreated" => {
2566                    obj.time_created =
2567                        Some(TimestampDeserializer::deserialize("TimeCreated", stack)?);
2568                }
2569                "Type" => {
2570                    obj.type_ = Some(RegistryTypeDeserializer::deserialize("Type", stack)?);
2571                }
2572                "TypeName" => {
2573                    obj.type_name = Some(TypeNameDeserializer::deserialize("TypeName", stack)?);
2574                }
2575                "Visibility" => {
2576                    obj.visibility =
2577                        Some(VisibilityDeserializer::deserialize("Visibility", stack)?);
2578                }
2579                _ => skip_tree(stack),
2580            }
2581            Ok(())
2582        })
2583    }
2584}
2585#[derive(Clone, Debug, Default, PartialEq)]
2586#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
2587pub struct DescribeTypeRegistrationInput {
2588    /// <p>The identifier for this registration request.</p> <p>This registration token is generated by CloudFormation when you initiate a registration request using <code> <a>RegisterType</a> </code>.</p>
2589    pub registration_token: String,
2590}
2591
2592/// Serialize `DescribeTypeRegistrationInput` contents to a `SignedRequest`.
2593struct DescribeTypeRegistrationInputSerializer;
2594impl DescribeTypeRegistrationInputSerializer {
2595    fn serialize(params: &mut Params, name: &str, obj: &DescribeTypeRegistrationInput) {
2596        let mut prefix = name.to_string();
2597        if prefix != "" {
2598            prefix.push_str(".");
2599        }
2600
2601        params.put(
2602            &format!("{}{}", prefix, "RegistrationToken"),
2603            &obj.registration_token,
2604        );
2605    }
2606}
2607
2608#[derive(Clone, Debug, Default, PartialEq)]
2609#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
2610pub struct DescribeTypeRegistrationOutput {
2611    /// <p>The description of the type registration request.</p>
2612    pub description: Option<String>,
2613    /// <p>The current status of the type registration request.</p>
2614    pub progress_status: Option<String>,
2615    /// <p>The Amazon Resource Name (ARN) of the type being registered.</p> <p>For registration requests with a <code>ProgressStatus</code> of other than <code>COMPLETE</code>, this will be <code>null</code>.</p>
2616    pub type_arn: Option<String>,
2617    /// <p>The Amazon Resource Name (ARN) of this specific version of the type being registered.</p> <p>For registration requests with a <code>ProgressStatus</code> of other than <code>COMPLETE</code>, this will be <code>null</code>.</p>
2618    pub type_version_arn: Option<String>,
2619}
2620
2621#[allow(dead_code)]
2622struct DescribeTypeRegistrationOutputDeserializer;
2623impl DescribeTypeRegistrationOutputDeserializer {
2624    #[allow(dead_code, unused_variables)]
2625    fn deserialize<T: Peek + Next>(
2626        tag_name: &str,
2627        stack: &mut T,
2628    ) -> Result<DescribeTypeRegistrationOutput, XmlParseError> {
2629        deserialize_elements::<_, DescribeTypeRegistrationOutput, _>(
2630            tag_name,
2631            stack,
2632            |name, stack, obj| {
2633                match name {
2634                    "Description" => {
2635                        obj.description =
2636                            Some(DescriptionDeserializer::deserialize("Description", stack)?);
2637                    }
2638                    "ProgressStatus" => {
2639                        obj.progress_status = Some(RegistrationStatusDeserializer::deserialize(
2640                            "ProgressStatus",
2641                            stack,
2642                        )?);
2643                    }
2644                    "TypeArn" => {
2645                        obj.type_arn = Some(TypeArnDeserializer::deserialize("TypeArn", stack)?);
2646                    }
2647                    "TypeVersionArn" => {
2648                        obj.type_version_arn =
2649                            Some(TypeArnDeserializer::deserialize("TypeVersionArn", stack)?);
2650                    }
2651                    _ => skip_tree(stack),
2652                }
2653                Ok(())
2654            },
2655        )
2656    }
2657}
2658#[allow(dead_code)]
2659struct DescriptionDeserializer;
2660impl DescriptionDeserializer {
2661    #[allow(dead_code, unused_variables)]
2662    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
2663        xml_util::deserialize_primitive(tag_name, stack, Ok)
2664    }
2665}
2666#[derive(Clone, Debug, Default, PartialEq)]
2667#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
2668pub struct DetectStackDriftInput {
2669    /// <p>The logical names of any resources you want to use as filters.</p>
2670    pub logical_resource_ids: Option<Vec<String>>,
2671    /// <p>The name of the stack for which you want to detect drift. </p>
2672    pub stack_name: String,
2673}
2674
2675/// Serialize `DetectStackDriftInput` contents to a `SignedRequest`.
2676struct DetectStackDriftInputSerializer;
2677impl DetectStackDriftInputSerializer {
2678    fn serialize(params: &mut Params, name: &str, obj: &DetectStackDriftInput) {
2679        let mut prefix = name.to_string();
2680        if prefix != "" {
2681            prefix.push_str(".");
2682        }
2683
2684        if let Some(ref field_value) = obj.logical_resource_ids {
2685            LogicalResourceIdsSerializer::serialize(
2686                params,
2687                &format!("{}{}", prefix, "LogicalResourceIds"),
2688                field_value,
2689            );
2690        }
2691        params.put(&format!("{}{}", prefix, "StackName"), &obj.stack_name);
2692    }
2693}
2694
2695#[derive(Clone, Debug, Default, PartialEq)]
2696#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
2697pub struct DetectStackDriftOutput {
2698    /// <p>The ID of the drift detection results of this operation. </p> <p>AWS CloudFormation generates new results, with a new drift detection ID, each time this operation is run. However, the number of drift results AWS CloudFormation retains for any given stack, and for how long, may vary. </p>
2699    pub stack_drift_detection_id: String,
2700}
2701
2702#[allow(dead_code)]
2703struct DetectStackDriftOutputDeserializer;
2704impl DetectStackDriftOutputDeserializer {
2705    #[allow(dead_code, unused_variables)]
2706    fn deserialize<T: Peek + Next>(
2707        tag_name: &str,
2708        stack: &mut T,
2709    ) -> Result<DetectStackDriftOutput, XmlParseError> {
2710        deserialize_elements::<_, DetectStackDriftOutput, _>(tag_name, stack, |name, stack, obj| {
2711            match name {
2712                "StackDriftDetectionId" => {
2713                    obj.stack_drift_detection_id = StackDriftDetectionIdDeserializer::deserialize(
2714                        "StackDriftDetectionId",
2715                        stack,
2716                    )?;
2717                }
2718                _ => skip_tree(stack),
2719            }
2720            Ok(())
2721        })
2722    }
2723}
2724#[derive(Clone, Debug, Default, PartialEq)]
2725#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
2726pub struct DetectStackResourceDriftInput {
2727    /// <p>The logical name of the resource for which to return drift information.</p>
2728    pub logical_resource_id: String,
2729    /// <p>The name of the stack to which the resource belongs.</p>
2730    pub stack_name: String,
2731}
2732
2733/// Serialize `DetectStackResourceDriftInput` contents to a `SignedRequest`.
2734struct DetectStackResourceDriftInputSerializer;
2735impl DetectStackResourceDriftInputSerializer {
2736    fn serialize(params: &mut Params, name: &str, obj: &DetectStackResourceDriftInput) {
2737        let mut prefix = name.to_string();
2738        if prefix != "" {
2739            prefix.push_str(".");
2740        }
2741
2742        params.put(
2743            &format!("{}{}", prefix, "LogicalResourceId"),
2744            &obj.logical_resource_id,
2745        );
2746        params.put(&format!("{}{}", prefix, "StackName"), &obj.stack_name);
2747    }
2748}
2749
2750#[derive(Clone, Debug, Default, PartialEq)]
2751#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
2752pub struct DetectStackResourceDriftOutput {
2753    /// <p>Information about whether the resource's actual configuration has drifted from its expected template configuration, including actual and expected property values and any differences detected.</p>
2754    pub stack_resource_drift: StackResourceDrift,
2755}
2756
2757#[allow(dead_code)]
2758struct DetectStackResourceDriftOutputDeserializer;
2759impl DetectStackResourceDriftOutputDeserializer {
2760    #[allow(dead_code, unused_variables)]
2761    fn deserialize<T: Peek + Next>(
2762        tag_name: &str,
2763        stack: &mut T,
2764    ) -> Result<DetectStackResourceDriftOutput, XmlParseError> {
2765        deserialize_elements::<_, DetectStackResourceDriftOutput, _>(
2766            tag_name,
2767            stack,
2768            |name, stack, obj| {
2769                match name {
2770                    "StackResourceDrift" => {
2771                        obj.stack_resource_drift = StackResourceDriftDeserializer::deserialize(
2772                            "StackResourceDrift",
2773                            stack,
2774                        )?;
2775                    }
2776                    _ => skip_tree(stack),
2777                }
2778                Ok(())
2779            },
2780        )
2781    }
2782}
2783#[derive(Clone, Debug, Default, PartialEq)]
2784#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
2785pub struct DetectStackSetDriftInput {
2786    /// <p> <i>The ID of the stack set operation.</i> </p>
2787    pub operation_id: Option<String>,
2788    pub operation_preferences: Option<StackSetOperationPreferences>,
2789    /// <p>The name of the stack set on which to perform the drift detection operation.</p>
2790    pub stack_set_name: String,
2791}
2792
2793/// Serialize `DetectStackSetDriftInput` contents to a `SignedRequest`.
2794struct DetectStackSetDriftInputSerializer;
2795impl DetectStackSetDriftInputSerializer {
2796    fn serialize(params: &mut Params, name: &str, obj: &DetectStackSetDriftInput) {
2797        let mut prefix = name.to_string();
2798        if prefix != "" {
2799            prefix.push_str(".");
2800        }
2801
2802        if let Some(ref field_value) = obj.operation_id {
2803            params.put(&format!("{}{}", prefix, "OperationId"), &field_value);
2804        }
2805        if let Some(ref field_value) = obj.operation_preferences {
2806            StackSetOperationPreferencesSerializer::serialize(
2807                params,
2808                &format!("{}{}", prefix, "OperationPreferences"),
2809                field_value,
2810            );
2811        }
2812        params.put(
2813            &format!("{}{}", prefix, "StackSetName"),
2814            &obj.stack_set_name,
2815        );
2816    }
2817}
2818
2819#[derive(Clone, Debug, Default, PartialEq)]
2820#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
2821pub struct DetectStackSetDriftOutput {
2822    /// <p>The ID of the drift detection stack set operation. </p> <p>you can use this operation id with <code> <a>DescribeStackSetOperation</a> </code> to monitor the progress of the drift detection operation. </p>
2823    pub operation_id: Option<String>,
2824}
2825
2826#[allow(dead_code)]
2827struct DetectStackSetDriftOutputDeserializer;
2828impl DetectStackSetDriftOutputDeserializer {
2829    #[allow(dead_code, unused_variables)]
2830    fn deserialize<T: Peek + Next>(
2831        tag_name: &str,
2832        stack: &mut T,
2833    ) -> Result<DetectStackSetDriftOutput, XmlParseError> {
2834        deserialize_elements::<_, DetectStackSetDriftOutput, _>(
2835            tag_name,
2836            stack,
2837            |name, stack, obj| {
2838                match name {
2839                    "OperationId" => {
2840                        obj.operation_id = Some(ClientRequestTokenDeserializer::deserialize(
2841                            "OperationId",
2842                            stack,
2843                        )?);
2844                    }
2845                    _ => skip_tree(stack),
2846                }
2847                Ok(())
2848            },
2849        )
2850    }
2851}
2852#[allow(dead_code)]
2853struct DifferenceTypeDeserializer;
2854impl DifferenceTypeDeserializer {
2855    #[allow(dead_code, unused_variables)]
2856    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
2857        xml_util::deserialize_primitive(tag_name, stack, Ok)
2858    }
2859}
2860#[allow(dead_code)]
2861struct DisableRollbackDeserializer;
2862impl DisableRollbackDeserializer {
2863    #[allow(dead_code, unused_variables)]
2864    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<bool, XmlParseError> {
2865        xml_util::deserialize_primitive(tag_name, stack, |s| Ok(bool::from_str(&s).unwrap()))
2866    }
2867}
2868#[allow(dead_code)]
2869struct DriftedStackInstancesCountDeserializer;
2870impl DriftedStackInstancesCountDeserializer {
2871    #[allow(dead_code, unused_variables)]
2872    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<i64, XmlParseError> {
2873        xml_util::deserialize_primitive(tag_name, stack, |s| Ok(i64::from_str(&s).unwrap()))
2874    }
2875}
2876#[allow(dead_code)]
2877struct EnableTerminationProtectionDeserializer;
2878impl EnableTerminationProtectionDeserializer {
2879    #[allow(dead_code, unused_variables)]
2880    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<bool, XmlParseError> {
2881        xml_util::deserialize_primitive(tag_name, stack, |s| Ok(bool::from_str(&s).unwrap()))
2882    }
2883}
2884/// <p>The input for an <a>EstimateTemplateCost</a> action.</p>
2885#[derive(Clone, Debug, Default, PartialEq)]
2886#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
2887pub struct EstimateTemplateCostInput {
2888    /// <p>A list of <code>Parameter</code> structures that specify input parameters.</p>
2889    pub parameters: Option<Vec<Parameter>>,
2890    /// <p>Structure containing the template body with a minimum length of 1 byte and a maximum length of 51,200 bytes. (For more information, go to <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html">Template Anatomy</a> in the AWS CloudFormation User Guide.)</p> <p>Conditional: You must pass <code>TemplateBody</code> or <code>TemplateURL</code>. If both are passed, only <code>TemplateBody</code> is used.</p>
2891    pub template_body: Option<String>,
2892    /// <p>Location of file containing the template body. The URL must point to a template that is located in an Amazon S3 bucket. For more information, go to <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html">Template Anatomy</a> in the AWS CloudFormation User Guide.</p> <p>Conditional: You must pass <code>TemplateURL</code> or <code>TemplateBody</code>. If both are passed, only <code>TemplateBody</code> is used.</p>
2893    pub template_url: Option<String>,
2894}
2895
2896/// Serialize `EstimateTemplateCostInput` contents to a `SignedRequest`.
2897struct EstimateTemplateCostInputSerializer;
2898impl EstimateTemplateCostInputSerializer {
2899    fn serialize(params: &mut Params, name: &str, obj: &EstimateTemplateCostInput) {
2900        let mut prefix = name.to_string();
2901        if prefix != "" {
2902            prefix.push_str(".");
2903        }
2904
2905        if let Some(ref field_value) = obj.parameters {
2906            ParametersSerializer::serialize(
2907                params,
2908                &format!("{}{}", prefix, "Parameters"),
2909                field_value,
2910            );
2911        }
2912        if let Some(ref field_value) = obj.template_body {
2913            params.put(&format!("{}{}", prefix, "TemplateBody"), &field_value);
2914        }
2915        if let Some(ref field_value) = obj.template_url {
2916            params.put(&format!("{}{}", prefix, "TemplateURL"), &field_value);
2917        }
2918    }
2919}
2920
2921/// <p>The output for a <a>EstimateTemplateCost</a> action.</p>
2922#[derive(Clone, Debug, Default, PartialEq)]
2923#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
2924pub struct EstimateTemplateCostOutput {
2925    /// <p>An AWS Simple Monthly Calculator URL with a query string that describes the resources required to run the template.</p>
2926    pub url: Option<String>,
2927}
2928
2929#[allow(dead_code)]
2930struct EstimateTemplateCostOutputDeserializer;
2931impl EstimateTemplateCostOutputDeserializer {
2932    #[allow(dead_code, unused_variables)]
2933    fn deserialize<T: Peek + Next>(
2934        tag_name: &str,
2935        stack: &mut T,
2936    ) -> Result<EstimateTemplateCostOutput, XmlParseError> {
2937        deserialize_elements::<_, EstimateTemplateCostOutput, _>(
2938            tag_name,
2939            stack,
2940            |name, stack, obj| {
2941                match name {
2942                    "Url" => {
2943                        obj.url = Some(UrlDeserializer::deserialize("Url", stack)?);
2944                    }
2945                    _ => skip_tree(stack),
2946                }
2947                Ok(())
2948            },
2949        )
2950    }
2951}
2952#[allow(dead_code)]
2953struct EvaluationTypeDeserializer;
2954impl EvaluationTypeDeserializer {
2955    #[allow(dead_code, unused_variables)]
2956    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
2957        xml_util::deserialize_primitive(tag_name, stack, Ok)
2958    }
2959}
2960#[allow(dead_code)]
2961struct EventIdDeserializer;
2962impl EventIdDeserializer {
2963    #[allow(dead_code, unused_variables)]
2964    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
2965        xml_util::deserialize_primitive(tag_name, stack, Ok)
2966    }
2967}
2968/// <p>The input for the <a>ExecuteChangeSet</a> action.</p>
2969#[derive(Clone, Debug, Default, PartialEq)]
2970#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
2971pub struct ExecuteChangeSetInput {
2972    /// <p>The name or ARN of the change set that you want use to update the specified stack.</p>
2973    pub change_set_name: String,
2974    /// <p>A unique identifier for this <code>ExecuteChangeSet</code> request. Specify this token if you plan to retry requests so that AWS CloudFormation knows that you're not attempting to execute a change set to update a stack with the same name. You might retry <code>ExecuteChangeSet</code> requests to ensure that AWS CloudFormation successfully received them.</p>
2975    pub client_request_token: Option<String>,
2976    /// <p>If you specified the name of a change set, specify the stack name or ID (ARN) that is associated with the change set you want to execute.</p>
2977    pub stack_name: Option<String>,
2978}
2979
2980/// Serialize `ExecuteChangeSetInput` contents to a `SignedRequest`.
2981struct ExecuteChangeSetInputSerializer;
2982impl ExecuteChangeSetInputSerializer {
2983    fn serialize(params: &mut Params, name: &str, obj: &ExecuteChangeSetInput) {
2984        let mut prefix = name.to_string();
2985        if prefix != "" {
2986            prefix.push_str(".");
2987        }
2988
2989        params.put(
2990            &format!("{}{}", prefix, "ChangeSetName"),
2991            &obj.change_set_name,
2992        );
2993        if let Some(ref field_value) = obj.client_request_token {
2994            params.put(&format!("{}{}", prefix, "ClientRequestToken"), &field_value);
2995        }
2996        if let Some(ref field_value) = obj.stack_name {
2997            params.put(&format!("{}{}", prefix, "StackName"), &field_value);
2998        }
2999    }
3000}
3001
3002/// <p>The output for the <a>ExecuteChangeSet</a> action.</p>
3003#[derive(Clone, Debug, Default, PartialEq)]
3004#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
3005pub struct ExecuteChangeSetOutput {}
3006
3007#[allow(dead_code)]
3008struct ExecuteChangeSetOutputDeserializer;
3009impl ExecuteChangeSetOutputDeserializer {
3010    #[allow(dead_code, unused_variables)]
3011    fn deserialize<T: Peek + Next>(
3012        tag_name: &str,
3013        stack: &mut T,
3014    ) -> Result<ExecuteChangeSetOutput, XmlParseError> {
3015        xml_util::start_element(tag_name, stack)?;
3016
3017        let obj = ExecuteChangeSetOutput::default();
3018
3019        xml_util::end_element(tag_name, stack)?;
3020
3021        Ok(obj)
3022    }
3023}
3024#[allow(dead_code)]
3025struct ExecutionRoleNameDeserializer;
3026impl ExecutionRoleNameDeserializer {
3027    #[allow(dead_code, unused_variables)]
3028    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
3029        xml_util::deserialize_primitive(tag_name, stack, Ok)
3030    }
3031}
3032#[allow(dead_code)]
3033struct ExecutionStatusDeserializer;
3034impl ExecutionStatusDeserializer {
3035    #[allow(dead_code, unused_variables)]
3036    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
3037        xml_util::deserialize_primitive(tag_name, stack, Ok)
3038    }
3039}
3040/// <p>The <code>Export</code> structure describes the exported output values for a stack.</p>
3041#[derive(Clone, Debug, Default, PartialEq)]
3042#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
3043pub struct Export {
3044    /// <p>The stack that contains the exported output name and value.</p>
3045    pub exporting_stack_id: Option<String>,
3046    /// <p>The name of exported output value. Use this name and the <code>Fn::ImportValue</code> function to import the associated value into other stacks. The name is defined in the <code>Export</code> field in the associated stack's <code>Outputs</code> section.</p>
3047    pub name: Option<String>,
3048    /// <p>The value of the exported output, such as a resource physical ID. This value is defined in the <code>Export</code> field in the associated stack's <code>Outputs</code> section.</p>
3049    pub value: Option<String>,
3050}
3051
3052#[allow(dead_code)]
3053struct ExportDeserializer;
3054impl ExportDeserializer {
3055    #[allow(dead_code, unused_variables)]
3056    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<Export, XmlParseError> {
3057        deserialize_elements::<_, Export, _>(tag_name, stack, |name, stack, obj| {
3058            match name {
3059                "ExportingStackId" => {
3060                    obj.exporting_stack_id =
3061                        Some(StackIdDeserializer::deserialize("ExportingStackId", stack)?);
3062                }
3063                "Name" => {
3064                    obj.name = Some(ExportNameDeserializer::deserialize("Name", stack)?);
3065                }
3066                "Value" => {
3067                    obj.value = Some(ExportValueDeserializer::deserialize("Value", stack)?);
3068                }
3069                _ => skip_tree(stack),
3070            }
3071            Ok(())
3072        })
3073    }
3074}
3075#[allow(dead_code)]
3076struct ExportNameDeserializer;
3077impl ExportNameDeserializer {
3078    #[allow(dead_code, unused_variables)]
3079    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
3080        xml_util::deserialize_primitive(tag_name, stack, Ok)
3081    }
3082}
3083#[allow(dead_code)]
3084struct ExportValueDeserializer;
3085impl ExportValueDeserializer {
3086    #[allow(dead_code, unused_variables)]
3087    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
3088        xml_util::deserialize_primitive(tag_name, stack, Ok)
3089    }
3090}
3091#[allow(dead_code)]
3092struct ExportsDeserializer;
3093impl ExportsDeserializer {
3094    #[allow(dead_code, unused_variables)]
3095    fn deserialize<T: Peek + Next>(
3096        tag_name: &str,
3097        stack: &mut T,
3098    ) -> Result<Vec<Export>, XmlParseError> {
3099        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
3100            if name == "member" {
3101                obj.push(ExportDeserializer::deserialize("member", stack)?);
3102            } else {
3103                skip_tree(stack);
3104            }
3105            Ok(())
3106        })
3107    }
3108}
3109#[allow(dead_code)]
3110struct FailedStackInstancesCountDeserializer;
3111impl FailedStackInstancesCountDeserializer {
3112    #[allow(dead_code, unused_variables)]
3113    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<i64, XmlParseError> {
3114        xml_util::deserialize_primitive(tag_name, stack, |s| Ok(i64::from_str(&s).unwrap()))
3115    }
3116}
3117#[allow(dead_code)]
3118struct FailureToleranceCountDeserializer;
3119impl FailureToleranceCountDeserializer {
3120    #[allow(dead_code, unused_variables)]
3121    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<i64, XmlParseError> {
3122        xml_util::deserialize_primitive(tag_name, stack, |s| Ok(i64::from_str(&s).unwrap()))
3123    }
3124}
3125#[allow(dead_code)]
3126struct FailureTolerancePercentageDeserializer;
3127impl FailureTolerancePercentageDeserializer {
3128    #[allow(dead_code, unused_variables)]
3129    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<i64, XmlParseError> {
3130        xml_util::deserialize_primitive(tag_name, stack, |s| Ok(i64::from_str(&s).unwrap()))
3131    }
3132}
3133/// <p>The input for the <a>GetStackPolicy</a> action.</p>
3134#[derive(Clone, Debug, Default, PartialEq)]
3135#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
3136pub struct GetStackPolicyInput {
3137    /// <p>The name or unique stack ID that is associated with the stack whose policy you want to get.</p>
3138    pub stack_name: String,
3139}
3140
3141/// Serialize `GetStackPolicyInput` contents to a `SignedRequest`.
3142struct GetStackPolicyInputSerializer;
3143impl GetStackPolicyInputSerializer {
3144    fn serialize(params: &mut Params, name: &str, obj: &GetStackPolicyInput) {
3145        let mut prefix = name.to_string();
3146        if prefix != "" {
3147            prefix.push_str(".");
3148        }
3149
3150        params.put(&format!("{}{}", prefix, "StackName"), &obj.stack_name);
3151    }
3152}
3153
3154/// <p>The output for the <a>GetStackPolicy</a> action.</p>
3155#[derive(Clone, Debug, Default, PartialEq)]
3156#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
3157pub struct GetStackPolicyOutput {
3158    /// <p>Structure containing the stack policy body. (For more information, go to <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html"> Prevent Updates to Stack Resources</a> in the AWS CloudFormation User Guide.)</p>
3159    pub stack_policy_body: Option<String>,
3160}
3161
3162#[allow(dead_code)]
3163struct GetStackPolicyOutputDeserializer;
3164impl GetStackPolicyOutputDeserializer {
3165    #[allow(dead_code, unused_variables)]
3166    fn deserialize<T: Peek + Next>(
3167        tag_name: &str,
3168        stack: &mut T,
3169    ) -> Result<GetStackPolicyOutput, XmlParseError> {
3170        deserialize_elements::<_, GetStackPolicyOutput, _>(tag_name, stack, |name, stack, obj| {
3171            match name {
3172                "StackPolicyBody" => {
3173                    obj.stack_policy_body = Some(StackPolicyBodyDeserializer::deserialize(
3174                        "StackPolicyBody",
3175                        stack,
3176                    )?);
3177                }
3178                _ => skip_tree(stack),
3179            }
3180            Ok(())
3181        })
3182    }
3183}
3184/// <p>The input for a <a>GetTemplate</a> action.</p>
3185#[derive(Clone, Debug, Default, PartialEq)]
3186#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
3187pub struct GetTemplateInput {
3188    /// <p>The name or Amazon Resource Name (ARN) of a change set for which AWS CloudFormation returns the associated template. If you specify a name, you must also specify the <code>StackName</code>.</p>
3189    pub change_set_name: Option<String>,
3190    /// <p>The name or the unique stack ID that is associated with the stack, which are not always interchangeable:</p> <ul> <li> <p>Running stacks: You can specify either the stack's name or its unique stack ID.</p> </li> <li> <p>Deleted stacks: You must specify the unique stack ID.</p> </li> </ul> <p>Default: There is no default value.</p>
3191    pub stack_name: Option<String>,
3192    /// <p>For templates that include transforms, the stage of the template that AWS CloudFormation returns. To get the user-submitted template, specify <code>Original</code>. To get the template after AWS CloudFormation has processed all transforms, specify <code>Processed</code>. </p> <p>If the template doesn't include transforms, <code>Original</code> and <code>Processed</code> return the same template. By default, AWS CloudFormation specifies <code>Original</code>. </p>
3193    pub template_stage: Option<String>,
3194}
3195
3196/// Serialize `GetTemplateInput` contents to a `SignedRequest`.
3197struct GetTemplateInputSerializer;
3198impl GetTemplateInputSerializer {
3199    fn serialize(params: &mut Params, name: &str, obj: &GetTemplateInput) {
3200        let mut prefix = name.to_string();
3201        if prefix != "" {
3202            prefix.push_str(".");
3203        }
3204
3205        if let Some(ref field_value) = obj.change_set_name {
3206            params.put(&format!("{}{}", prefix, "ChangeSetName"), &field_value);
3207        }
3208        if let Some(ref field_value) = obj.stack_name {
3209            params.put(&format!("{}{}", prefix, "StackName"), &field_value);
3210        }
3211        if let Some(ref field_value) = obj.template_stage {
3212            params.put(&format!("{}{}", prefix, "TemplateStage"), &field_value);
3213        }
3214    }
3215}
3216
3217/// <p>The output for <a>GetTemplate</a> action.</p>
3218#[derive(Clone, Debug, Default, PartialEq)]
3219#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
3220pub struct GetTemplateOutput {
3221    /// <p>The stage of the template that you can retrieve. For stacks, the <code>Original</code> and <code>Processed</code> templates are always available. For change sets, the <code>Original</code> template is always available. After AWS CloudFormation finishes creating the change set, the <code>Processed</code> template becomes available.</p>
3222    pub stages_available: Option<Vec<String>>,
3223    /// <p>Structure containing the template body. (For more information, go to <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html">Template Anatomy</a> in the AWS CloudFormation User Guide.)</p> <p>AWS CloudFormation returns the same template that was used when the stack was created.</p>
3224    pub template_body: Option<String>,
3225}
3226
3227#[allow(dead_code)]
3228struct GetTemplateOutputDeserializer;
3229impl GetTemplateOutputDeserializer {
3230    #[allow(dead_code, unused_variables)]
3231    fn deserialize<T: Peek + Next>(
3232        tag_name: &str,
3233        stack: &mut T,
3234    ) -> Result<GetTemplateOutput, XmlParseError> {
3235        deserialize_elements::<_, GetTemplateOutput, _>(tag_name, stack, |name, stack, obj| {
3236            match name {
3237                "StagesAvailable" => {
3238                    obj.stages_available.get_or_insert(vec![]).extend(
3239                        StageListDeserializer::deserialize("StagesAvailable", stack)?,
3240                    );
3241                }
3242                "TemplateBody" => {
3243                    obj.template_body = Some(TemplateBodyDeserializer::deserialize(
3244                        "TemplateBody",
3245                        stack,
3246                    )?);
3247                }
3248                _ => skip_tree(stack),
3249            }
3250            Ok(())
3251        })
3252    }
3253}
3254/// <p>The input for the <a>GetTemplateSummary</a> action.</p>
3255#[derive(Clone, Debug, Default, PartialEq)]
3256#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
3257pub struct GetTemplateSummaryInput {
3258    /// <p>The name or the stack ID that is associated with the stack, which are not always interchangeable. For running stacks, you can specify either the stack's name or its unique stack ID. For deleted stack, you must specify the unique stack ID.</p> <p>Conditional: You must specify only one of the following parameters: <code>StackName</code>, <code>StackSetName</code>, <code>TemplateBody</code>, or <code>TemplateURL</code>.</p>
3259    pub stack_name: Option<String>,
3260    /// <p>The name or unique ID of the stack set from which the stack was created.</p> <p>Conditional: You must specify only one of the following parameters: <code>StackName</code>, <code>StackSetName</code>, <code>TemplateBody</code>, or <code>TemplateURL</code>.</p>
3261    pub stack_set_name: Option<String>,
3262    /// <p>Structure containing the template body with a minimum length of 1 byte and a maximum length of 51,200 bytes. For more information about templates, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html">Template Anatomy</a> in the AWS CloudFormation User Guide.</p> <p>Conditional: You must specify only one of the following parameters: <code>StackName</code>, <code>StackSetName</code>, <code>TemplateBody</code>, or <code>TemplateURL</code>.</p>
3263    pub template_body: Option<String>,
3264    /// <p>Location of file containing the template body. The URL must point to a template (max size: 460,800 bytes) that is located in an Amazon S3 bucket. For more information about templates, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html">Template Anatomy</a> in the AWS CloudFormation User Guide.</p> <p>Conditional: You must specify only one of the following parameters: <code>StackName</code>, <code>StackSetName</code>, <code>TemplateBody</code>, or <code>TemplateURL</code>.</p>
3265    pub template_url: Option<String>,
3266}
3267
3268/// Serialize `GetTemplateSummaryInput` contents to a `SignedRequest`.
3269struct GetTemplateSummaryInputSerializer;
3270impl GetTemplateSummaryInputSerializer {
3271    fn serialize(params: &mut Params, name: &str, obj: &GetTemplateSummaryInput) {
3272        let mut prefix = name.to_string();
3273        if prefix != "" {
3274            prefix.push_str(".");
3275        }
3276
3277        if let Some(ref field_value) = obj.stack_name {
3278            params.put(&format!("{}{}", prefix, "StackName"), &field_value);
3279        }
3280        if let Some(ref field_value) = obj.stack_set_name {
3281            params.put(&format!("{}{}", prefix, "StackSetName"), &field_value);
3282        }
3283        if let Some(ref field_value) = obj.template_body {
3284            params.put(&format!("{}{}", prefix, "TemplateBody"), &field_value);
3285        }
3286        if let Some(ref field_value) = obj.template_url {
3287            params.put(&format!("{}{}", prefix, "TemplateURL"), &field_value);
3288        }
3289    }
3290}
3291
3292/// <p>The output for the <a>GetTemplateSummary</a> action.</p>
3293#[derive(Clone, Debug, Default, PartialEq)]
3294#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
3295pub struct GetTemplateSummaryOutput {
3296    /// <p>The capabilities found within the template. If your template contains IAM resources, you must specify the CAPABILITY_IAM or CAPABILITY_NAMED_IAM value for this parameter when you use the <a>CreateStack</a> or <a>UpdateStack</a> actions with your template; otherwise, those actions return an InsufficientCapabilities error.</p> <p>For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html#capabilities">Acknowledging IAM Resources in AWS CloudFormation Templates</a>.</p>
3297    pub capabilities: Option<Vec<String>>,
3298    /// <p>The list of resources that generated the values in the <code>Capabilities</code> response element.</p>
3299    pub capabilities_reason: Option<String>,
3300    /// <p>A list of the transforms that are declared in the template.</p>
3301    pub declared_transforms: Option<Vec<String>>,
3302    /// <p>The value that is defined in the <code>Description</code> property of the template.</p>
3303    pub description: Option<String>,
3304    /// <p>The value that is defined for the <code>Metadata</code> property of the template.</p>
3305    pub metadata: Option<String>,
3306    /// <p>A list of parameter declarations that describe various properties for each parameter.</p>
3307    pub parameters: Option<Vec<ParameterDeclaration>>,
3308    /// <p>A list of resource identifier summaries that describe the target resources of an import operation and the properties you can provide during the import to identify the target resources. For example, <code>BucketName</code> is a possible identifier property for an <code>AWS::S3::Bucket</code> resource. </p>
3309    pub resource_identifier_summaries: Option<Vec<ResourceIdentifierSummary>>,
3310    /// <p>A list of all the template resource types that are defined in the template, such as <code>AWS::EC2::Instance</code>, <code>AWS::Dynamo::Table</code>, and <code>Custom::MyCustomInstance</code>.</p>
3311    pub resource_types: Option<Vec<String>>,
3312    /// <p>The AWS template format version, which identifies the capabilities of the template.</p>
3313    pub version: Option<String>,
3314}
3315
3316#[allow(dead_code)]
3317struct GetTemplateSummaryOutputDeserializer;
3318impl GetTemplateSummaryOutputDeserializer {
3319    #[allow(dead_code, unused_variables)]
3320    fn deserialize<T: Peek + Next>(
3321        tag_name: &str,
3322        stack: &mut T,
3323    ) -> Result<GetTemplateSummaryOutput, XmlParseError> {
3324        deserialize_elements::<_, GetTemplateSummaryOutput, _>(
3325            tag_name,
3326            stack,
3327            |name, stack, obj| {
3328                match name {
3329                    "Capabilities" => {
3330                        obj.capabilities.get_or_insert(vec![]).extend(
3331                            CapabilitiesDeserializer::deserialize("Capabilities", stack)?,
3332                        );
3333                    }
3334                    "CapabilitiesReason" => {
3335                        obj.capabilities_reason =
3336                            Some(CapabilitiesReasonDeserializer::deserialize(
3337                                "CapabilitiesReason",
3338                                stack,
3339                            )?);
3340                    }
3341                    "DeclaredTransforms" => {
3342                        obj.declared_transforms.get_or_insert(vec![]).extend(
3343                            TransformsListDeserializer::deserialize("DeclaredTransforms", stack)?,
3344                        );
3345                    }
3346                    "Description" => {
3347                        obj.description =
3348                            Some(DescriptionDeserializer::deserialize("Description", stack)?);
3349                    }
3350                    "Metadata" => {
3351                        obj.metadata = Some(MetadataDeserializer::deserialize("Metadata", stack)?);
3352                    }
3353                    "Parameters" => {
3354                        obj.parameters.get_or_insert(vec![]).extend(
3355                            ParameterDeclarationsDeserializer::deserialize("Parameters", stack)?,
3356                        );
3357                    }
3358                    "ResourceIdentifierSummaries" => {
3359                        obj.resource_identifier_summaries
3360                            .get_or_insert(vec![])
3361                            .extend(ResourceIdentifierSummariesDeserializer::deserialize(
3362                                "ResourceIdentifierSummaries",
3363                                stack,
3364                            )?);
3365                    }
3366                    "ResourceTypes" => {
3367                        obj.resource_types.get_or_insert(vec![]).extend(
3368                            ResourceTypesDeserializer::deserialize("ResourceTypes", stack)?,
3369                        );
3370                    }
3371                    "Version" => {
3372                        obj.version = Some(VersionDeserializer::deserialize("Version", stack)?);
3373                    }
3374                    _ => skip_tree(stack),
3375                }
3376                Ok(())
3377            },
3378        )
3379    }
3380}
3381#[allow(dead_code)]
3382struct ImportsDeserializer;
3383impl ImportsDeserializer {
3384    #[allow(dead_code, unused_variables)]
3385    fn deserialize<T: Peek + Next>(
3386        tag_name: &str,
3387        stack: &mut T,
3388    ) -> Result<Vec<String>, XmlParseError> {
3389        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
3390            if name == "member" {
3391                obj.push(StackNameDeserializer::deserialize("member", stack)?);
3392            } else {
3393                skip_tree(stack);
3394            }
3395            Ok(())
3396        })
3397    }
3398}
3399#[allow(dead_code)]
3400struct InProgressStackInstancesCountDeserializer;
3401impl InProgressStackInstancesCountDeserializer {
3402    #[allow(dead_code, unused_variables)]
3403    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<i64, XmlParseError> {
3404        xml_util::deserialize_primitive(tag_name, stack, |s| Ok(i64::from_str(&s).unwrap()))
3405    }
3406}
3407#[allow(dead_code)]
3408struct InSyncStackInstancesCountDeserializer;
3409impl InSyncStackInstancesCountDeserializer {
3410    #[allow(dead_code, unused_variables)]
3411    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<i64, XmlParseError> {
3412        xml_util::deserialize_primitive(tag_name, stack, |s| Ok(i64::from_str(&s).unwrap()))
3413    }
3414}
3415#[allow(dead_code)]
3416struct IsDefaultVersionDeserializer;
3417impl IsDefaultVersionDeserializer {
3418    #[allow(dead_code, unused_variables)]
3419    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<bool, XmlParseError> {
3420        xml_util::deserialize_primitive(tag_name, stack, |s| Ok(bool::from_str(&s).unwrap()))
3421    }
3422}
3423#[allow(dead_code)]
3424struct KeyDeserializer;
3425impl KeyDeserializer {
3426    #[allow(dead_code, unused_variables)]
3427    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
3428        xml_util::deserialize_primitive(tag_name, stack, Ok)
3429    }
3430}
3431#[allow(dead_code)]
3432struct LastUpdatedTimeDeserializer;
3433impl LastUpdatedTimeDeserializer {
3434    #[allow(dead_code, unused_variables)]
3435    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
3436        xml_util::deserialize_primitive(tag_name, stack, Ok)
3437    }
3438}
3439#[allow(dead_code)]
3440struct LimitNameDeserializer;
3441impl LimitNameDeserializer {
3442    #[allow(dead_code, unused_variables)]
3443    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
3444        xml_util::deserialize_primitive(tag_name, stack, Ok)
3445    }
3446}
3447#[allow(dead_code)]
3448struct LimitValueDeserializer;
3449impl LimitValueDeserializer {
3450    #[allow(dead_code, unused_variables)]
3451    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<i64, XmlParseError> {
3452        xml_util::deserialize_primitive(tag_name, stack, |s| Ok(i64::from_str(&s).unwrap()))
3453    }
3454}
3455/// <p>The input for the <a>ListChangeSets</a> action.</p>
3456#[derive(Clone, Debug, Default, PartialEq)]
3457#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
3458pub struct ListChangeSetsInput {
3459    /// <p>A string (provided by the <a>ListChangeSets</a> response output) that identifies the next page of change sets that you want to retrieve.</p>
3460    pub next_token: Option<String>,
3461    /// <p>The name or the Amazon Resource Name (ARN) of the stack for which you want to list change sets.</p>
3462    pub stack_name: String,
3463}
3464
3465/// Serialize `ListChangeSetsInput` contents to a `SignedRequest`.
3466struct ListChangeSetsInputSerializer;
3467impl ListChangeSetsInputSerializer {
3468    fn serialize(params: &mut Params, name: &str, obj: &ListChangeSetsInput) {
3469        let mut prefix = name.to_string();
3470        if prefix != "" {
3471            prefix.push_str(".");
3472        }
3473
3474        if let Some(ref field_value) = obj.next_token {
3475            params.put(&format!("{}{}", prefix, "NextToken"), &field_value);
3476        }
3477        params.put(&format!("{}{}", prefix, "StackName"), &obj.stack_name);
3478    }
3479}
3480
3481/// <p>The output for the <a>ListChangeSets</a> action.</p>
3482#[derive(Clone, Debug, Default, PartialEq)]
3483#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
3484pub struct ListChangeSetsOutput {
3485    /// <p>If the output exceeds 1 MB, a string that identifies the next page of change sets. If there is no additional page, this value is null.</p>
3486    pub next_token: Option<String>,
3487    /// <p>A list of <code>ChangeSetSummary</code> structures that provides the ID and status of each change set for the specified stack.</p>
3488    pub summaries: Option<Vec<ChangeSetSummary>>,
3489}
3490
3491#[allow(dead_code)]
3492struct ListChangeSetsOutputDeserializer;
3493impl ListChangeSetsOutputDeserializer {
3494    #[allow(dead_code, unused_variables)]
3495    fn deserialize<T: Peek + Next>(
3496        tag_name: &str,
3497        stack: &mut T,
3498    ) -> Result<ListChangeSetsOutput, XmlParseError> {
3499        deserialize_elements::<_, ListChangeSetsOutput, _>(tag_name, stack, |name, stack, obj| {
3500            match name {
3501                "NextToken" => {
3502                    obj.next_token = Some(NextTokenDeserializer::deserialize("NextToken", stack)?);
3503                }
3504                "Summaries" => {
3505                    obj.summaries.get_or_insert(vec![]).extend(
3506                        ChangeSetSummariesDeserializer::deserialize("Summaries", stack)?,
3507                    );
3508                }
3509                _ => skip_tree(stack),
3510            }
3511            Ok(())
3512        })
3513    }
3514}
3515#[derive(Clone, Debug, Default, PartialEq)]
3516#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
3517pub struct ListExportsInput {
3518    /// <p>A string (provided by the <a>ListExports</a> response output) that identifies the next page of exported output values that you asked to retrieve.</p>
3519    pub next_token: Option<String>,
3520}
3521
3522/// Serialize `ListExportsInput` contents to a `SignedRequest`.
3523struct ListExportsInputSerializer;
3524impl ListExportsInputSerializer {
3525    fn serialize(params: &mut Params, name: &str, obj: &ListExportsInput) {
3526        let mut prefix = name.to_string();
3527        if prefix != "" {
3528            prefix.push_str(".");
3529        }
3530
3531        if let Some(ref field_value) = obj.next_token {
3532            params.put(&format!("{}{}", prefix, "NextToken"), &field_value);
3533        }
3534    }
3535}
3536
3537#[derive(Clone, Debug, Default, PartialEq)]
3538#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
3539pub struct ListExportsOutput {
3540    /// <p>The output for the <a>ListExports</a> action.</p>
3541    pub exports: Option<Vec<Export>>,
3542    /// <p>If the output exceeds 100 exported output values, a string that identifies the next page of exports. If there is no additional page, this value is null.</p>
3543    pub next_token: Option<String>,
3544}
3545
3546#[allow(dead_code)]
3547struct ListExportsOutputDeserializer;
3548impl ListExportsOutputDeserializer {
3549    #[allow(dead_code, unused_variables)]
3550    fn deserialize<T: Peek + Next>(
3551        tag_name: &str,
3552        stack: &mut T,
3553    ) -> Result<ListExportsOutput, XmlParseError> {
3554        deserialize_elements::<_, ListExportsOutput, _>(tag_name, stack, |name, stack, obj| {
3555            match name {
3556                "Exports" => {
3557                    obj.exports
3558                        .get_or_insert(vec![])
3559                        .extend(ExportsDeserializer::deserialize("Exports", stack)?);
3560                }
3561                "NextToken" => {
3562                    obj.next_token = Some(NextTokenDeserializer::deserialize("NextToken", stack)?);
3563                }
3564                _ => skip_tree(stack),
3565            }
3566            Ok(())
3567        })
3568    }
3569}
3570#[derive(Clone, Debug, Default, PartialEq)]
3571#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
3572pub struct ListImportsInput {
3573    /// <p>The name of the exported output value. AWS CloudFormation returns the stack names that are importing this value. </p>
3574    pub export_name: String,
3575    /// <p>A string (provided by the <a>ListImports</a> response output) that identifies the next page of stacks that are importing the specified exported output value. </p>
3576    pub next_token: Option<String>,
3577}
3578
3579/// Serialize `ListImportsInput` contents to a `SignedRequest`.
3580struct ListImportsInputSerializer;
3581impl ListImportsInputSerializer {
3582    fn serialize(params: &mut Params, name: &str, obj: &ListImportsInput) {
3583        let mut prefix = name.to_string();
3584        if prefix != "" {
3585            prefix.push_str(".");
3586        }
3587
3588        params.put(&format!("{}{}", prefix, "ExportName"), &obj.export_name);
3589        if let Some(ref field_value) = obj.next_token {
3590            params.put(&format!("{}{}", prefix, "NextToken"), &field_value);
3591        }
3592    }
3593}
3594
3595#[derive(Clone, Debug, Default, PartialEq)]
3596#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
3597pub struct ListImportsOutput {
3598    /// <p>A list of stack names that are importing the specified exported output value. </p>
3599    pub imports: Option<Vec<String>>,
3600    /// <p>A string that identifies the next page of exports. If there is no additional page, this value is null.</p>
3601    pub next_token: Option<String>,
3602}
3603
3604#[allow(dead_code)]
3605struct ListImportsOutputDeserializer;
3606impl ListImportsOutputDeserializer {
3607    #[allow(dead_code, unused_variables)]
3608    fn deserialize<T: Peek + Next>(
3609        tag_name: &str,
3610        stack: &mut T,
3611    ) -> Result<ListImportsOutput, XmlParseError> {
3612        deserialize_elements::<_, ListImportsOutput, _>(tag_name, stack, |name, stack, obj| {
3613            match name {
3614                "Imports" => {
3615                    obj.imports
3616                        .get_or_insert(vec![])
3617                        .extend(ImportsDeserializer::deserialize("Imports", stack)?);
3618                }
3619                "NextToken" => {
3620                    obj.next_token = Some(NextTokenDeserializer::deserialize("NextToken", stack)?);
3621                }
3622                _ => skip_tree(stack),
3623            }
3624            Ok(())
3625        })
3626    }
3627}
3628#[derive(Clone, Debug, Default, PartialEq)]
3629#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
3630pub struct ListStackInstancesInput {
3631    /// <p>The status that stack instances are filtered by.</p>
3632    pub filters: Option<Vec<StackInstanceFilter>>,
3633    /// <p>The maximum number of results to be returned with a single call. If the number of available results exceeds this maximum, the response includes a <code>NextToken</code> value that you can assign to the <code>NextToken</code> request parameter to get the next set of results.</p>
3634    pub max_results: Option<i64>,
3635    /// <p>If the previous request didn't return all of the remaining results, the response's <code>NextToken</code> parameter value is set to a token. To retrieve the next set of results, call <code>ListStackInstances</code> again and assign that token to the request object's <code>NextToken</code> parameter. If there are no remaining results, the previous response object's <code>NextToken</code> parameter is set to <code>null</code>.</p>
3636    pub next_token: Option<String>,
3637    /// <p>The name of the AWS account that you want to list stack instances for.</p>
3638    pub stack_instance_account: Option<String>,
3639    /// <p>The name of the Region where you want to list stack instances. </p>
3640    pub stack_instance_region: Option<String>,
3641    /// <p>The name or unique ID of the stack set that you want to list stack instances for.</p>
3642    pub stack_set_name: String,
3643}
3644
3645/// Serialize `ListStackInstancesInput` contents to a `SignedRequest`.
3646struct ListStackInstancesInputSerializer;
3647impl ListStackInstancesInputSerializer {
3648    fn serialize(params: &mut Params, name: &str, obj: &ListStackInstancesInput) {
3649        let mut prefix = name.to_string();
3650        if prefix != "" {
3651            prefix.push_str(".");
3652        }
3653
3654        if let Some(ref field_value) = obj.filters {
3655            StackInstanceFiltersSerializer::serialize(
3656                params,
3657                &format!("{}{}", prefix, "Filters"),
3658                field_value,
3659            );
3660        }
3661        if let Some(ref field_value) = obj.max_results {
3662            params.put(&format!("{}{}", prefix, "MaxResults"), &field_value);
3663        }
3664        if let Some(ref field_value) = obj.next_token {
3665            params.put(&format!("{}{}", prefix, "NextToken"), &field_value);
3666        }
3667        if let Some(ref field_value) = obj.stack_instance_account {
3668            params.put(
3669                &format!("{}{}", prefix, "StackInstanceAccount"),
3670                &field_value,
3671            );
3672        }
3673        if let Some(ref field_value) = obj.stack_instance_region {
3674            params.put(
3675                &format!("{}{}", prefix, "StackInstanceRegion"),
3676                &field_value,
3677            );
3678        }
3679        params.put(
3680            &format!("{}{}", prefix, "StackSetName"),
3681            &obj.stack_set_name,
3682        );
3683    }
3684}
3685
3686#[derive(Clone, Debug, Default, PartialEq)]
3687#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
3688pub struct ListStackInstancesOutput {
3689    /// <p>If the request doesn't return all of the remaining results, <code>NextToken</code> is set to a token. To retrieve the next set of results, call <code>ListStackInstances</code> again and assign that token to the request object's <code>NextToken</code> parameter. If the request returns all results, <code>NextToken</code> is set to <code>null</code>.</p>
3690    pub next_token: Option<String>,
3691    /// <p>A list of <code>StackInstanceSummary</code> structures that contain information about the specified stack instances.</p>
3692    pub summaries: Option<Vec<StackInstanceSummary>>,
3693}
3694
3695#[allow(dead_code)]
3696struct ListStackInstancesOutputDeserializer;
3697impl ListStackInstancesOutputDeserializer {
3698    #[allow(dead_code, unused_variables)]
3699    fn deserialize<T: Peek + Next>(
3700        tag_name: &str,
3701        stack: &mut T,
3702    ) -> Result<ListStackInstancesOutput, XmlParseError> {
3703        deserialize_elements::<_, ListStackInstancesOutput, _>(
3704            tag_name,
3705            stack,
3706            |name, stack, obj| {
3707                match name {
3708                    "NextToken" => {
3709                        obj.next_token =
3710                            Some(NextTokenDeserializer::deserialize("NextToken", stack)?);
3711                    }
3712                    "Summaries" => {
3713                        obj.summaries.get_or_insert(vec![]).extend(
3714                            StackInstanceSummariesDeserializer::deserialize("Summaries", stack)?,
3715                        );
3716                    }
3717                    _ => skip_tree(stack),
3718                }
3719                Ok(())
3720            },
3721        )
3722    }
3723}
3724/// <p>The input for the <a>ListStackResource</a> action.</p>
3725#[derive(Clone, Debug, Default, PartialEq)]
3726#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
3727pub struct ListStackResourcesInput {
3728    /// <p>A string that identifies the next page of stack resources that you want to retrieve.</p>
3729    pub next_token: Option<String>,
3730    /// <p>The name or the unique stack ID that is associated with the stack, which are not always interchangeable:</p> <ul> <li> <p>Running stacks: You can specify either the stack's name or its unique stack ID.</p> </li> <li> <p>Deleted stacks: You must specify the unique stack ID.</p> </li> </ul> <p>Default: There is no default value.</p>
3731    pub stack_name: String,
3732}
3733
3734/// Serialize `ListStackResourcesInput` contents to a `SignedRequest`.
3735struct ListStackResourcesInputSerializer;
3736impl ListStackResourcesInputSerializer {
3737    fn serialize(params: &mut Params, name: &str, obj: &ListStackResourcesInput) {
3738        let mut prefix = name.to_string();
3739        if prefix != "" {
3740            prefix.push_str(".");
3741        }
3742
3743        if let Some(ref field_value) = obj.next_token {
3744            params.put(&format!("{}{}", prefix, "NextToken"), &field_value);
3745        }
3746        params.put(&format!("{}{}", prefix, "StackName"), &obj.stack_name);
3747    }
3748}
3749
3750/// <p>The output for a <a>ListStackResources</a> action.</p>
3751#[derive(Clone, Debug, Default, PartialEq)]
3752#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
3753pub struct ListStackResourcesOutput {
3754    /// <p>If the output exceeds 1 MB, a string that identifies the next page of stack resources. If no additional page exists, this value is null.</p>
3755    pub next_token: Option<String>,
3756    /// <p>A list of <code>StackResourceSummary</code> structures.</p>
3757    pub stack_resource_summaries: Option<Vec<StackResourceSummary>>,
3758}
3759
3760#[allow(dead_code)]
3761struct ListStackResourcesOutputDeserializer;
3762impl ListStackResourcesOutputDeserializer {
3763    #[allow(dead_code, unused_variables)]
3764    fn deserialize<T: Peek + Next>(
3765        tag_name: &str,
3766        stack: &mut T,
3767    ) -> Result<ListStackResourcesOutput, XmlParseError> {
3768        deserialize_elements::<_, ListStackResourcesOutput, _>(
3769            tag_name,
3770            stack,
3771            |name, stack, obj| {
3772                match name {
3773                    "NextToken" => {
3774                        obj.next_token =
3775                            Some(NextTokenDeserializer::deserialize("NextToken", stack)?);
3776                    }
3777                    "StackResourceSummaries" => {
3778                        obj.stack_resource_summaries.get_or_insert(vec![]).extend(
3779                            StackResourceSummariesDeserializer::deserialize(
3780                                "StackResourceSummaries",
3781                                stack,
3782                            )?,
3783                        );
3784                    }
3785                    _ => skip_tree(stack),
3786                }
3787                Ok(())
3788            },
3789        )
3790    }
3791}
3792#[derive(Clone, Debug, Default, PartialEq)]
3793#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
3794pub struct ListStackSetOperationResultsInput {
3795    /// <p>The maximum number of results to be returned with a single call. If the number of available results exceeds this maximum, the response includes a <code>NextToken</code> value that you can assign to the <code>NextToken</code> request parameter to get the next set of results.</p>
3796    pub max_results: Option<i64>,
3797    /// <p>If the previous request didn't return all of the remaining results, the response object's <code>NextToken</code> parameter value is set to a token. To retrieve the next set of results, call <code>ListStackSetOperationResults</code> again and assign that token to the request object's <code>NextToken</code> parameter. If there are no remaining results, the previous response object's <code>NextToken</code> parameter is set to <code>null</code>.</p>
3798    pub next_token: Option<String>,
3799    /// <p>The ID of the stack set operation.</p>
3800    pub operation_id: String,
3801    /// <p>The name or unique ID of the stack set that you want to get operation results for.</p>
3802    pub stack_set_name: String,
3803}
3804
3805/// Serialize `ListStackSetOperationResultsInput` contents to a `SignedRequest`.
3806struct ListStackSetOperationResultsInputSerializer;
3807impl ListStackSetOperationResultsInputSerializer {
3808    fn serialize(params: &mut Params, name: &str, obj: &ListStackSetOperationResultsInput) {
3809        let mut prefix = name.to_string();
3810        if prefix != "" {
3811            prefix.push_str(".");
3812        }
3813
3814        if let Some(ref field_value) = obj.max_results {
3815            params.put(&format!("{}{}", prefix, "MaxResults"), &field_value);
3816        }
3817        if let Some(ref field_value) = obj.next_token {
3818            params.put(&format!("{}{}", prefix, "NextToken"), &field_value);
3819        }
3820        params.put(&format!("{}{}", prefix, "OperationId"), &obj.operation_id);
3821        params.put(
3822            &format!("{}{}", prefix, "StackSetName"),
3823            &obj.stack_set_name,
3824        );
3825    }
3826}
3827
3828#[derive(Clone, Debug, Default, PartialEq)]
3829#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
3830pub struct ListStackSetOperationResultsOutput {
3831    /// <p>If the request doesn't return all results, <code>NextToken</code> is set to a token. To retrieve the next set of results, call <code>ListOperationResults</code> again and assign that token to the request object's <code>NextToken</code> parameter. If there are no remaining results, <code>NextToken</code> is set to <code>null</code>.</p>
3832    pub next_token: Option<String>,
3833    /// <p>A list of <code>StackSetOperationResultSummary</code> structures that contain information about the specified operation results, for accounts and Regions that are included in the operation.</p>
3834    pub summaries: Option<Vec<StackSetOperationResultSummary>>,
3835}
3836
3837#[allow(dead_code)]
3838struct ListStackSetOperationResultsOutputDeserializer;
3839impl ListStackSetOperationResultsOutputDeserializer {
3840    #[allow(dead_code, unused_variables)]
3841    fn deserialize<T: Peek + Next>(
3842        tag_name: &str,
3843        stack: &mut T,
3844    ) -> Result<ListStackSetOperationResultsOutput, XmlParseError> {
3845        deserialize_elements::<_, ListStackSetOperationResultsOutput, _>(
3846            tag_name,
3847            stack,
3848            |name, stack, obj| {
3849                match name {
3850                    "NextToken" => {
3851                        obj.next_token =
3852                            Some(NextTokenDeserializer::deserialize("NextToken", stack)?);
3853                    }
3854                    "Summaries" => {
3855                        obj.summaries.get_or_insert(vec![]).extend(
3856                            StackSetOperationResultSummariesDeserializer::deserialize(
3857                                "Summaries",
3858                                stack,
3859                            )?,
3860                        );
3861                    }
3862                    _ => skip_tree(stack),
3863                }
3864                Ok(())
3865            },
3866        )
3867    }
3868}
3869#[derive(Clone, Debug, Default, PartialEq)]
3870#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
3871pub struct ListStackSetOperationsInput {
3872    /// <p>The maximum number of results to be returned with a single call. If the number of available results exceeds this maximum, the response includes a <code>NextToken</code> value that you can assign to the <code>NextToken</code> request parameter to get the next set of results.</p>
3873    pub max_results: Option<i64>,
3874    /// <p>If the previous paginated request didn't return all of the remaining results, the response object's <code>NextToken</code> parameter value is set to a token. To retrieve the next set of results, call <code>ListStackSetOperations</code> again and assign that token to the request object's <code>NextToken</code> parameter. If there are no remaining results, the previous response object's <code>NextToken</code> parameter is set to <code>null</code>.</p>
3875    pub next_token: Option<String>,
3876    /// <p>The name or unique ID of the stack set that you want to get operation summaries for.</p>
3877    pub stack_set_name: String,
3878}
3879
3880/// Serialize `ListStackSetOperationsInput` contents to a `SignedRequest`.
3881struct ListStackSetOperationsInputSerializer;
3882impl ListStackSetOperationsInputSerializer {
3883    fn serialize(params: &mut Params, name: &str, obj: &ListStackSetOperationsInput) {
3884        let mut prefix = name.to_string();
3885        if prefix != "" {
3886            prefix.push_str(".");
3887        }
3888
3889        if let Some(ref field_value) = obj.max_results {
3890            params.put(&format!("{}{}", prefix, "MaxResults"), &field_value);
3891        }
3892        if let Some(ref field_value) = obj.next_token {
3893            params.put(&format!("{}{}", prefix, "NextToken"), &field_value);
3894        }
3895        params.put(
3896            &format!("{}{}", prefix, "StackSetName"),
3897            &obj.stack_set_name,
3898        );
3899    }
3900}
3901
3902#[derive(Clone, Debug, Default, PartialEq)]
3903#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
3904pub struct ListStackSetOperationsOutput {
3905    /// <p>If the request doesn't return all results, <code>NextToken</code> is set to a token. To retrieve the next set of results, call <code>ListOperationResults</code> again and assign that token to the request object's <code>NextToken</code> parameter. If there are no remaining results, <code>NextToken</code> is set to <code>null</code>.</p>
3906    pub next_token: Option<String>,
3907    /// <p>A list of <code>StackSetOperationSummary</code> structures that contain summary information about operations for the specified stack set.</p>
3908    pub summaries: Option<Vec<StackSetOperationSummary>>,
3909}
3910
3911#[allow(dead_code)]
3912struct ListStackSetOperationsOutputDeserializer;
3913impl ListStackSetOperationsOutputDeserializer {
3914    #[allow(dead_code, unused_variables)]
3915    fn deserialize<T: Peek + Next>(
3916        tag_name: &str,
3917        stack: &mut T,
3918    ) -> Result<ListStackSetOperationsOutput, XmlParseError> {
3919        deserialize_elements::<_, ListStackSetOperationsOutput, _>(
3920            tag_name,
3921            stack,
3922            |name, stack, obj| {
3923                match name {
3924                    "NextToken" => {
3925                        obj.next_token =
3926                            Some(NextTokenDeserializer::deserialize("NextToken", stack)?);
3927                    }
3928                    "Summaries" => {
3929                        obj.summaries.get_or_insert(vec![]).extend(
3930                            StackSetOperationSummariesDeserializer::deserialize(
3931                                "Summaries",
3932                                stack,
3933                            )?,
3934                        );
3935                    }
3936                    _ => skip_tree(stack),
3937                }
3938                Ok(())
3939            },
3940        )
3941    }
3942}
3943#[derive(Clone, Debug, Default, PartialEq)]
3944#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
3945pub struct ListStackSetsInput {
3946    /// <p>The maximum number of results to be returned with a single call. If the number of available results exceeds this maximum, the response includes a <code>NextToken</code> value that you can assign to the <code>NextToken</code> request parameter to get the next set of results.</p>
3947    pub max_results: Option<i64>,
3948    /// <p>If the previous paginated request didn't return all of the remaining results, the response object's <code>NextToken</code> parameter value is set to a token. To retrieve the next set of results, call <code>ListStackSets</code> again and assign that token to the request object's <code>NextToken</code> parameter. If there are no remaining results, the previous response object's <code>NextToken</code> parameter is set to <code>null</code>.</p>
3949    pub next_token: Option<String>,
3950    /// <p>The status of the stack sets that you want to get summary information about.</p>
3951    pub status: Option<String>,
3952}
3953
3954/// Serialize `ListStackSetsInput` contents to a `SignedRequest`.
3955struct ListStackSetsInputSerializer;
3956impl ListStackSetsInputSerializer {
3957    fn serialize(params: &mut Params, name: &str, obj: &ListStackSetsInput) {
3958        let mut prefix = name.to_string();
3959        if prefix != "" {
3960            prefix.push_str(".");
3961        }
3962
3963        if let Some(ref field_value) = obj.max_results {
3964            params.put(&format!("{}{}", prefix, "MaxResults"), &field_value);
3965        }
3966        if let Some(ref field_value) = obj.next_token {
3967            params.put(&format!("{}{}", prefix, "NextToken"), &field_value);
3968        }
3969        if let Some(ref field_value) = obj.status {
3970            params.put(&format!("{}{}", prefix, "Status"), &field_value);
3971        }
3972    }
3973}
3974
3975#[derive(Clone, Debug, Default, PartialEq)]
3976#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
3977pub struct ListStackSetsOutput {
3978    /// <p>If the request doesn't return all of the remaining results, <code>NextToken</code> is set to a token. To retrieve the next set of results, call <code>ListStackInstances</code> again and assign that token to the request object's <code>NextToken</code> parameter. If the request returns all results, <code>NextToken</code> is set to <code>null</code>.</p>
3979    pub next_token: Option<String>,
3980    /// <p>A list of <code>StackSetSummary</code> structures that contain information about the user's stack sets.</p>
3981    pub summaries: Option<Vec<StackSetSummary>>,
3982}
3983
3984#[allow(dead_code)]
3985struct ListStackSetsOutputDeserializer;
3986impl ListStackSetsOutputDeserializer {
3987    #[allow(dead_code, unused_variables)]
3988    fn deserialize<T: Peek + Next>(
3989        tag_name: &str,
3990        stack: &mut T,
3991    ) -> Result<ListStackSetsOutput, XmlParseError> {
3992        deserialize_elements::<_, ListStackSetsOutput, _>(tag_name, stack, |name, stack, obj| {
3993            match name {
3994                "NextToken" => {
3995                    obj.next_token = Some(NextTokenDeserializer::deserialize("NextToken", stack)?);
3996                }
3997                "Summaries" => {
3998                    obj.summaries.get_or_insert(vec![]).extend(
3999                        StackSetSummariesDeserializer::deserialize("Summaries", stack)?,
4000                    );
4001                }
4002                _ => skip_tree(stack),
4003            }
4004            Ok(())
4005        })
4006    }
4007}
4008/// <p>The input for <a>ListStacks</a> action.</p>
4009#[derive(Clone, Debug, Default, PartialEq)]
4010#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
4011pub struct ListStacksInput {
4012    /// <p>A string that identifies the next page of stacks that you want to retrieve.</p>
4013    pub next_token: Option<String>,
4014    /// <p>Stack status to use as a filter. Specify one or more stack status codes to list only stacks with the specified status codes. For a complete list of stack status codes, see the <code>StackStatus</code> parameter of the <a>Stack</a> data type.</p>
4015    pub stack_status_filter: Option<Vec<String>>,
4016}
4017
4018/// Serialize `ListStacksInput` contents to a `SignedRequest`.
4019struct ListStacksInputSerializer;
4020impl ListStacksInputSerializer {
4021    fn serialize(params: &mut Params, name: &str, obj: &ListStacksInput) {
4022        let mut prefix = name.to_string();
4023        if prefix != "" {
4024            prefix.push_str(".");
4025        }
4026
4027        if let Some(ref field_value) = obj.next_token {
4028            params.put(&format!("{}{}", prefix, "NextToken"), &field_value);
4029        }
4030        if let Some(ref field_value) = obj.stack_status_filter {
4031            StackStatusFilterSerializer::serialize(
4032                params,
4033                &format!("{}{}", prefix, "StackStatusFilter"),
4034                field_value,
4035            );
4036        }
4037    }
4038}
4039
4040/// <p>The output for <a>ListStacks</a> action.</p>
4041#[derive(Clone, Debug, Default, PartialEq)]
4042#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
4043pub struct ListStacksOutput {
4044    /// <p>If the output exceeds 1 MB in size, a string that identifies the next page of stacks. If no additional page exists, this value is null.</p>
4045    pub next_token: Option<String>,
4046    /// <p>A list of <code>StackSummary</code> structures containing information about the specified stacks.</p>
4047    pub stack_summaries: Option<Vec<StackSummary>>,
4048}
4049
4050#[allow(dead_code)]
4051struct ListStacksOutputDeserializer;
4052impl ListStacksOutputDeserializer {
4053    #[allow(dead_code, unused_variables)]
4054    fn deserialize<T: Peek + Next>(
4055        tag_name: &str,
4056        stack: &mut T,
4057    ) -> Result<ListStacksOutput, XmlParseError> {
4058        deserialize_elements::<_, ListStacksOutput, _>(tag_name, stack, |name, stack, obj| {
4059            match name {
4060                "NextToken" => {
4061                    obj.next_token = Some(NextTokenDeserializer::deserialize("NextToken", stack)?);
4062                }
4063                "StackSummaries" => {
4064                    obj.stack_summaries.get_or_insert(vec![]).extend(
4065                        StackSummariesDeserializer::deserialize("StackSummaries", stack)?,
4066                    );
4067                }
4068                _ => skip_tree(stack),
4069            }
4070            Ok(())
4071        })
4072    }
4073}
4074#[derive(Clone, Debug, Default, PartialEq)]
4075#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
4076pub struct ListTypeRegistrationsInput {
4077    /// <p>The maximum number of results to be returned with a single call. If the number of available results exceeds this maximum, the response includes a <code>NextToken</code> value that you can assign to the <code>NextToken</code> request parameter to get the next set of results.</p>
4078    pub max_results: Option<i64>,
4079    /// <p>If the previous paginated request didn't return all of the remaining results, the response object's <code>NextToken</code> parameter value is set to a token. To retrieve the next set of results, call this action again and assign that token to the request object's <code>NextToken</code> parameter. If there are no remaining results, the previous response object's <code>NextToken</code> parameter is set to <code>null</code>.</p>
4080    pub next_token: Option<String>,
4081    /// <p>The current status of the type registration request.</p> <p>The default is <code>IN_PROGRESS</code>.</p>
4082    pub registration_status_filter: Option<String>,
4083    /// <p>The kind of type.</p> <p>Currently the only valid value is <code>RESOURCE</code>.</p> <p>Conditional: You must specify either <code>TypeName</code> and <code>Type</code>, or <code>Arn</code>.</p>
4084    pub type_: Option<String>,
4085    /// <p>The Amazon Resource Name (ARN) of the type.</p> <p>Conditional: You must specify either <code>TypeName</code> and <code>Type</code>, or <code>Arn</code>.</p>
4086    pub type_arn: Option<String>,
4087    /// <p>The name of the type.</p> <p>Conditional: You must specify either <code>TypeName</code> and <code>Type</code>, or <code>Arn</code>.</p>
4088    pub type_name: Option<String>,
4089}
4090
4091/// Serialize `ListTypeRegistrationsInput` contents to a `SignedRequest`.
4092struct ListTypeRegistrationsInputSerializer;
4093impl ListTypeRegistrationsInputSerializer {
4094    fn serialize(params: &mut Params, name: &str, obj: &ListTypeRegistrationsInput) {
4095        let mut prefix = name.to_string();
4096        if prefix != "" {
4097            prefix.push_str(".");
4098        }
4099
4100        if let Some(ref field_value) = obj.max_results {
4101            params.put(&format!("{}{}", prefix, "MaxResults"), &field_value);
4102        }
4103        if let Some(ref field_value) = obj.next_token {
4104            params.put(&format!("{}{}", prefix, "NextToken"), &field_value);
4105        }
4106        if let Some(ref field_value) = obj.registration_status_filter {
4107            params.put(
4108                &format!("{}{}", prefix, "RegistrationStatusFilter"),
4109                &field_value,
4110            );
4111        }
4112        if let Some(ref field_value) = obj.type_ {
4113            params.put(&format!("{}{}", prefix, "Type"), &field_value);
4114        }
4115        if let Some(ref field_value) = obj.type_arn {
4116            params.put(&format!("{}{}", prefix, "TypeArn"), &field_value);
4117        }
4118        if let Some(ref field_value) = obj.type_name {
4119            params.put(&format!("{}{}", prefix, "TypeName"), &field_value);
4120        }
4121    }
4122}
4123
4124#[derive(Clone, Debug, Default, PartialEq)]
4125#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
4126pub struct ListTypeRegistrationsOutput {
4127    /// <p>If the request doesn't return all of the remaining results, <code>NextToken</code> is set to a token. To retrieve the next set of results, call this action again and assign that token to the request object's <code>NextToken</code> parameter. If the request returns all results, <code>NextToken</code> is set to <code>null</code>.</p>
4128    pub next_token: Option<String>,
4129    /// <p> A list of type registration tokens.</p> <p>Use <code> <a>DescribeTypeRegistration</a> </code> to return detailed information about a type registration request.</p>
4130    pub registration_token_list: Option<Vec<String>>,
4131}
4132
4133#[allow(dead_code)]
4134struct ListTypeRegistrationsOutputDeserializer;
4135impl ListTypeRegistrationsOutputDeserializer {
4136    #[allow(dead_code, unused_variables)]
4137    fn deserialize<T: Peek + Next>(
4138        tag_name: &str,
4139        stack: &mut T,
4140    ) -> Result<ListTypeRegistrationsOutput, XmlParseError> {
4141        deserialize_elements::<_, ListTypeRegistrationsOutput, _>(
4142            tag_name,
4143            stack,
4144            |name, stack, obj| {
4145                match name {
4146                    "NextToken" => {
4147                        obj.next_token =
4148                            Some(NextTokenDeserializer::deserialize("NextToken", stack)?);
4149                    }
4150                    "RegistrationTokenList" => {
4151                        obj.registration_token_list.get_or_insert(vec![]).extend(
4152                            RegistrationTokenListDeserializer::deserialize(
4153                                "RegistrationTokenList",
4154                                stack,
4155                            )?,
4156                        );
4157                    }
4158                    _ => skip_tree(stack),
4159                }
4160                Ok(())
4161            },
4162        )
4163    }
4164}
4165#[derive(Clone, Debug, Default, PartialEq)]
4166#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
4167pub struct ListTypeVersionsInput {
4168    /// <p>The Amazon Resource Name (ARN) of the type for which you want version summary information.</p> <p>Conditional: You must specify either <code>TypeName</code> and <code>Type</code>, or <code>Arn</code>.</p>
4169    pub arn: Option<String>,
4170    /// <p>The deprecation status of the type versions that you want to get summary information about.</p> <p>Valid values include:</p> <ul> <li> <p> <code>LIVE</code>: The type version is registered and can be used in CloudFormation operations, dependent on its provisioning behavior and visibility scope.</p> </li> <li> <p> <code>DEPRECATED</code>: The type version has been deregistered and can no longer be used in CloudFormation operations. </p> </li> </ul> <p>The default is <code>LIVE</code>.</p>
4171    pub deprecated_status: Option<String>,
4172    /// <p>The maximum number of results to be returned with a single call. If the number of available results exceeds this maximum, the response includes a <code>NextToken</code> value that you can assign to the <code>NextToken</code> request parameter to get the next set of results.</p>
4173    pub max_results: Option<i64>,
4174    /// <p>If the previous paginated request didn't return all of the remaining results, the response object's <code>NextToken</code> parameter value is set to a token. To retrieve the next set of results, call this action again and assign that token to the request object's <code>NextToken</code> parameter. If there are no remaining results, the previous response object's <code>NextToken</code> parameter is set to <code>null</code>.</p>
4175    pub next_token: Option<String>,
4176    /// <p>The kind of the type.</p> <p>Currently the only valid value is <code>RESOURCE</code>.</p> <p>Conditional: You must specify either <code>TypeName</code> and <code>Type</code>, or <code>Arn</code>.</p>
4177    pub type_: Option<String>,
4178    /// <p>The name of the type for which you want version summary information.</p> <p>Conditional: You must specify either <code>TypeName</code> and <code>Type</code>, or <code>Arn</code>.</p>
4179    pub type_name: Option<String>,
4180}
4181
4182/// Serialize `ListTypeVersionsInput` contents to a `SignedRequest`.
4183struct ListTypeVersionsInputSerializer;
4184impl ListTypeVersionsInputSerializer {
4185    fn serialize(params: &mut Params, name: &str, obj: &ListTypeVersionsInput) {
4186        let mut prefix = name.to_string();
4187        if prefix != "" {
4188            prefix.push_str(".");
4189        }
4190
4191        if let Some(ref field_value) = obj.arn {
4192            params.put(&format!("{}{}", prefix, "Arn"), &field_value);
4193        }
4194        if let Some(ref field_value) = obj.deprecated_status {
4195            params.put(&format!("{}{}", prefix, "DeprecatedStatus"), &field_value);
4196        }
4197        if let Some(ref field_value) = obj.max_results {
4198            params.put(&format!("{}{}", prefix, "MaxResults"), &field_value);
4199        }
4200        if let Some(ref field_value) = obj.next_token {
4201            params.put(&format!("{}{}", prefix, "NextToken"), &field_value);
4202        }
4203        if let Some(ref field_value) = obj.type_ {
4204            params.put(&format!("{}{}", prefix, "Type"), &field_value);
4205        }
4206        if let Some(ref field_value) = obj.type_name {
4207            params.put(&format!("{}{}", prefix, "TypeName"), &field_value);
4208        }
4209    }
4210}
4211
4212#[derive(Clone, Debug, Default, PartialEq)]
4213#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
4214pub struct ListTypeVersionsOutput {
4215    /// <p>If the request doesn't return all of the remaining results, <code>NextToken</code> is set to a token. To retrieve the next set of results, call this action again and assign that token to the request object's <code>NextToken</code> parameter. If the request returns all results, <code>NextToken</code> is set to <code>null</code>.</p>
4216    pub next_token: Option<String>,
4217    /// <p>A list of <code>TypeVersionSummary</code> structures that contain information about the specified type's versions.</p>
4218    pub type_version_summaries: Option<Vec<TypeVersionSummary>>,
4219}
4220
4221#[allow(dead_code)]
4222struct ListTypeVersionsOutputDeserializer;
4223impl ListTypeVersionsOutputDeserializer {
4224    #[allow(dead_code, unused_variables)]
4225    fn deserialize<T: Peek + Next>(
4226        tag_name: &str,
4227        stack: &mut T,
4228    ) -> Result<ListTypeVersionsOutput, XmlParseError> {
4229        deserialize_elements::<_, ListTypeVersionsOutput, _>(tag_name, stack, |name, stack, obj| {
4230            match name {
4231                "NextToken" => {
4232                    obj.next_token = Some(NextTokenDeserializer::deserialize("NextToken", stack)?);
4233                }
4234                "TypeVersionSummaries" => {
4235                    obj.type_version_summaries.get_or_insert(vec![]).extend(
4236                        TypeVersionSummariesDeserializer::deserialize(
4237                            "TypeVersionSummaries",
4238                            stack,
4239                        )?,
4240                    );
4241                }
4242                _ => skip_tree(stack),
4243            }
4244            Ok(())
4245        })
4246    }
4247}
4248#[derive(Clone, Debug, Default, PartialEq)]
4249#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
4250pub struct ListTypesInput {
4251    /// <p><p>The deprecation status of the types that you want to get summary information about.</p> <p>Valid values include:</p> <ul> <li> <p> <code>LIVE</code>: The type is registered for use in CloudFormation operations.</p> </li> <li> <p> <code>DEPRECATED</code>: The type has been deregistered and can no longer be used in CloudFormation operations. </p> </li> </ul></p>
4252    pub deprecated_status: Option<String>,
4253    /// <p>The maximum number of results to be returned with a single call. If the number of available results exceeds this maximum, the response includes a <code>NextToken</code> value that you can assign to the <code>NextToken</code> request parameter to get the next set of results.</p>
4254    pub max_results: Option<i64>,
4255    /// <p>If the previous paginated request didn't return all of the remaining results, the response object's <code>NextToken</code> parameter value is set to a token. To retrieve the next set of results, call this action again and assign that token to the request object's <code>NextToken</code> parameter. If there are no remaining results, the previous response object's <code>NextToken</code> parameter is set to <code>null</code>.</p>
4256    pub next_token: Option<String>,
4257    /// <p><p>The provisioning behavior of the type. AWS CloudFormation determines the provisioning type during registration, based on the types of handlers in the schema handler package submitted.</p> <p>Valid values include:</p> <ul> <li> <p> <code>FULLY<em>MUTABLE</code>: The type includes an update handler to process updates to the type during stack update operations.</p> </li> <li> <p> <code>IMMUTABLE</code>: The type does not include an update handler, so the type cannot be updated and must instead be replaced during stack update operations.</p> </li> <li> <p> <code>NON</em>PROVISIONABLE</code>: The type does not include create, read, and delete handlers, and therefore cannot actually be provisioned.</p> </li> </ul></p>
4258    pub provisioning_type: Option<String>,
4259    /// <p>The scope at which the type is visible and usable in CloudFormation operations.</p> <p>Valid values include:</p> <ul> <li> <p> <code>PRIVATE</code>: The type is only visible and usable within the account in which it is registered. Currently, AWS CloudFormation marks any types you create as <code>PRIVATE</code>.</p> </li> <li> <p> <code>PUBLIC</code>: The type is publically visible and usable within any Amazon account.</p> </li> </ul> <p>The default is <code>PRIVATE</code>.</p>
4260    pub visibility: Option<String>,
4261}
4262
4263/// Serialize `ListTypesInput` contents to a `SignedRequest`.
4264struct ListTypesInputSerializer;
4265impl ListTypesInputSerializer {
4266    fn serialize(params: &mut Params, name: &str, obj: &ListTypesInput) {
4267        let mut prefix = name.to_string();
4268        if prefix != "" {
4269            prefix.push_str(".");
4270        }
4271
4272        if let Some(ref field_value) = obj.deprecated_status {
4273            params.put(&format!("{}{}", prefix, "DeprecatedStatus"), &field_value);
4274        }
4275        if let Some(ref field_value) = obj.max_results {
4276            params.put(&format!("{}{}", prefix, "MaxResults"), &field_value);
4277        }
4278        if let Some(ref field_value) = obj.next_token {
4279            params.put(&format!("{}{}", prefix, "NextToken"), &field_value);
4280        }
4281        if let Some(ref field_value) = obj.provisioning_type {
4282            params.put(&format!("{}{}", prefix, "ProvisioningType"), &field_value);
4283        }
4284        if let Some(ref field_value) = obj.visibility {
4285            params.put(&format!("{}{}", prefix, "Visibility"), &field_value);
4286        }
4287    }
4288}
4289
4290#[derive(Clone, Debug, Default, PartialEq)]
4291#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
4292pub struct ListTypesOutput {
4293    /// <p>If the request doesn't return all of the remaining results, <code>NextToken</code> is set to a token. To retrieve the next set of results, call this action again and assign that token to the request object's <code>NextToken</code> parameter. If the request returns all results, <code>NextToken</code> is set to <code>null</code>.</p>
4294    pub next_token: Option<String>,
4295    /// <p>A list of <code>TypeSummary</code> structures that contain information about the specified types.</p>
4296    pub type_summaries: Option<Vec<TypeSummary>>,
4297}
4298
4299#[allow(dead_code)]
4300struct ListTypesOutputDeserializer;
4301impl ListTypesOutputDeserializer {
4302    #[allow(dead_code, unused_variables)]
4303    fn deserialize<T: Peek + Next>(
4304        tag_name: &str,
4305        stack: &mut T,
4306    ) -> Result<ListTypesOutput, XmlParseError> {
4307        deserialize_elements::<_, ListTypesOutput, _>(tag_name, stack, |name, stack, obj| {
4308            match name {
4309                "NextToken" => {
4310                    obj.next_token = Some(NextTokenDeserializer::deserialize("NextToken", stack)?);
4311                }
4312                "TypeSummaries" => {
4313                    obj.type_summaries.get_or_insert(vec![]).extend(
4314                        TypeSummariesDeserializer::deserialize("TypeSummaries", stack)?,
4315                    );
4316                }
4317                _ => skip_tree(stack),
4318            }
4319            Ok(())
4320        })
4321    }
4322}
4323#[allow(dead_code)]
4324struct LogGroupNameDeserializer;
4325impl LogGroupNameDeserializer {
4326    #[allow(dead_code, unused_variables)]
4327    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
4328        xml_util::deserialize_primitive(tag_name, stack, Ok)
4329    }
4330}
4331/// <p>Contains logging configuration information for a type.</p>
4332#[derive(Clone, Debug, Default, PartialEq)]
4333#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
4334#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
4335pub struct LoggingConfig {
4336    /// <p>The Amazon CloudWatch log group to which CloudFormation sends error logging information when invoking the type's handlers.</p>
4337    pub log_group_name: String,
4338    /// <p>The ARN of the role that CloudFormation should assume when sending log entries to CloudWatch logs.</p>
4339    pub log_role_arn: String,
4340}
4341
4342#[allow(dead_code)]
4343struct LoggingConfigDeserializer;
4344impl LoggingConfigDeserializer {
4345    #[allow(dead_code, unused_variables)]
4346    fn deserialize<T: Peek + Next>(
4347        tag_name: &str,
4348        stack: &mut T,
4349    ) -> Result<LoggingConfig, XmlParseError> {
4350        deserialize_elements::<_, LoggingConfig, _>(tag_name, stack, |name, stack, obj| {
4351            match name {
4352                "LogGroupName" => {
4353                    obj.log_group_name =
4354                        LogGroupNameDeserializer::deserialize("LogGroupName", stack)?;
4355                }
4356                "LogRoleArn" => {
4357                    obj.log_role_arn = RoleArnDeserializer::deserialize("LogRoleArn", stack)?;
4358                }
4359                _ => skip_tree(stack),
4360            }
4361            Ok(())
4362        })
4363    }
4364}
4365
4366/// Serialize `LoggingConfig` contents to a `SignedRequest`.
4367struct LoggingConfigSerializer;
4368impl LoggingConfigSerializer {
4369    fn serialize(params: &mut Params, name: &str, obj: &LoggingConfig) {
4370        let mut prefix = name.to_string();
4371        if prefix != "" {
4372            prefix.push_str(".");
4373        }
4374
4375        params.put(
4376            &format!("{}{}", prefix, "LogGroupName"),
4377            &obj.log_group_name,
4378        );
4379        params.put(&format!("{}{}", prefix, "LogRoleArn"), &obj.log_role_arn);
4380    }
4381}
4382
4383#[allow(dead_code)]
4384struct LogicalResourceIdDeserializer;
4385impl LogicalResourceIdDeserializer {
4386    #[allow(dead_code, unused_variables)]
4387    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
4388        xml_util::deserialize_primitive(tag_name, stack, Ok)
4389    }
4390}
4391#[allow(dead_code)]
4392struct LogicalResourceIdsDeserializer;
4393impl LogicalResourceIdsDeserializer {
4394    #[allow(dead_code, unused_variables)]
4395    fn deserialize<T: Peek + Next>(
4396        tag_name: &str,
4397        stack: &mut T,
4398    ) -> Result<Vec<String>, XmlParseError> {
4399        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
4400            if name == "member" {
4401                obj.push(LogicalResourceIdDeserializer::deserialize("member", stack)?);
4402            } else {
4403                skip_tree(stack);
4404            }
4405            Ok(())
4406        })
4407    }
4408}
4409
4410/// Serialize `LogicalResourceIds` contents to a `SignedRequest`.
4411struct LogicalResourceIdsSerializer;
4412impl LogicalResourceIdsSerializer {
4413    fn serialize(params: &mut Params, name: &str, obj: &Vec<String>) {
4414        for (index, obj) in obj.iter().enumerate() {
4415            let key = format!("{}.member.{}", name, index + 1);
4416            params.put(&key, &obj);
4417        }
4418    }
4419}
4420
4421#[allow(dead_code)]
4422struct MaxConcurrentCountDeserializer;
4423impl MaxConcurrentCountDeserializer {
4424    #[allow(dead_code, unused_variables)]
4425    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<i64, XmlParseError> {
4426        xml_util::deserialize_primitive(tag_name, stack, |s| Ok(i64::from_str(&s).unwrap()))
4427    }
4428}
4429#[allow(dead_code)]
4430struct MaxConcurrentPercentageDeserializer;
4431impl MaxConcurrentPercentageDeserializer {
4432    #[allow(dead_code, unused_variables)]
4433    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<i64, XmlParseError> {
4434        xml_util::deserialize_primitive(tag_name, stack, |s| Ok(i64::from_str(&s).unwrap()))
4435    }
4436}
4437#[allow(dead_code)]
4438struct MetadataDeserializer;
4439impl MetadataDeserializer {
4440    #[allow(dead_code, unused_variables)]
4441    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
4442        xml_util::deserialize_primitive(tag_name, stack, Ok)
4443    }
4444}
4445#[allow(dead_code)]
4446struct MonitoringTimeInMinutesDeserializer;
4447impl MonitoringTimeInMinutesDeserializer {
4448    #[allow(dead_code, unused_variables)]
4449    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<i64, XmlParseError> {
4450        xml_util::deserialize_primitive(tag_name, stack, |s| Ok(i64::from_str(&s).unwrap()))
4451    }
4452}
4453#[allow(dead_code)]
4454struct NextTokenDeserializer;
4455impl NextTokenDeserializer {
4456    #[allow(dead_code, unused_variables)]
4457    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
4458        xml_util::deserialize_primitive(tag_name, stack, Ok)
4459    }
4460}
4461#[allow(dead_code)]
4462struct NoEchoDeserializer;
4463impl NoEchoDeserializer {
4464    #[allow(dead_code, unused_variables)]
4465    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<bool, XmlParseError> {
4466        xml_util::deserialize_primitive(tag_name, stack, |s| Ok(bool::from_str(&s).unwrap()))
4467    }
4468}
4469#[allow(dead_code)]
4470struct NotificationARNDeserializer;
4471impl NotificationARNDeserializer {
4472    #[allow(dead_code, unused_variables)]
4473    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
4474        xml_util::deserialize_primitive(tag_name, stack, Ok)
4475    }
4476}
4477#[allow(dead_code)]
4478struct NotificationARNsDeserializer;
4479impl NotificationARNsDeserializer {
4480    #[allow(dead_code, unused_variables)]
4481    fn deserialize<T: Peek + Next>(
4482        tag_name: &str,
4483        stack: &mut T,
4484    ) -> Result<Vec<String>, XmlParseError> {
4485        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
4486            if name == "member" {
4487                obj.push(NotificationARNDeserializer::deserialize("member", stack)?);
4488            } else {
4489                skip_tree(stack);
4490            }
4491            Ok(())
4492        })
4493    }
4494}
4495
4496/// Serialize `NotificationARNs` contents to a `SignedRequest`.
4497struct NotificationARNsSerializer;
4498impl NotificationARNsSerializer {
4499    fn serialize(params: &mut Params, name: &str, obj: &Vec<String>) {
4500        for (index, obj) in obj.iter().enumerate() {
4501            let key = format!("{}.member.{}", name, index + 1);
4502            params.put(&key, &obj);
4503        }
4504    }
4505}
4506
4507#[allow(dead_code)]
4508struct OptionalSecureUrlDeserializer;
4509impl OptionalSecureUrlDeserializer {
4510    #[allow(dead_code, unused_variables)]
4511    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
4512        xml_util::deserialize_primitive(tag_name, stack, Ok)
4513    }
4514}
4515#[allow(dead_code)]
4516struct OrganizationalUnitIdDeserializer;
4517impl OrganizationalUnitIdDeserializer {
4518    #[allow(dead_code, unused_variables)]
4519    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
4520        xml_util::deserialize_primitive(tag_name, stack, Ok)
4521    }
4522}
4523#[allow(dead_code)]
4524struct OrganizationalUnitIdListDeserializer;
4525impl OrganizationalUnitIdListDeserializer {
4526    #[allow(dead_code, unused_variables)]
4527    fn deserialize<T: Peek + Next>(
4528        tag_name: &str,
4529        stack: &mut T,
4530    ) -> Result<Vec<String>, XmlParseError> {
4531        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
4532            if name == "member" {
4533                obj.push(OrganizationalUnitIdDeserializer::deserialize(
4534                    "member", stack,
4535                )?);
4536            } else {
4537                skip_tree(stack);
4538            }
4539            Ok(())
4540        })
4541    }
4542}
4543
4544/// Serialize `OrganizationalUnitIdList` contents to a `SignedRequest`.
4545struct OrganizationalUnitIdListSerializer;
4546impl OrganizationalUnitIdListSerializer {
4547    fn serialize(params: &mut Params, name: &str, obj: &Vec<String>) {
4548        for (index, obj) in obj.iter().enumerate() {
4549            let key = format!("{}.member.{}", name, index + 1);
4550            params.put(&key, &obj);
4551        }
4552    }
4553}
4554
4555/// <p>The Output data type.</p>
4556#[derive(Clone, Debug, Default, PartialEq)]
4557#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
4558pub struct Output {
4559    /// <p>User defined description associated with the output.</p>
4560    pub description: Option<String>,
4561    /// <p>The name of the export associated with the output.</p>
4562    pub export_name: Option<String>,
4563    /// <p>The key associated with the output.</p>
4564    pub output_key: Option<String>,
4565    /// <p>The value associated with the output.</p>
4566    pub output_value: Option<String>,
4567}
4568
4569#[allow(dead_code)]
4570struct OutputDeserializer;
4571impl OutputDeserializer {
4572    #[allow(dead_code, unused_variables)]
4573    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<Output, XmlParseError> {
4574        deserialize_elements::<_, Output, _>(tag_name, stack, |name, stack, obj| {
4575            match name {
4576                "Description" => {
4577                    obj.description =
4578                        Some(DescriptionDeserializer::deserialize("Description", stack)?);
4579                }
4580                "ExportName" => {
4581                    obj.export_name =
4582                        Some(ExportNameDeserializer::deserialize("ExportName", stack)?);
4583                }
4584                "OutputKey" => {
4585                    obj.output_key = Some(OutputKeyDeserializer::deserialize("OutputKey", stack)?);
4586                }
4587                "OutputValue" => {
4588                    obj.output_value =
4589                        Some(OutputValueDeserializer::deserialize("OutputValue", stack)?);
4590                }
4591                _ => skip_tree(stack),
4592            }
4593            Ok(())
4594        })
4595    }
4596}
4597#[allow(dead_code)]
4598struct OutputKeyDeserializer;
4599impl OutputKeyDeserializer {
4600    #[allow(dead_code, unused_variables)]
4601    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
4602        xml_util::deserialize_primitive(tag_name, stack, Ok)
4603    }
4604}
4605#[allow(dead_code)]
4606struct OutputValueDeserializer;
4607impl OutputValueDeserializer {
4608    #[allow(dead_code, unused_variables)]
4609    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
4610        xml_util::deserialize_primitive(tag_name, stack, Ok)
4611    }
4612}
4613#[allow(dead_code)]
4614struct OutputsDeserializer;
4615impl OutputsDeserializer {
4616    #[allow(dead_code, unused_variables)]
4617    fn deserialize<T: Peek + Next>(
4618        tag_name: &str,
4619        stack: &mut T,
4620    ) -> Result<Vec<Output>, XmlParseError> {
4621        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
4622            if name == "member" {
4623                obj.push(OutputDeserializer::deserialize("member", stack)?);
4624            } else {
4625                skip_tree(stack);
4626            }
4627            Ok(())
4628        })
4629    }
4630}
4631/// <p>The Parameter data type.</p>
4632#[derive(Clone, Debug, Default, PartialEq)]
4633#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
4634#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
4635pub struct Parameter {
4636    /// <p>The key associated with the parameter. If you don't specify a key and value for a particular parameter, AWS CloudFormation uses the default value that is specified in your template.</p>
4637    pub parameter_key: Option<String>,
4638    /// <p>The input value associated with the parameter.</p>
4639    pub parameter_value: Option<String>,
4640    /// <p>Read-only. The value that corresponds to a Systems Manager parameter key. This field is returned only for <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html#aws-ssm-parameter-types"> <code>SSM</code> parameter types</a> in the template.</p>
4641    pub resolved_value: Option<String>,
4642    /// <p>During a stack update, use the existing parameter value that the stack is using for a given parameter key. If you specify <code>true</code>, do not specify a parameter value.</p>
4643    pub use_previous_value: Option<bool>,
4644}
4645
4646#[allow(dead_code)]
4647struct ParameterDeserializer;
4648impl ParameterDeserializer {
4649    #[allow(dead_code, unused_variables)]
4650    fn deserialize<T: Peek + Next>(
4651        tag_name: &str,
4652        stack: &mut T,
4653    ) -> Result<Parameter, XmlParseError> {
4654        deserialize_elements::<_, Parameter, _>(tag_name, stack, |name, stack, obj| {
4655            match name {
4656                "ParameterKey" => {
4657                    obj.parameter_key = Some(ParameterKeyDeserializer::deserialize(
4658                        "ParameterKey",
4659                        stack,
4660                    )?);
4661                }
4662                "ParameterValue" => {
4663                    obj.parameter_value = Some(ParameterValueDeserializer::deserialize(
4664                        "ParameterValue",
4665                        stack,
4666                    )?);
4667                }
4668                "ResolvedValue" => {
4669                    obj.resolved_value = Some(ParameterValueDeserializer::deserialize(
4670                        "ResolvedValue",
4671                        stack,
4672                    )?);
4673                }
4674                "UsePreviousValue" => {
4675                    obj.use_previous_value = Some(UsePreviousValueDeserializer::deserialize(
4676                        "UsePreviousValue",
4677                        stack,
4678                    )?);
4679                }
4680                _ => skip_tree(stack),
4681            }
4682            Ok(())
4683        })
4684    }
4685}
4686
4687/// Serialize `Parameter` contents to a `SignedRequest`.
4688struct ParameterSerializer;
4689impl ParameterSerializer {
4690    fn serialize(params: &mut Params, name: &str, obj: &Parameter) {
4691        let mut prefix = name.to_string();
4692        if prefix != "" {
4693            prefix.push_str(".");
4694        }
4695
4696        if let Some(ref field_value) = obj.parameter_key {
4697            params.put(&format!("{}{}", prefix, "ParameterKey"), &field_value);
4698        }
4699        if let Some(ref field_value) = obj.parameter_value {
4700            params.put(&format!("{}{}", prefix, "ParameterValue"), &field_value);
4701        }
4702        if let Some(ref field_value) = obj.resolved_value {
4703            params.put(&format!("{}{}", prefix, "ResolvedValue"), &field_value);
4704        }
4705        if let Some(ref field_value) = obj.use_previous_value {
4706            params.put(&format!("{}{}", prefix, "UsePreviousValue"), &field_value);
4707        }
4708    }
4709}
4710
4711/// <p>A set of criteria that AWS CloudFormation uses to validate parameter values. Although other constraints might be defined in the stack template, AWS CloudFormation returns only the <code>AllowedValues</code> property.</p>
4712#[derive(Clone, Debug, Default, PartialEq)]
4713#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
4714pub struct ParameterConstraints {
4715    /// <p>A list of values that are permitted for a parameter.</p>
4716    pub allowed_values: Option<Vec<String>>,
4717}
4718
4719#[allow(dead_code)]
4720struct ParameterConstraintsDeserializer;
4721impl ParameterConstraintsDeserializer {
4722    #[allow(dead_code, unused_variables)]
4723    fn deserialize<T: Peek + Next>(
4724        tag_name: &str,
4725        stack: &mut T,
4726    ) -> Result<ParameterConstraints, XmlParseError> {
4727        deserialize_elements::<_, ParameterConstraints, _>(tag_name, stack, |name, stack, obj| {
4728            match name {
4729                "AllowedValues" => {
4730                    obj.allowed_values.get_or_insert(vec![]).extend(
4731                        AllowedValuesDeserializer::deserialize("AllowedValues", stack)?,
4732                    );
4733                }
4734                _ => skip_tree(stack),
4735            }
4736            Ok(())
4737        })
4738    }
4739}
4740/// <p>The ParameterDeclaration data type.</p>
4741#[derive(Clone, Debug, Default, PartialEq)]
4742#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
4743pub struct ParameterDeclaration {
4744    /// <p>The default value of the parameter.</p>
4745    pub default_value: Option<String>,
4746    /// <p>The description that is associate with the parameter.</p>
4747    pub description: Option<String>,
4748    /// <p>Flag that indicates whether the parameter value is shown as plain text in logs and in the AWS Management Console.</p>
4749    pub no_echo: Option<bool>,
4750    /// <p>The criteria that AWS CloudFormation uses to validate parameter values.</p>
4751    pub parameter_constraints: Option<ParameterConstraints>,
4752    /// <p>The name that is associated with the parameter.</p>
4753    pub parameter_key: Option<String>,
4754    /// <p>The type of parameter.</p>
4755    pub parameter_type: Option<String>,
4756}
4757
4758#[allow(dead_code)]
4759struct ParameterDeclarationDeserializer;
4760impl ParameterDeclarationDeserializer {
4761    #[allow(dead_code, unused_variables)]
4762    fn deserialize<T: Peek + Next>(
4763        tag_name: &str,
4764        stack: &mut T,
4765    ) -> Result<ParameterDeclaration, XmlParseError> {
4766        deserialize_elements::<_, ParameterDeclaration, _>(tag_name, stack, |name, stack, obj| {
4767            match name {
4768                "DefaultValue" => {
4769                    obj.default_value = Some(ParameterValueDeserializer::deserialize(
4770                        "DefaultValue",
4771                        stack,
4772                    )?);
4773                }
4774                "Description" => {
4775                    obj.description =
4776                        Some(DescriptionDeserializer::deserialize("Description", stack)?);
4777                }
4778                "NoEcho" => {
4779                    obj.no_echo = Some(NoEchoDeserializer::deserialize("NoEcho", stack)?);
4780                }
4781                "ParameterConstraints" => {
4782                    obj.parameter_constraints =
4783                        Some(ParameterConstraintsDeserializer::deserialize(
4784                            "ParameterConstraints",
4785                            stack,
4786                        )?);
4787                }
4788                "ParameterKey" => {
4789                    obj.parameter_key = Some(ParameterKeyDeserializer::deserialize(
4790                        "ParameterKey",
4791                        stack,
4792                    )?);
4793                }
4794                "ParameterType" => {
4795                    obj.parameter_type = Some(ParameterTypeDeserializer::deserialize(
4796                        "ParameterType",
4797                        stack,
4798                    )?);
4799                }
4800                _ => skip_tree(stack),
4801            }
4802            Ok(())
4803        })
4804    }
4805}
4806#[allow(dead_code)]
4807struct ParameterDeclarationsDeserializer;
4808impl ParameterDeclarationsDeserializer {
4809    #[allow(dead_code, unused_variables)]
4810    fn deserialize<T: Peek + Next>(
4811        tag_name: &str,
4812        stack: &mut T,
4813    ) -> Result<Vec<ParameterDeclaration>, XmlParseError> {
4814        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
4815            if name == "member" {
4816                obj.push(ParameterDeclarationDeserializer::deserialize(
4817                    "member", stack,
4818                )?);
4819            } else {
4820                skip_tree(stack);
4821            }
4822            Ok(())
4823        })
4824    }
4825}
4826#[allow(dead_code)]
4827struct ParameterKeyDeserializer;
4828impl ParameterKeyDeserializer {
4829    #[allow(dead_code, unused_variables)]
4830    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
4831        xml_util::deserialize_primitive(tag_name, stack, Ok)
4832    }
4833}
4834#[allow(dead_code)]
4835struct ParameterTypeDeserializer;
4836impl ParameterTypeDeserializer {
4837    #[allow(dead_code, unused_variables)]
4838    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
4839        xml_util::deserialize_primitive(tag_name, stack, Ok)
4840    }
4841}
4842#[allow(dead_code)]
4843struct ParameterValueDeserializer;
4844impl ParameterValueDeserializer {
4845    #[allow(dead_code, unused_variables)]
4846    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
4847        xml_util::deserialize_primitive(tag_name, stack, Ok)
4848    }
4849}
4850#[allow(dead_code)]
4851struct ParametersDeserializer;
4852impl ParametersDeserializer {
4853    #[allow(dead_code, unused_variables)]
4854    fn deserialize<T: Peek + Next>(
4855        tag_name: &str,
4856        stack: &mut T,
4857    ) -> Result<Vec<Parameter>, XmlParseError> {
4858        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
4859            if name == "member" {
4860                obj.push(ParameterDeserializer::deserialize("member", stack)?);
4861            } else {
4862                skip_tree(stack);
4863            }
4864            Ok(())
4865        })
4866    }
4867}
4868
4869/// Serialize `Parameters` contents to a `SignedRequest`.
4870struct ParametersSerializer;
4871impl ParametersSerializer {
4872    fn serialize(params: &mut Params, name: &str, obj: &Vec<Parameter>) {
4873        for (index, obj) in obj.iter().enumerate() {
4874            let key = format!("{}.member.{}", name, index + 1);
4875            ParameterSerializer::serialize(params, &key, obj);
4876        }
4877    }
4878}
4879
4880#[allow(dead_code)]
4881struct PermissionModelsDeserializer;
4882impl PermissionModelsDeserializer {
4883    #[allow(dead_code, unused_variables)]
4884    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
4885        xml_util::deserialize_primitive(tag_name, stack, Ok)
4886    }
4887}
4888#[allow(dead_code)]
4889struct PhysicalResourceIdDeserializer;
4890impl PhysicalResourceIdDeserializer {
4891    #[allow(dead_code, unused_variables)]
4892    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
4893        xml_util::deserialize_primitive(tag_name, stack, Ok)
4894    }
4895}
4896#[allow(dead_code)]
4897struct PhysicalResourceIdContextDeserializer;
4898impl PhysicalResourceIdContextDeserializer {
4899    #[allow(dead_code, unused_variables)]
4900    fn deserialize<T: Peek + Next>(
4901        tag_name: &str,
4902        stack: &mut T,
4903    ) -> Result<Vec<PhysicalResourceIdContextKeyValuePair>, XmlParseError> {
4904        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
4905            if name == "member" {
4906                obj.push(
4907                    PhysicalResourceIdContextKeyValuePairDeserializer::deserialize(
4908                        "member", stack,
4909                    )?,
4910                );
4911            } else {
4912                skip_tree(stack);
4913            }
4914            Ok(())
4915        })
4916    }
4917}
4918/// <p>Context information that enables AWS CloudFormation to uniquely identify a resource. AWS CloudFormation uses context key-value pairs in cases where a resource's logical and physical IDs are not enough to uniquely identify that resource. Each context key-value pair specifies a resource that contains the targeted resource.</p>
4919#[derive(Clone, Debug, Default, PartialEq)]
4920#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
4921pub struct PhysicalResourceIdContextKeyValuePair {
4922    /// <p>The resource context key.</p>
4923    pub key: String,
4924    /// <p>The resource context value.</p>
4925    pub value: String,
4926}
4927
4928#[allow(dead_code)]
4929struct PhysicalResourceIdContextKeyValuePairDeserializer;
4930impl PhysicalResourceIdContextKeyValuePairDeserializer {
4931    #[allow(dead_code, unused_variables)]
4932    fn deserialize<T: Peek + Next>(
4933        tag_name: &str,
4934        stack: &mut T,
4935    ) -> Result<PhysicalResourceIdContextKeyValuePair, XmlParseError> {
4936        deserialize_elements::<_, PhysicalResourceIdContextKeyValuePair, _>(
4937            tag_name,
4938            stack,
4939            |name, stack, obj| {
4940                match name {
4941                    "Key" => {
4942                        obj.key = KeyDeserializer::deserialize("Key", stack)?;
4943                    }
4944                    "Value" => {
4945                        obj.value = ValueDeserializer::deserialize("Value", stack)?;
4946                    }
4947                    _ => skip_tree(stack),
4948                }
4949                Ok(())
4950            },
4951        )
4952    }
4953}
4954#[allow(dead_code)]
4955struct PropertiesDeserializer;
4956impl PropertiesDeserializer {
4957    #[allow(dead_code, unused_variables)]
4958    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
4959        xml_util::deserialize_primitive(tag_name, stack, Ok)
4960    }
4961}
4962/// <p>Information about a resource property whose actual value differs from its expected value, as defined in the stack template and any values specified as template parameters. These will be present only for resources whose <code>StackResourceDriftStatus</code> is <code>MODIFIED</code>. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html">Detecting Unregulated Configuration Changes to Stacks and Resources</a>.</p>
4963#[derive(Clone, Debug, Default, PartialEq)]
4964#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
4965pub struct PropertyDifference {
4966    /// <p>The actual property value of the resource property.</p>
4967    pub actual_value: String,
4968    /// <p><p>The type of property difference.</p> <ul> <li> <p> <code>ADD</code>: A value has been added to a resource property that is an array or list data type.</p> </li> <li> <p> <code>REMOVE</code>: The property has been removed from the current resource configuration.</p> </li> <li> <p> <code>NOT_EQUAL</code>: The current property value differs from its expected value (as defined in the stack template and any values specified as template parameters).</p> </li> </ul></p>
4969    pub difference_type: String,
4970    /// <p>The expected property value of the resource property, as defined in the stack template and any values specified as template parameters.</p>
4971    pub expected_value: String,
4972    /// <p>The fully-qualified path to the resource property.</p>
4973    pub property_path: String,
4974}
4975
4976#[allow(dead_code)]
4977struct PropertyDifferenceDeserializer;
4978impl PropertyDifferenceDeserializer {
4979    #[allow(dead_code, unused_variables)]
4980    fn deserialize<T: Peek + Next>(
4981        tag_name: &str,
4982        stack: &mut T,
4983    ) -> Result<PropertyDifference, XmlParseError> {
4984        deserialize_elements::<_, PropertyDifference, _>(tag_name, stack, |name, stack, obj| {
4985            match name {
4986                "ActualValue" => {
4987                    obj.actual_value =
4988                        PropertyValueDeserializer::deserialize("ActualValue", stack)?;
4989                }
4990                "DifferenceType" => {
4991                    obj.difference_type =
4992                        DifferenceTypeDeserializer::deserialize("DifferenceType", stack)?;
4993                }
4994                "ExpectedValue" => {
4995                    obj.expected_value =
4996                        PropertyValueDeserializer::deserialize("ExpectedValue", stack)?;
4997                }
4998                "PropertyPath" => {
4999                    obj.property_path =
5000                        PropertyPathDeserializer::deserialize("PropertyPath", stack)?;
5001                }
5002                _ => skip_tree(stack),
5003            }
5004            Ok(())
5005        })
5006    }
5007}
5008#[allow(dead_code)]
5009struct PropertyDifferencesDeserializer;
5010impl PropertyDifferencesDeserializer {
5011    #[allow(dead_code, unused_variables)]
5012    fn deserialize<T: Peek + Next>(
5013        tag_name: &str,
5014        stack: &mut T,
5015    ) -> Result<Vec<PropertyDifference>, XmlParseError> {
5016        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
5017            if name == "member" {
5018                obj.push(PropertyDifferenceDeserializer::deserialize(
5019                    "member", stack,
5020                )?);
5021            } else {
5022                skip_tree(stack);
5023            }
5024            Ok(())
5025        })
5026    }
5027}
5028#[allow(dead_code)]
5029struct PropertyNameDeserializer;
5030impl PropertyNameDeserializer {
5031    #[allow(dead_code, unused_variables)]
5032    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
5033        xml_util::deserialize_primitive(tag_name, stack, Ok)
5034    }
5035}
5036#[allow(dead_code)]
5037struct PropertyPathDeserializer;
5038impl PropertyPathDeserializer {
5039    #[allow(dead_code, unused_variables)]
5040    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
5041        xml_util::deserialize_primitive(tag_name, stack, Ok)
5042    }
5043}
5044#[allow(dead_code)]
5045struct PropertyValueDeserializer;
5046impl PropertyValueDeserializer {
5047    #[allow(dead_code, unused_variables)]
5048    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
5049        xml_util::deserialize_primitive(tag_name, stack, Ok)
5050    }
5051}
5052#[allow(dead_code)]
5053struct ProvisioningTypeDeserializer;
5054impl ProvisioningTypeDeserializer {
5055    #[allow(dead_code, unused_variables)]
5056    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
5057        xml_util::deserialize_primitive(tag_name, stack, Ok)
5058    }
5059}
5060#[allow(dead_code)]
5061struct ReasonDeserializer;
5062impl ReasonDeserializer {
5063    #[allow(dead_code, unused_variables)]
5064    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
5065        xml_util::deserialize_primitive(tag_name, stack, Ok)
5066    }
5067}
5068#[derive(Clone, Debug, Default, PartialEq)]
5069#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
5070pub struct RecordHandlerProgressInput {
5071    /// <p>Reserved for use by the <a href="https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/what-is-cloudformation-cli.html">CloudFormation CLI</a>.</p>
5072    pub bearer_token: String,
5073    /// <p>Reserved for use by the <a href="https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/what-is-cloudformation-cli.html">CloudFormation CLI</a>.</p>
5074    pub client_request_token: Option<String>,
5075    /// <p>Reserved for use by the <a href="https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/what-is-cloudformation-cli.html">CloudFormation CLI</a>.</p>
5076    pub current_operation_status: Option<String>,
5077    /// <p>Reserved for use by the <a href="https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/what-is-cloudformation-cli.html">CloudFormation CLI</a>.</p>
5078    pub error_code: Option<String>,
5079    /// <p>Reserved for use by the <a href="https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/what-is-cloudformation-cli.html">CloudFormation CLI</a>.</p>
5080    pub operation_status: String,
5081    /// <p>Reserved for use by the <a href="https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/what-is-cloudformation-cli.html">CloudFormation CLI</a>.</p>
5082    pub resource_model: Option<String>,
5083    /// <p>Reserved for use by the <a href="https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/what-is-cloudformation-cli.html">CloudFormation CLI</a>.</p>
5084    pub status_message: Option<String>,
5085}
5086
5087/// Serialize `RecordHandlerProgressInput` contents to a `SignedRequest`.
5088struct RecordHandlerProgressInputSerializer;
5089impl RecordHandlerProgressInputSerializer {
5090    fn serialize(params: &mut Params, name: &str, obj: &RecordHandlerProgressInput) {
5091        let mut prefix = name.to_string();
5092        if prefix != "" {
5093            prefix.push_str(".");
5094        }
5095
5096        params.put(&format!("{}{}", prefix, "BearerToken"), &obj.bearer_token);
5097        if let Some(ref field_value) = obj.client_request_token {
5098            params.put(&format!("{}{}", prefix, "ClientRequestToken"), &field_value);
5099        }
5100        if let Some(ref field_value) = obj.current_operation_status {
5101            params.put(
5102                &format!("{}{}", prefix, "CurrentOperationStatus"),
5103                &field_value,
5104            );
5105        }
5106        if let Some(ref field_value) = obj.error_code {
5107            params.put(&format!("{}{}", prefix, "ErrorCode"), &field_value);
5108        }
5109        params.put(
5110            &format!("{}{}", prefix, "OperationStatus"),
5111            &obj.operation_status,
5112        );
5113        if let Some(ref field_value) = obj.resource_model {
5114            params.put(&format!("{}{}", prefix, "ResourceModel"), &field_value);
5115        }
5116        if let Some(ref field_value) = obj.status_message {
5117            params.put(&format!("{}{}", prefix, "StatusMessage"), &field_value);
5118        }
5119    }
5120}
5121
5122#[derive(Clone, Debug, Default, PartialEq)]
5123#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
5124pub struct RecordHandlerProgressOutput {}
5125
5126#[allow(dead_code)]
5127struct RecordHandlerProgressOutputDeserializer;
5128impl RecordHandlerProgressOutputDeserializer {
5129    #[allow(dead_code, unused_variables)]
5130    fn deserialize<T: Peek + Next>(
5131        tag_name: &str,
5132        stack: &mut T,
5133    ) -> Result<RecordHandlerProgressOutput, XmlParseError> {
5134        xml_util::start_element(tag_name, stack)?;
5135
5136        let obj = RecordHandlerProgressOutput::default();
5137
5138        xml_util::end_element(tag_name, stack)?;
5139
5140        Ok(obj)
5141    }
5142}
5143#[allow(dead_code)]
5144struct RegionDeserializer;
5145impl RegionDeserializer {
5146    #[allow(dead_code, unused_variables)]
5147    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
5148        xml_util::deserialize_primitive(tag_name, stack, Ok)
5149    }
5150}
5151#[allow(dead_code)]
5152struct RegionListDeserializer;
5153impl RegionListDeserializer {
5154    #[allow(dead_code, unused_variables)]
5155    fn deserialize<T: Peek + Next>(
5156        tag_name: &str,
5157        stack: &mut T,
5158    ) -> Result<Vec<String>, XmlParseError> {
5159        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
5160            if name == "member" {
5161                obj.push(RegionDeserializer::deserialize("member", stack)?);
5162            } else {
5163                skip_tree(stack);
5164            }
5165            Ok(())
5166        })
5167    }
5168}
5169
5170/// Serialize `RegionList` contents to a `SignedRequest`.
5171struct RegionListSerializer;
5172impl RegionListSerializer {
5173    fn serialize(params: &mut Params, name: &str, obj: &Vec<String>) {
5174        for (index, obj) in obj.iter().enumerate() {
5175            let key = format!("{}.member.{}", name, index + 1);
5176            params.put(&key, &obj);
5177        }
5178    }
5179}
5180
5181#[derive(Clone, Debug, Default, PartialEq)]
5182#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
5183pub struct RegisterTypeInput {
5184    /// <p>A unique identifier that acts as an idempotency key for this registration request. Specifying a client request token prevents CloudFormation from generating more than one version of a type from the same registeration request, even if the request is submitted multiple times. </p>
5185    pub client_request_token: Option<String>,
5186    /// <p>The Amazon Resource Name (ARN) of the IAM role for CloudFormation to assume when invoking the resource provider. If your resource type calls AWS APIs in any of its handlers, you must create an <i> <a href="https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html">IAM execution role</a> </i> that includes the necessary permissions to call those AWS APIs, and provision that execution role in your account. When CloudFormation needs to invoke the resource provider handler, CloudFormation assumes this execution role to create a temporary session token, which it then passes to the resource provider handler, thereby supplying your resource provider with the appropriate credentials.</p>
5187    pub execution_role_arn: Option<String>,
5188    /// <p>Specifies logging configuration information for a type.</p>
5189    pub logging_config: Option<LoggingConfig>,
5190    /// <p><p>A url to the S3 bucket containing the schema handler package that contains the schema, event handlers, and associated files for the type you want to register.</p> <p>For information on generating a schema handler package for the type you want to register, see <a href="https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/resource-type-cli-submit.html">submit</a> in the <i>CloudFormation CLI User Guide</i>.</p> <note> <p>As part of registering a resource provider type, CloudFormation must be able to access the S3 bucket which contains the schema handler package for that resource provider. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/registry.html#registry-register-permissions">IAM Permissions for Registering a Resource Provider</a> in the <i>AWS CloudFormation User Guide</i>.</p> </note></p>
5191    pub schema_handler_package: String,
5192    /// <p>The kind of type.</p> <p>Currently, the only valid value is <code>RESOURCE</code>.</p>
5193    pub type_: Option<String>,
5194    /// <p><p>The name of the type being registered.</p> <p>We recommend that type names adhere to the following pattern: <i>company<em>or</em>organization</i>::<i>service</i>::<i>type</i>.</p> <note> <p>The following organization namespaces are reserved and cannot be used in your resource type names:</p> <ul> <li> <p> <code>Alexa</code> </p> </li> <li> <p> <code>AMZN</code> </p> </li> <li> <p> <code>Amazon</code> </p> </li> <li> <p> <code>AWS</code> </p> </li> <li> <p> <code>Custom</code> </p> </li> <li> <p> <code>Dev</code> </p> </li> </ul> </note></p>
5195    pub type_name: String,
5196}
5197
5198/// Serialize `RegisterTypeInput` contents to a `SignedRequest`.
5199struct RegisterTypeInputSerializer;
5200impl RegisterTypeInputSerializer {
5201    fn serialize(params: &mut Params, name: &str, obj: &RegisterTypeInput) {
5202        let mut prefix = name.to_string();
5203        if prefix != "" {
5204            prefix.push_str(".");
5205        }
5206
5207        if let Some(ref field_value) = obj.client_request_token {
5208            params.put(&format!("{}{}", prefix, "ClientRequestToken"), &field_value);
5209        }
5210        if let Some(ref field_value) = obj.execution_role_arn {
5211            params.put(&format!("{}{}", prefix, "ExecutionRoleArn"), &field_value);
5212        }
5213        if let Some(ref field_value) = obj.logging_config {
5214            LoggingConfigSerializer::serialize(
5215                params,
5216                &format!("{}{}", prefix, "LoggingConfig"),
5217                field_value,
5218            );
5219        }
5220        params.put(
5221            &format!("{}{}", prefix, "SchemaHandlerPackage"),
5222            &obj.schema_handler_package,
5223        );
5224        if let Some(ref field_value) = obj.type_ {
5225            params.put(&format!("{}{}", prefix, "Type"), &field_value);
5226        }
5227        params.put(&format!("{}{}", prefix, "TypeName"), &obj.type_name);
5228    }
5229}
5230
5231#[derive(Clone, Debug, Default, PartialEq)]
5232#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
5233pub struct RegisterTypeOutput {
5234    /// <p>The identifier for this registration request.</p> <p>Use this registration token when calling <code> <a>DescribeTypeRegistration</a> </code>, which returns information about the status and IDs of the type registration. </p>
5235    pub registration_token: Option<String>,
5236}
5237
5238#[allow(dead_code)]
5239struct RegisterTypeOutputDeserializer;
5240impl RegisterTypeOutputDeserializer {
5241    #[allow(dead_code, unused_variables)]
5242    fn deserialize<T: Peek + Next>(
5243        tag_name: &str,
5244        stack: &mut T,
5245    ) -> Result<RegisterTypeOutput, XmlParseError> {
5246        deserialize_elements::<_, RegisterTypeOutput, _>(tag_name, stack, |name, stack, obj| {
5247            match name {
5248                "RegistrationToken" => {
5249                    obj.registration_token = Some(RegistrationTokenDeserializer::deserialize(
5250                        "RegistrationToken",
5251                        stack,
5252                    )?);
5253                }
5254                _ => skip_tree(stack),
5255            }
5256            Ok(())
5257        })
5258    }
5259}
5260#[allow(dead_code)]
5261struct RegistrationStatusDeserializer;
5262impl RegistrationStatusDeserializer {
5263    #[allow(dead_code, unused_variables)]
5264    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
5265        xml_util::deserialize_primitive(tag_name, stack, Ok)
5266    }
5267}
5268#[allow(dead_code)]
5269struct RegistrationTokenDeserializer;
5270impl RegistrationTokenDeserializer {
5271    #[allow(dead_code, unused_variables)]
5272    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
5273        xml_util::deserialize_primitive(tag_name, stack, Ok)
5274    }
5275}
5276#[allow(dead_code)]
5277struct RegistrationTokenListDeserializer;
5278impl RegistrationTokenListDeserializer {
5279    #[allow(dead_code, unused_variables)]
5280    fn deserialize<T: Peek + Next>(
5281        tag_name: &str,
5282        stack: &mut T,
5283    ) -> Result<Vec<String>, XmlParseError> {
5284        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
5285            if name == "member" {
5286                obj.push(RegistrationTokenDeserializer::deserialize("member", stack)?);
5287            } else {
5288                skip_tree(stack);
5289            }
5290            Ok(())
5291        })
5292    }
5293}
5294#[allow(dead_code)]
5295struct RegistryTypeDeserializer;
5296impl RegistryTypeDeserializer {
5297    #[allow(dead_code, unused_variables)]
5298    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
5299        xml_util::deserialize_primitive(tag_name, stack, Ok)
5300    }
5301}
5302#[allow(dead_code)]
5303struct ReplacementDeserializer;
5304impl ReplacementDeserializer {
5305    #[allow(dead_code, unused_variables)]
5306    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
5307        xml_util::deserialize_primitive(tag_name, stack, Ok)
5308    }
5309}
5310#[allow(dead_code)]
5311struct RequiresRecreationDeserializer;
5312impl RequiresRecreationDeserializer {
5313    #[allow(dead_code, unused_variables)]
5314    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
5315        xml_util::deserialize_primitive(tag_name, stack, Ok)
5316    }
5317}
5318#[allow(dead_code)]
5319struct ResourceAttributeDeserializer;
5320impl ResourceAttributeDeserializer {
5321    #[allow(dead_code, unused_variables)]
5322    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
5323        xml_util::deserialize_primitive(tag_name, stack, Ok)
5324    }
5325}
5326/// <p>The <code>ResourceChange</code> structure describes the resource and the action that AWS CloudFormation will perform on it if you execute this change set.</p>
5327#[derive(Clone, Debug, Default, PartialEq)]
5328#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
5329pub struct ResourceChange {
5330    /// <p>The action that AWS CloudFormation takes on the resource, such as <code>Add</code> (adds a new resource), <code>Modify</code> (changes a resource), or <code>Remove</code> (deletes a resource).</p>
5331    pub action: Option<String>,
5332    /// <p>For the <code>Modify</code> action, a list of <code>ResourceChangeDetail</code> structures that describes the changes that AWS CloudFormation will make to the resource. </p>
5333    pub details: Option<Vec<ResourceChangeDetail>>,
5334    /// <p>The resource's logical ID, which is defined in the stack's template.</p>
5335    pub logical_resource_id: Option<String>,
5336    /// <p>The resource's physical ID (resource name). Resources that you are adding don't have physical IDs because they haven't been created.</p>
5337    pub physical_resource_id: Option<String>,
5338    /// <p>For the <code>Modify</code> action, indicates whether AWS CloudFormation will replace the resource by creating a new one and deleting the old one. This value depends on the value of the <code>RequiresRecreation</code> property in the <code>ResourceTargetDefinition</code> structure. For example, if the <code>RequiresRecreation</code> field is <code>Always</code> and the <code>Evaluation</code> field is <code>Static</code>, <code>Replacement</code> is <code>True</code>. If the <code>RequiresRecreation</code> field is <code>Always</code> and the <code>Evaluation</code> field is <code>Dynamic</code>, <code>Replacement</code> is <code>Conditionally</code>.</p> <p>If you have multiple changes with different <code>RequiresRecreation</code> values, the <code>Replacement</code> value depends on the change with the most impact. A <code>RequiresRecreation</code> value of <code>Always</code> has the most impact, followed by <code>Conditionally</code>, and then <code>Never</code>.</p>
5339    pub replacement: Option<String>,
5340    /// <p>The type of AWS CloudFormation resource, such as <code>AWS::S3::Bucket</code>.</p>
5341    pub resource_type: Option<String>,
5342    /// <p>For the <code>Modify</code> action, indicates which resource attribute is triggering this update, such as a change in the resource attribute's <code>Metadata</code>, <code>Properties</code>, or <code>Tags</code>.</p>
5343    pub scope: Option<Vec<String>>,
5344}
5345
5346#[allow(dead_code)]
5347struct ResourceChangeDeserializer;
5348impl ResourceChangeDeserializer {
5349    #[allow(dead_code, unused_variables)]
5350    fn deserialize<T: Peek + Next>(
5351        tag_name: &str,
5352        stack: &mut T,
5353    ) -> Result<ResourceChange, XmlParseError> {
5354        deserialize_elements::<_, ResourceChange, _>(tag_name, stack, |name, stack, obj| {
5355            match name {
5356                "Action" => {
5357                    obj.action = Some(ChangeActionDeserializer::deserialize("Action", stack)?);
5358                }
5359                "Details" => {
5360                    obj.details.get_or_insert(vec![]).extend(
5361                        ResourceChangeDetailsDeserializer::deserialize("Details", stack)?,
5362                    );
5363                }
5364                "LogicalResourceId" => {
5365                    obj.logical_resource_id = Some(LogicalResourceIdDeserializer::deserialize(
5366                        "LogicalResourceId",
5367                        stack,
5368                    )?);
5369                }
5370                "PhysicalResourceId" => {
5371                    obj.physical_resource_id = Some(PhysicalResourceIdDeserializer::deserialize(
5372                        "PhysicalResourceId",
5373                        stack,
5374                    )?);
5375                }
5376                "Replacement" => {
5377                    obj.replacement =
5378                        Some(ReplacementDeserializer::deserialize("Replacement", stack)?);
5379                }
5380                "ResourceType" => {
5381                    obj.resource_type = Some(ResourceTypeDeserializer::deserialize(
5382                        "ResourceType",
5383                        stack,
5384                    )?);
5385                }
5386                "Scope" => {
5387                    obj.scope
5388                        .get_or_insert(vec![])
5389                        .extend(ScopeDeserializer::deserialize("Scope", stack)?);
5390                }
5391                _ => skip_tree(stack),
5392            }
5393            Ok(())
5394        })
5395    }
5396}
5397/// <p>For a resource with <code>Modify</code> as the action, the <code>ResourceChange</code> structure describes the changes AWS CloudFormation will make to that resource.</p>
5398#[derive(Clone, Debug, Default, PartialEq)]
5399#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
5400pub struct ResourceChangeDetail {
5401    /// <p>The identity of the entity that triggered this change. This entity is a member of the group that is specified by the <code>ChangeSource</code> field. For example, if you modified the value of the <code>KeyPairName</code> parameter, the <code>CausingEntity</code> is the name of the parameter (<code>KeyPairName</code>).</p> <p>If the <code>ChangeSource</code> value is <code>DirectModification</code>, no value is given for <code>CausingEntity</code>.</p>
5402    pub causing_entity: Option<String>,
5403    /// <p><p>The group to which the <code>CausingEntity</code> value belongs. There are five entity groups:</p> <ul> <li> <p> <code>ResourceReference</code> entities are <code>Ref</code> intrinsic functions that refer to resources in the template, such as <code>{ &quot;Ref&quot; : &quot;MyEC2InstanceResource&quot; }</code>.</p> </li> <li> <p> <code>ParameterReference</code> entities are <code>Ref</code> intrinsic functions that get template parameter values, such as <code>{ &quot;Ref&quot; : &quot;MyPasswordParameter&quot; }</code>.</p> </li> <li> <p> <code>ResourceAttribute</code> entities are <code>Fn::GetAtt</code> intrinsic functions that get resource attribute values, such as <code>{ &quot;Fn::GetAtt&quot; : [ &quot;MyEC2InstanceResource&quot;, &quot;PublicDnsName&quot; ] }</code>.</p> </li> <li> <p> <code>DirectModification</code> entities are changes that are made directly to the template.</p> </li> <li> <p> <code>Automatic</code> entities are <code>AWS::CloudFormation::Stack</code> resource types, which are also known as nested stacks. If you made no changes to the <code>AWS::CloudFormation::Stack</code> resource, AWS CloudFormation sets the <code>ChangeSource</code> to <code>Automatic</code> because the nested stack&#39;s template might have changed. Changes to a nested stack&#39;s template aren&#39;t visible to AWS CloudFormation until you run an update on the parent stack.</p> </li> </ul></p>
5404    pub change_source: Option<String>,
5405    /// <p>Indicates whether AWS CloudFormation can determine the target value, and whether the target value will change before you execute a change set.</p> <p>For <code>Static</code> evaluations, AWS CloudFormation can determine that the target value will change, and its value. For example, if you directly modify the <code>InstanceType</code> property of an EC2 instance, AWS CloudFormation knows that this property value will change, and its value, so this is a <code>Static</code> evaluation.</p> <p>For <code>Dynamic</code> evaluations, cannot determine the target value because it depends on the result of an intrinsic function, such as a <code>Ref</code> or <code>Fn::GetAtt</code> intrinsic function, when the stack is updated. For example, if your template includes a reference to a resource that is conditionally recreated, the value of the reference (the physical ID of the resource) might change, depending on if the resource is recreated. If the resource is recreated, it will have a new physical ID, so all references to that resource will also be updated.</p>
5406    pub evaluation: Option<String>,
5407    /// <p>A <code>ResourceTargetDefinition</code> structure that describes the field that AWS CloudFormation will change and whether the resource will be recreated.</p>
5408    pub target: Option<ResourceTargetDefinition>,
5409}
5410
5411#[allow(dead_code)]
5412struct ResourceChangeDetailDeserializer;
5413impl ResourceChangeDetailDeserializer {
5414    #[allow(dead_code, unused_variables)]
5415    fn deserialize<T: Peek + Next>(
5416        tag_name: &str,
5417        stack: &mut T,
5418    ) -> Result<ResourceChangeDetail, XmlParseError> {
5419        deserialize_elements::<_, ResourceChangeDetail, _>(tag_name, stack, |name, stack, obj| {
5420            match name {
5421                "CausingEntity" => {
5422                    obj.causing_entity = Some(CausingEntityDeserializer::deserialize(
5423                        "CausingEntity",
5424                        stack,
5425                    )?);
5426                }
5427                "ChangeSource" => {
5428                    obj.change_source = Some(ChangeSourceDeserializer::deserialize(
5429                        "ChangeSource",
5430                        stack,
5431                    )?);
5432                }
5433                "Evaluation" => {
5434                    obj.evaluation = Some(EvaluationTypeDeserializer::deserialize(
5435                        "Evaluation",
5436                        stack,
5437                    )?);
5438                }
5439                "Target" => {
5440                    obj.target = Some(ResourceTargetDefinitionDeserializer::deserialize(
5441                        "Target", stack,
5442                    )?);
5443                }
5444                _ => skip_tree(stack),
5445            }
5446            Ok(())
5447        })
5448    }
5449}
5450#[allow(dead_code)]
5451struct ResourceChangeDetailsDeserializer;
5452impl ResourceChangeDetailsDeserializer {
5453    #[allow(dead_code, unused_variables)]
5454    fn deserialize<T: Peek + Next>(
5455        tag_name: &str,
5456        stack: &mut T,
5457    ) -> Result<Vec<ResourceChangeDetail>, XmlParseError> {
5458        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
5459            if name == "member" {
5460                obj.push(ResourceChangeDetailDeserializer::deserialize(
5461                    "member", stack,
5462                )?);
5463            } else {
5464                skip_tree(stack);
5465            }
5466            Ok(())
5467        })
5468    }
5469}
5470
5471/// Serialize `ResourceIdentifierProperties` contents to a `SignedRequest`.
5472struct ResourceIdentifierPropertiesSerializer;
5473impl ResourceIdentifierPropertiesSerializer {
5474    fn serialize(
5475        params: &mut Params,
5476        name: &str,
5477        obj: &::std::collections::HashMap<String, String>,
5478    ) {
5479        for (index, (key, value)) in obj.iter().enumerate() {
5480            let prefix = format!("{}.{}", name, index + 1);
5481            params.put(&format!("{}.{}", prefix, "key"), &key);
5482            params.put(&format!("{}.{}", prefix, "Value"), &value);
5483        }
5484    }
5485}
5486
5487#[allow(dead_code)]
5488struct ResourceIdentifierPropertyKeyDeserializer;
5489impl ResourceIdentifierPropertyKeyDeserializer {
5490    #[allow(dead_code, unused_variables)]
5491    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
5492        xml_util::deserialize_primitive(tag_name, stack, Ok)
5493    }
5494}
5495#[allow(dead_code)]
5496struct ResourceIdentifierSummariesDeserializer;
5497impl ResourceIdentifierSummariesDeserializer {
5498    #[allow(dead_code, unused_variables)]
5499    fn deserialize<T: Peek + Next>(
5500        tag_name: &str,
5501        stack: &mut T,
5502    ) -> Result<Vec<ResourceIdentifierSummary>, XmlParseError> {
5503        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
5504            if name == "member" {
5505                obj.push(ResourceIdentifierSummaryDeserializer::deserialize(
5506                    "member", stack,
5507                )?);
5508            } else {
5509                skip_tree(stack);
5510            }
5511            Ok(())
5512        })
5513    }
5514}
5515/// <p>Describes the target resources of a specific type in your import template (for example, all <code>AWS::S3::Bucket</code> resources) and the properties you can provide during the import to identify resources of that type.</p>
5516#[derive(Clone, Debug, Default, PartialEq)]
5517#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
5518pub struct ResourceIdentifierSummary {
5519    /// <p>The logical IDs of the target resources of the specified <code>ResourceType</code>, as defined in the import template.</p>
5520    pub logical_resource_ids: Option<Vec<String>>,
5521    /// <p>The resource properties you can provide during the import to identify your target resources. For example, <code>BucketName</code> is a possible identifier property for <code>AWS::S3::Bucket</code> resources.</p>
5522    pub resource_identifiers: Option<Vec<String>>,
5523    /// <p>The template resource type of the target resources, such as <code>AWS::S3::Bucket</code>.</p>
5524    pub resource_type: Option<String>,
5525}
5526
5527#[allow(dead_code)]
5528struct ResourceIdentifierSummaryDeserializer;
5529impl ResourceIdentifierSummaryDeserializer {
5530    #[allow(dead_code, unused_variables)]
5531    fn deserialize<T: Peek + Next>(
5532        tag_name: &str,
5533        stack: &mut T,
5534    ) -> Result<ResourceIdentifierSummary, XmlParseError> {
5535        deserialize_elements::<_, ResourceIdentifierSummary, _>(
5536            tag_name,
5537            stack,
5538            |name, stack, obj| {
5539                match name {
5540                    "LogicalResourceIds" => {
5541                        obj.logical_resource_ids.get_or_insert(vec![]).extend(
5542                            LogicalResourceIdsDeserializer::deserialize(
5543                                "LogicalResourceIds",
5544                                stack,
5545                            )?,
5546                        );
5547                    }
5548                    "ResourceIdentifiers" => {
5549                        obj.resource_identifiers.get_or_insert(vec![]).extend(
5550                            ResourceIdentifiersDeserializer::deserialize(
5551                                "ResourceIdentifiers",
5552                                stack,
5553                            )?,
5554                        );
5555                    }
5556                    "ResourceType" => {
5557                        obj.resource_type = Some(ResourceTypeDeserializer::deserialize(
5558                            "ResourceType",
5559                            stack,
5560                        )?);
5561                    }
5562                    _ => skip_tree(stack),
5563                }
5564                Ok(())
5565            },
5566        )
5567    }
5568}
5569#[allow(dead_code)]
5570struct ResourceIdentifiersDeserializer;
5571impl ResourceIdentifiersDeserializer {
5572    #[allow(dead_code, unused_variables)]
5573    fn deserialize<T: Peek + Next>(
5574        tag_name: &str,
5575        stack: &mut T,
5576    ) -> Result<Vec<String>, XmlParseError> {
5577        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
5578            if name == "member" {
5579                obj.push(ResourceIdentifierPropertyKeyDeserializer::deserialize(
5580                    "member", stack,
5581                )?);
5582            } else {
5583                skip_tree(stack);
5584            }
5585            Ok(())
5586        })
5587    }
5588}
5589#[allow(dead_code)]
5590struct ResourcePropertiesDeserializer;
5591impl ResourcePropertiesDeserializer {
5592    #[allow(dead_code, unused_variables)]
5593    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
5594        xml_util::deserialize_primitive(tag_name, stack, Ok)
5595    }
5596}
5597#[allow(dead_code)]
5598struct ResourceStatusDeserializer;
5599impl ResourceStatusDeserializer {
5600    #[allow(dead_code, unused_variables)]
5601    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
5602        xml_util::deserialize_primitive(tag_name, stack, Ok)
5603    }
5604}
5605#[allow(dead_code)]
5606struct ResourceStatusReasonDeserializer;
5607impl ResourceStatusReasonDeserializer {
5608    #[allow(dead_code, unused_variables)]
5609    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
5610        xml_util::deserialize_primitive(tag_name, stack, Ok)
5611    }
5612}
5613/// <p>The field that AWS CloudFormation will change, such as the name of a resource's property, and whether the resource will be recreated.</p>
5614#[derive(Clone, Debug, Default, PartialEq)]
5615#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
5616pub struct ResourceTargetDefinition {
5617    /// <p>Indicates which resource attribute is triggering this update, such as a change in the resource attribute's <code>Metadata</code>, <code>Properties</code>, or <code>Tags</code>.</p>
5618    pub attribute: Option<String>,
5619    /// <p>If the <code>Attribute</code> value is <code>Properties</code>, the name of the property. For all other attributes, the value is null.</p>
5620    pub name: Option<String>,
5621    /// <p>If the <code>Attribute</code> value is <code>Properties</code>, indicates whether a change to this property causes the resource to be recreated. The value can be <code>Never</code>, <code>Always</code>, or <code>Conditionally</code>. To determine the conditions for a <code>Conditionally</code> recreation, see the update behavior for that <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html">property</a> in the AWS CloudFormation User Guide.</p>
5622    pub requires_recreation: Option<String>,
5623}
5624
5625#[allow(dead_code)]
5626struct ResourceTargetDefinitionDeserializer;
5627impl ResourceTargetDefinitionDeserializer {
5628    #[allow(dead_code, unused_variables)]
5629    fn deserialize<T: Peek + Next>(
5630        tag_name: &str,
5631        stack: &mut T,
5632    ) -> Result<ResourceTargetDefinition, XmlParseError> {
5633        deserialize_elements::<_, ResourceTargetDefinition, _>(
5634            tag_name,
5635            stack,
5636            |name, stack, obj| {
5637                match name {
5638                    "Attribute" => {
5639                        obj.attribute = Some(ResourceAttributeDeserializer::deserialize(
5640                            "Attribute",
5641                            stack,
5642                        )?);
5643                    }
5644                    "Name" => {
5645                        obj.name = Some(PropertyNameDeserializer::deserialize("Name", stack)?);
5646                    }
5647                    "RequiresRecreation" => {
5648                        obj.requires_recreation =
5649                            Some(RequiresRecreationDeserializer::deserialize(
5650                                "RequiresRecreation",
5651                                stack,
5652                            )?);
5653                    }
5654                    _ => skip_tree(stack),
5655                }
5656                Ok(())
5657            },
5658        )
5659    }
5660}
5661/// <p>Describes the target resource of an import operation.</p>
5662#[derive(Clone, Debug, Default, PartialEq)]
5663#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
5664pub struct ResourceToImport {
5665    /// <p>The logical ID of the target resource as specified in the template.</p>
5666    pub logical_resource_id: String,
5667    /// <p>A key-value pair that identifies the target resource. The key is an identifier property (for example, <code>BucketName</code> for <code>AWS::S3::Bucket</code> resources) and the value is the actual property value (for example, <code>MyS3Bucket</code>).</p>
5668    pub resource_identifier: ::std::collections::HashMap<String, String>,
5669    /// <p>The type of resource to import into your stack, such as <code>AWS::S3::Bucket</code>. For a list of supported resource types, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resource-import-supported-resources.html">Resources that support import operations</a> in the AWS CloudFormation User Guide.</p>
5670    pub resource_type: String,
5671}
5672
5673/// Serialize `ResourceToImport` contents to a `SignedRequest`.
5674struct ResourceToImportSerializer;
5675impl ResourceToImportSerializer {
5676    fn serialize(params: &mut Params, name: &str, obj: &ResourceToImport) {
5677        let mut prefix = name.to_string();
5678        if prefix != "" {
5679            prefix.push_str(".");
5680        }
5681
5682        params.put(
5683            &format!("{}{}", prefix, "LogicalResourceId"),
5684            &obj.logical_resource_id,
5685        );
5686        ResourceIdentifierPropertiesSerializer::serialize(
5687            params,
5688            &format!("{}{}", prefix, "ResourceIdentifier"),
5689            &obj.resource_identifier,
5690        );
5691        params.put(&format!("{}{}", prefix, "ResourceType"), &obj.resource_type);
5692    }
5693}
5694
5695#[allow(dead_code)]
5696struct ResourceTypeDeserializer;
5697impl ResourceTypeDeserializer {
5698    #[allow(dead_code, unused_variables)]
5699    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
5700        xml_util::deserialize_primitive(tag_name, stack, Ok)
5701    }
5702}
5703#[allow(dead_code)]
5704struct ResourceTypesDeserializer;
5705impl ResourceTypesDeserializer {
5706    #[allow(dead_code, unused_variables)]
5707    fn deserialize<T: Peek + Next>(
5708        tag_name: &str,
5709        stack: &mut T,
5710    ) -> Result<Vec<String>, XmlParseError> {
5711        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
5712            if name == "member" {
5713                obj.push(ResourceTypeDeserializer::deserialize("member", stack)?);
5714            } else {
5715                skip_tree(stack);
5716            }
5717            Ok(())
5718        })
5719    }
5720}
5721
5722/// Serialize `ResourceTypes` contents to a `SignedRequest`.
5723struct ResourceTypesSerializer;
5724impl ResourceTypesSerializer {
5725    fn serialize(params: &mut Params, name: &str, obj: &Vec<String>) {
5726        for (index, obj) in obj.iter().enumerate() {
5727            let key = format!("{}.member.{}", name, index + 1);
5728            params.put(&key, &obj);
5729        }
5730    }
5731}
5732
5733/// Serialize `ResourcesToImport` contents to a `SignedRequest`.
5734struct ResourcesToImportSerializer;
5735impl ResourcesToImportSerializer {
5736    fn serialize(params: &mut Params, name: &str, obj: &Vec<ResourceToImport>) {
5737        for (index, obj) in obj.iter().enumerate() {
5738            let key = format!("{}.member.{}", name, index + 1);
5739            ResourceToImportSerializer::serialize(params, &key, obj);
5740        }
5741    }
5742}
5743
5744/// Serialize `ResourcesToSkip` contents to a `SignedRequest`.
5745struct ResourcesToSkipSerializer;
5746impl ResourcesToSkipSerializer {
5747    fn serialize(params: &mut Params, name: &str, obj: &Vec<String>) {
5748        for (index, obj) in obj.iter().enumerate() {
5749            let key = format!("{}.member.{}", name, index + 1);
5750            params.put(&key, &obj);
5751        }
5752    }
5753}
5754
5755/// Serialize `RetainResources` contents to a `SignedRequest`.
5756struct RetainResourcesSerializer;
5757impl RetainResourcesSerializer {
5758    fn serialize(params: &mut Params, name: &str, obj: &Vec<String>) {
5759        for (index, obj) in obj.iter().enumerate() {
5760            let key = format!("{}.member.{}", name, index + 1);
5761            params.put(&key, &obj);
5762        }
5763    }
5764}
5765
5766#[allow(dead_code)]
5767struct RetainStacksNullableDeserializer;
5768impl RetainStacksNullableDeserializer {
5769    #[allow(dead_code, unused_variables)]
5770    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<bool, XmlParseError> {
5771        xml_util::deserialize_primitive(tag_name, stack, |s| Ok(bool::from_str(&s).unwrap()))
5772    }
5773}
5774#[allow(dead_code)]
5775struct RetainStacksOnAccountRemovalNullableDeserializer;
5776impl RetainStacksOnAccountRemovalNullableDeserializer {
5777    #[allow(dead_code, unused_variables)]
5778    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<bool, XmlParseError> {
5779        xml_util::deserialize_primitive(tag_name, stack, |s| Ok(bool::from_str(&s).unwrap()))
5780    }
5781}
5782#[allow(dead_code)]
5783struct RoleARNDeserializer;
5784impl RoleARNDeserializer {
5785    #[allow(dead_code, unused_variables)]
5786    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
5787        xml_util::deserialize_primitive(tag_name, stack, Ok)
5788    }
5789}
5790#[allow(dead_code)]
5791struct RoleArnDeserializer;
5792impl RoleArnDeserializer {
5793    #[allow(dead_code, unused_variables)]
5794    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
5795        xml_util::deserialize_primitive(tag_name, stack, Ok)
5796    }
5797}
5798/// <p>Structure containing the rollback triggers for AWS CloudFormation to monitor during stack creation and updating operations, and for the specified monitoring period afterwards.</p> <p>Rollback triggers enable you to have AWS CloudFormation monitor the state of your application during stack creation and updating, and to roll back that operation if the application breaches the threshold of any of the alarms you've specified. For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-rollback-triggers.html">Monitor and Roll Back Stack Operations</a>.</p>
5799#[derive(Clone, Debug, Default, PartialEq)]
5800#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
5801#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
5802pub struct RollbackConfiguration {
5803    /// <p>The amount of time, in minutes, during which CloudFormation should monitor all the rollback triggers after the stack creation or update operation deploys all necessary resources.</p> <p>The default is 0 minutes.</p> <p>If you specify a monitoring period but do not specify any rollback triggers, CloudFormation still waits the specified period of time before cleaning up old resources after update operations. You can use this monitoring period to perform any manual stack validation desired, and manually cancel the stack creation or update (using <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CancelUpdateStack.html">CancelUpdateStack</a>, for example) as necessary.</p> <p>If you specify 0 for this parameter, CloudFormation still monitors the specified rollback triggers during stack creation and update operations. Then, for update operations, it begins disposing of old resources immediately once the operation completes.</p>
5804    pub monitoring_time_in_minutes: Option<i64>,
5805    /// <p>The triggers to monitor during stack creation or update actions. </p> <p>By default, AWS CloudFormation saves the rollback triggers specified for a stack and applies them to any subsequent update operations for the stack, unless you specify otherwise. If you do specify rollback triggers for this parameter, those triggers replace any list of triggers previously specified for the stack. This means:</p> <ul> <li> <p>To use the rollback triggers previously specified for this stack, if any, don't specify this parameter.</p> </li> <li> <p>To specify new or updated rollback triggers, you must specify <i>all</i> the triggers that you want used for this stack, even triggers you've specifed before (for example, when creating the stack or during a previous stack update). Any triggers that you don't include in the updated list of triggers are no longer applied to the stack.</p> </li> <li> <p>To remove all currently specified triggers, specify an empty list for this parameter.</p> </li> </ul> <p>If a specified trigger is missing, the entire stack operation fails and is rolled back. </p>
5806    pub rollback_triggers: Option<Vec<RollbackTrigger>>,
5807}
5808
5809#[allow(dead_code)]
5810struct RollbackConfigurationDeserializer;
5811impl RollbackConfigurationDeserializer {
5812    #[allow(dead_code, unused_variables)]
5813    fn deserialize<T: Peek + Next>(
5814        tag_name: &str,
5815        stack: &mut T,
5816    ) -> Result<RollbackConfiguration, XmlParseError> {
5817        deserialize_elements::<_, RollbackConfiguration, _>(tag_name, stack, |name, stack, obj| {
5818            match name {
5819                "MonitoringTimeInMinutes" => {
5820                    obj.monitoring_time_in_minutes =
5821                        Some(MonitoringTimeInMinutesDeserializer::deserialize(
5822                            "MonitoringTimeInMinutes",
5823                            stack,
5824                        )?);
5825                }
5826                "RollbackTriggers" => {
5827                    obj.rollback_triggers.get_or_insert(vec![]).extend(
5828                        RollbackTriggersDeserializer::deserialize("RollbackTriggers", stack)?,
5829                    );
5830                }
5831                _ => skip_tree(stack),
5832            }
5833            Ok(())
5834        })
5835    }
5836}
5837
5838/// Serialize `RollbackConfiguration` contents to a `SignedRequest`.
5839struct RollbackConfigurationSerializer;
5840impl RollbackConfigurationSerializer {
5841    fn serialize(params: &mut Params, name: &str, obj: &RollbackConfiguration) {
5842        let mut prefix = name.to_string();
5843        if prefix != "" {
5844            prefix.push_str(".");
5845        }
5846
5847        if let Some(ref field_value) = obj.monitoring_time_in_minutes {
5848            params.put(
5849                &format!("{}{}", prefix, "MonitoringTimeInMinutes"),
5850                &field_value,
5851            );
5852        }
5853        if let Some(ref field_value) = obj.rollback_triggers {
5854            RollbackTriggersSerializer::serialize(
5855                params,
5856                &format!("{}{}", prefix, "RollbackTriggers"),
5857                field_value,
5858            );
5859        }
5860    }
5861}
5862
5863/// <p>A rollback trigger AWS CloudFormation monitors during creation and updating of stacks. If any of the alarms you specify goes to ALARM state during the stack operation or within the specified monitoring period afterwards, CloudFormation rolls back the entire stack operation. </p>
5864#[derive(Clone, Debug, Default, PartialEq)]
5865#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
5866#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
5867pub struct RollbackTrigger {
5868    /// <p>The Amazon Resource Name (ARN) of the rollback trigger.</p> <p>If a specified trigger is missing, the entire stack operation fails and is rolled back. </p>
5869    pub arn: String,
5870    /// <p>The resource type of the rollback trigger. Currently, <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cw-alarm.html">AWS::CloudWatch::Alarm</a> is the only supported resource type.</p>
5871    pub type_: String,
5872}
5873
5874#[allow(dead_code)]
5875struct RollbackTriggerDeserializer;
5876impl RollbackTriggerDeserializer {
5877    #[allow(dead_code, unused_variables)]
5878    fn deserialize<T: Peek + Next>(
5879        tag_name: &str,
5880        stack: &mut T,
5881    ) -> Result<RollbackTrigger, XmlParseError> {
5882        deserialize_elements::<_, RollbackTrigger, _>(tag_name, stack, |name, stack, obj| {
5883            match name {
5884                "Arn" => {
5885                    obj.arn = ArnDeserializer::deserialize("Arn", stack)?;
5886                }
5887                "Type" => {
5888                    obj.type_ = TypeDeserializer::deserialize("Type", stack)?;
5889                }
5890                _ => skip_tree(stack),
5891            }
5892            Ok(())
5893        })
5894    }
5895}
5896
5897/// Serialize `RollbackTrigger` contents to a `SignedRequest`.
5898struct RollbackTriggerSerializer;
5899impl RollbackTriggerSerializer {
5900    fn serialize(params: &mut Params, name: &str, obj: &RollbackTrigger) {
5901        let mut prefix = name.to_string();
5902        if prefix != "" {
5903            prefix.push_str(".");
5904        }
5905
5906        params.put(&format!("{}{}", prefix, "Arn"), &obj.arn);
5907        params.put(&format!("{}{}", prefix, "Type"), &obj.type_);
5908    }
5909}
5910
5911#[allow(dead_code)]
5912struct RollbackTriggersDeserializer;
5913impl RollbackTriggersDeserializer {
5914    #[allow(dead_code, unused_variables)]
5915    fn deserialize<T: Peek + Next>(
5916        tag_name: &str,
5917        stack: &mut T,
5918    ) -> Result<Vec<RollbackTrigger>, XmlParseError> {
5919        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
5920            if name == "member" {
5921                obj.push(RollbackTriggerDeserializer::deserialize("member", stack)?);
5922            } else {
5923                skip_tree(stack);
5924            }
5925            Ok(())
5926        })
5927    }
5928}
5929
5930/// Serialize `RollbackTriggers` contents to a `SignedRequest`.
5931struct RollbackTriggersSerializer;
5932impl RollbackTriggersSerializer {
5933    fn serialize(params: &mut Params, name: &str, obj: &Vec<RollbackTrigger>) {
5934        for (index, obj) in obj.iter().enumerate() {
5935            let key = format!("{}.member.{}", name, index + 1);
5936            RollbackTriggerSerializer::serialize(params, &key, obj);
5937        }
5938    }
5939}
5940
5941#[allow(dead_code)]
5942struct ScopeDeserializer;
5943impl ScopeDeserializer {
5944    #[allow(dead_code, unused_variables)]
5945    fn deserialize<T: Peek + Next>(
5946        tag_name: &str,
5947        stack: &mut T,
5948    ) -> Result<Vec<String>, XmlParseError> {
5949        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
5950            if name == "member" {
5951                obj.push(ResourceAttributeDeserializer::deserialize("member", stack)?);
5952            } else {
5953                skip_tree(stack);
5954            }
5955            Ok(())
5956        })
5957    }
5958}
5959/// <p>The input for the <a>SetStackPolicy</a> action.</p>
5960#[derive(Clone, Debug, Default, PartialEq)]
5961#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
5962pub struct SetStackPolicyInput {
5963    /// <p>The name or unique stack ID that you want to associate a policy with.</p>
5964    pub stack_name: String,
5965    /// <p>Structure containing the stack policy body. For more information, go to <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html"> Prevent Updates to Stack Resources</a> in the AWS CloudFormation User Guide. You can specify either the <code>StackPolicyBody</code> or the <code>StackPolicyURL</code> parameter, but not both.</p>
5966    pub stack_policy_body: Option<String>,
5967    /// <p>Location of a file containing the stack policy. The URL must point to a policy (maximum size: 16 KB) located in an S3 bucket in the same Region as the stack. You can specify either the <code>StackPolicyBody</code> or the <code>StackPolicyURL</code> parameter, but not both.</p>
5968    pub stack_policy_url: Option<String>,
5969}
5970
5971/// Serialize `SetStackPolicyInput` contents to a `SignedRequest`.
5972struct SetStackPolicyInputSerializer;
5973impl SetStackPolicyInputSerializer {
5974    fn serialize(params: &mut Params, name: &str, obj: &SetStackPolicyInput) {
5975        let mut prefix = name.to_string();
5976        if prefix != "" {
5977            prefix.push_str(".");
5978        }
5979
5980        params.put(&format!("{}{}", prefix, "StackName"), &obj.stack_name);
5981        if let Some(ref field_value) = obj.stack_policy_body {
5982            params.put(&format!("{}{}", prefix, "StackPolicyBody"), &field_value);
5983        }
5984        if let Some(ref field_value) = obj.stack_policy_url {
5985            params.put(&format!("{}{}", prefix, "StackPolicyURL"), &field_value);
5986        }
5987    }
5988}
5989
5990#[derive(Clone, Debug, Default, PartialEq)]
5991#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
5992pub struct SetTypeDefaultVersionInput {
5993    /// <p>The Amazon Resource Name (ARN) of the type for which you want version summary information.</p> <p>Conditional: You must specify either <code>TypeName</code> and <code>Type</code>, or <code>Arn</code>.</p>
5994    pub arn: Option<String>,
5995    /// <p>The kind of type.</p> <p>Conditional: You must specify either <code>TypeName</code> and <code>Type</code>, or <code>Arn</code>.</p>
5996    pub type_: Option<String>,
5997    /// <p>The name of the type.</p> <p>Conditional: You must specify either <code>TypeName</code> and <code>Type</code>, or <code>Arn</code>.</p>
5998    pub type_name: Option<String>,
5999    /// <p>The ID of a specific version of the type. The version ID is the value at the end of the Amazon Resource Name (ARN) assigned to the type version when it is registered.</p>
6000    pub version_id: Option<String>,
6001}
6002
6003/// Serialize `SetTypeDefaultVersionInput` contents to a `SignedRequest`.
6004struct SetTypeDefaultVersionInputSerializer;
6005impl SetTypeDefaultVersionInputSerializer {
6006    fn serialize(params: &mut Params, name: &str, obj: &SetTypeDefaultVersionInput) {
6007        let mut prefix = name.to_string();
6008        if prefix != "" {
6009            prefix.push_str(".");
6010        }
6011
6012        if let Some(ref field_value) = obj.arn {
6013            params.put(&format!("{}{}", prefix, "Arn"), &field_value);
6014        }
6015        if let Some(ref field_value) = obj.type_ {
6016            params.put(&format!("{}{}", prefix, "Type"), &field_value);
6017        }
6018        if let Some(ref field_value) = obj.type_name {
6019            params.put(&format!("{}{}", prefix, "TypeName"), &field_value);
6020        }
6021        if let Some(ref field_value) = obj.version_id {
6022            params.put(&format!("{}{}", prefix, "VersionId"), &field_value);
6023        }
6024    }
6025}
6026
6027#[derive(Clone, Debug, Default, PartialEq)]
6028#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
6029pub struct SetTypeDefaultVersionOutput {}
6030
6031#[allow(dead_code)]
6032struct SetTypeDefaultVersionOutputDeserializer;
6033impl SetTypeDefaultVersionOutputDeserializer {
6034    #[allow(dead_code, unused_variables)]
6035    fn deserialize<T: Peek + Next>(
6036        tag_name: &str,
6037        stack: &mut T,
6038    ) -> Result<SetTypeDefaultVersionOutput, XmlParseError> {
6039        xml_util::start_element(tag_name, stack)?;
6040
6041        let obj = SetTypeDefaultVersionOutput::default();
6042
6043        xml_util::end_element(tag_name, stack)?;
6044
6045        Ok(obj)
6046    }
6047}
6048/// <p>The input for the <a>SignalResource</a> action.</p>
6049#[derive(Clone, Debug, Default, PartialEq)]
6050#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
6051pub struct SignalResourceInput {
6052    /// <p>The logical ID of the resource that you want to signal. The logical ID is the name of the resource that given in the template.</p>
6053    pub logical_resource_id: String,
6054    /// <p>The stack name or unique stack ID that includes the resource that you want to signal.</p>
6055    pub stack_name: String,
6056    /// <p>The status of the signal, which is either success or failure. A failure signal causes AWS CloudFormation to immediately fail the stack creation or update.</p>
6057    pub status: String,
6058    /// <p>A unique ID of the signal. When you signal Amazon EC2 instances or Auto Scaling groups, specify the instance ID that you are signaling as the unique ID. If you send multiple signals to a single resource (such as signaling a wait condition), each signal requires a different unique ID.</p>
6059    pub unique_id: String,
6060}
6061
6062/// Serialize `SignalResourceInput` contents to a `SignedRequest`.
6063struct SignalResourceInputSerializer;
6064impl SignalResourceInputSerializer {
6065    fn serialize(params: &mut Params, name: &str, obj: &SignalResourceInput) {
6066        let mut prefix = name.to_string();
6067        if prefix != "" {
6068            prefix.push_str(".");
6069        }
6070
6071        params.put(
6072            &format!("{}{}", prefix, "LogicalResourceId"),
6073            &obj.logical_resource_id,
6074        );
6075        params.put(&format!("{}{}", prefix, "StackName"), &obj.stack_name);
6076        params.put(&format!("{}{}", prefix, "Status"), &obj.status);
6077        params.put(&format!("{}{}", prefix, "UniqueId"), &obj.unique_id);
6078    }
6079}
6080
6081/// <p>The Stack data type.</p>
6082#[derive(Clone, Debug, Default, PartialEq)]
6083#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
6084pub struct Stack {
6085    /// <p>The capabilities allowed in the stack.</p>
6086    pub capabilities: Option<Vec<String>>,
6087    /// <p>The unique ID of the change set.</p>
6088    pub change_set_id: Option<String>,
6089    /// <p>The time at which the stack was created.</p>
6090    pub creation_time: String,
6091    /// <p>The time the stack was deleted.</p>
6092    pub deletion_time: Option<String>,
6093    /// <p>A user-defined description associated with the stack.</p>
6094    pub description: Option<String>,
6095    /// <p><p>Boolean to enable or disable rollback on stack creation failures:</p> <ul> <li> <p> <code>true</code>: disable rollback</p> </li> <li> <p> <code>false</code>: enable rollback</p> </li> </ul></p>
6096    pub disable_rollback: Option<bool>,
6097    /// <p>Information on whether a stack's actual configuration differs, or has <i>drifted</i>, from it's expected configuration, as defined in the stack template and any values specified as template parameters. For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html">Detecting Unregulated Configuration Changes to Stacks and Resources</a>.</p>
6098    pub drift_information: Option<StackDriftInformation>,
6099    /// <p>Whether termination protection is enabled for the stack.</p> <p> For <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-nested-stacks.html">nested stacks</a>, termination protection is set on the root stack and cannot be changed directly on the nested stack. For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-protect-stacks.html">Protecting a Stack From Being Deleted</a> in the <i>AWS CloudFormation User Guide</i>.</p>
6100    pub enable_termination_protection: Option<bool>,
6101    /// <p>The time the stack was last updated. This field will only be returned if the stack has been updated at least once.</p>
6102    pub last_updated_time: Option<String>,
6103    /// <p>SNS topic ARNs to which stack related events are published.</p>
6104    pub notification_ar_ns: Option<Vec<String>>,
6105    /// <p>A list of output structures.</p>
6106    pub outputs: Option<Vec<Output>>,
6107    /// <p>A list of <code>Parameter</code> structures.</p>
6108    pub parameters: Option<Vec<Parameter>>,
6109    /// <p>For nested stacks--stacks created as resources for another stack--the stack ID of the direct parent of this stack. For the first level of nested stacks, the root stack is also the parent stack.</p> <p>For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-nested-stacks.html">Working with Nested Stacks</a> in the <i>AWS CloudFormation User Guide</i>.</p>
6110    pub parent_id: Option<String>,
6111    /// <p>The Amazon Resource Name (ARN) of an AWS Identity and Access Management (IAM) role that is associated with the stack. During a stack operation, AWS CloudFormation uses this role's credentials to make calls on your behalf.</p>
6112    pub role_arn: Option<String>,
6113    /// <p>The rollback triggers for AWS CloudFormation to monitor during stack creation and updating operations, and for the specified monitoring period afterwards.</p>
6114    pub rollback_configuration: Option<RollbackConfiguration>,
6115    /// <p>For nested stacks--stacks created as resources for another stack--the stack ID of the top-level stack to which the nested stack ultimately belongs.</p> <p>For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-nested-stacks.html">Working with Nested Stacks</a> in the <i>AWS CloudFormation User Guide</i>.</p>
6116    pub root_id: Option<String>,
6117    /// <p>Unique identifier of the stack.</p>
6118    pub stack_id: Option<String>,
6119    /// <p>The name associated with the stack.</p>
6120    pub stack_name: String,
6121    /// <p>Current status of the stack.</p>
6122    pub stack_status: String,
6123    /// <p>Success/failure message associated with the stack status.</p>
6124    pub stack_status_reason: Option<String>,
6125    /// <p>A list of <code>Tag</code>s that specify information about the stack.</p>
6126    pub tags: Option<Vec<Tag>>,
6127    /// <p>The amount of time within which stack creation should complete.</p>
6128    pub timeout_in_minutes: Option<i64>,
6129}
6130
6131#[allow(dead_code)]
6132struct StackDeserializer;
6133impl StackDeserializer {
6134    #[allow(dead_code, unused_variables)]
6135    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<Stack, XmlParseError> {
6136        deserialize_elements::<_, Stack, _>(tag_name, stack, |name, stack, obj| {
6137            match name {
6138                "Capabilities" => {
6139                    obj.capabilities.get_or_insert(vec![]).extend(
6140                        CapabilitiesDeserializer::deserialize("Capabilities", stack)?,
6141                    );
6142                }
6143                "ChangeSetId" => {
6144                    obj.change_set_id =
6145                        Some(ChangeSetIdDeserializer::deserialize("ChangeSetId", stack)?);
6146                }
6147                "CreationTime" => {
6148                    obj.creation_time =
6149                        CreationTimeDeserializer::deserialize("CreationTime", stack)?;
6150                }
6151                "DeletionTime" => {
6152                    obj.deletion_time = Some(DeletionTimeDeserializer::deserialize(
6153                        "DeletionTime",
6154                        stack,
6155                    )?);
6156                }
6157                "Description" => {
6158                    obj.description =
6159                        Some(DescriptionDeserializer::deserialize("Description", stack)?);
6160                }
6161                "DisableRollback" => {
6162                    obj.disable_rollback = Some(DisableRollbackDeserializer::deserialize(
6163                        "DisableRollback",
6164                        stack,
6165                    )?);
6166                }
6167                "DriftInformation" => {
6168                    obj.drift_information = Some(StackDriftInformationDeserializer::deserialize(
6169                        "DriftInformation",
6170                        stack,
6171                    )?);
6172                }
6173                "EnableTerminationProtection" => {
6174                    obj.enable_termination_protection =
6175                        Some(EnableTerminationProtectionDeserializer::deserialize(
6176                            "EnableTerminationProtection",
6177                            stack,
6178                        )?);
6179                }
6180                "LastUpdatedTime" => {
6181                    obj.last_updated_time = Some(LastUpdatedTimeDeserializer::deserialize(
6182                        "LastUpdatedTime",
6183                        stack,
6184                    )?);
6185                }
6186                "NotificationARNs" => {
6187                    obj.notification_ar_ns.get_or_insert(vec![]).extend(
6188                        NotificationARNsDeserializer::deserialize("NotificationARNs", stack)?,
6189                    );
6190                }
6191                "Outputs" => {
6192                    obj.outputs
6193                        .get_or_insert(vec![])
6194                        .extend(OutputsDeserializer::deserialize("Outputs", stack)?);
6195                }
6196                "Parameters" => {
6197                    obj.parameters
6198                        .get_or_insert(vec![])
6199                        .extend(ParametersDeserializer::deserialize("Parameters", stack)?);
6200                }
6201                "ParentId" => {
6202                    obj.parent_id = Some(StackIdDeserializer::deserialize("ParentId", stack)?);
6203                }
6204                "RoleARN" => {
6205                    obj.role_arn = Some(RoleARNDeserializer::deserialize("RoleARN", stack)?);
6206                }
6207                "RollbackConfiguration" => {
6208                    obj.rollback_configuration =
6209                        Some(RollbackConfigurationDeserializer::deserialize(
6210                            "RollbackConfiguration",
6211                            stack,
6212                        )?);
6213                }
6214                "RootId" => {
6215                    obj.root_id = Some(StackIdDeserializer::deserialize("RootId", stack)?);
6216                }
6217                "StackId" => {
6218                    obj.stack_id = Some(StackIdDeserializer::deserialize("StackId", stack)?);
6219                }
6220                "StackName" => {
6221                    obj.stack_name = StackNameDeserializer::deserialize("StackName", stack)?;
6222                }
6223                "StackStatus" => {
6224                    obj.stack_status = StackStatusDeserializer::deserialize("StackStatus", stack)?;
6225                }
6226                "StackStatusReason" => {
6227                    obj.stack_status_reason = Some(StackStatusReasonDeserializer::deserialize(
6228                        "StackStatusReason",
6229                        stack,
6230                    )?);
6231                }
6232                "Tags" => {
6233                    obj.tags
6234                        .get_or_insert(vec![])
6235                        .extend(TagsDeserializer::deserialize("Tags", stack)?);
6236                }
6237                "TimeoutInMinutes" => {
6238                    obj.timeout_in_minutes = Some(TimeoutMinutesDeserializer::deserialize(
6239                        "TimeoutInMinutes",
6240                        stack,
6241                    )?);
6242                }
6243                _ => skip_tree(stack),
6244            }
6245            Ok(())
6246        })
6247    }
6248}
6249#[allow(dead_code)]
6250struct StackDriftDetectionIdDeserializer;
6251impl StackDriftDetectionIdDeserializer {
6252    #[allow(dead_code, unused_variables)]
6253    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
6254        xml_util::deserialize_primitive(tag_name, stack, Ok)
6255    }
6256}
6257#[allow(dead_code)]
6258struct StackDriftDetectionStatusDeserializer;
6259impl StackDriftDetectionStatusDeserializer {
6260    #[allow(dead_code, unused_variables)]
6261    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
6262        xml_util::deserialize_primitive(tag_name, stack, Ok)
6263    }
6264}
6265#[allow(dead_code)]
6266struct StackDriftDetectionStatusReasonDeserializer;
6267impl StackDriftDetectionStatusReasonDeserializer {
6268    #[allow(dead_code, unused_variables)]
6269    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
6270        xml_util::deserialize_primitive(tag_name, stack, Ok)
6271    }
6272}
6273/// <p>Contains information about whether the stack's actual configuration differs, or has <i>drifted</i>, from its expected configuration, as defined in the stack template and any values specified as template parameters. A stack is considered to have drifted if one or more of its resources have drifted.</p>
6274#[derive(Clone, Debug, Default, PartialEq)]
6275#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
6276pub struct StackDriftInformation {
6277    /// <p>Most recent time when a drift detection operation was initiated on the stack, or any of its individual resources that support drift detection.</p>
6278    pub last_check_timestamp: Option<String>,
6279    /// <p><p>Status of the stack&#39;s actual configuration compared to its expected template configuration. </p> <ul> <li> <p> <code>DRIFTED</code>: The stack differs from its expected template configuration. A stack is considered to have drifted if one or more of its resources have drifted.</p> </li> <li> <p> <code>NOT<em>CHECKED</code>: AWS CloudFormation has not checked if the stack differs from its expected template configuration.</p> </li> <li> <p> <code>IN</em>SYNC</code>: The stack&#39;s actual configuration matches its expected template configuration.</p> </li> <li> <p> <code>UNKNOWN</code>: This value is reserved for future use.</p> </li> </ul></p>
6280    pub stack_drift_status: String,
6281}
6282
6283#[allow(dead_code)]
6284struct StackDriftInformationDeserializer;
6285impl StackDriftInformationDeserializer {
6286    #[allow(dead_code, unused_variables)]
6287    fn deserialize<T: Peek + Next>(
6288        tag_name: &str,
6289        stack: &mut T,
6290    ) -> Result<StackDriftInformation, XmlParseError> {
6291        deserialize_elements::<_, StackDriftInformation, _>(tag_name, stack, |name, stack, obj| {
6292            match name {
6293                "LastCheckTimestamp" => {
6294                    obj.last_check_timestamp = Some(TimestampDeserializer::deserialize(
6295                        "LastCheckTimestamp",
6296                        stack,
6297                    )?);
6298                }
6299                "StackDriftStatus" => {
6300                    obj.stack_drift_status =
6301                        StackDriftStatusDeserializer::deserialize("StackDriftStatus", stack)?;
6302                }
6303                _ => skip_tree(stack),
6304            }
6305            Ok(())
6306        })
6307    }
6308}
6309/// <p>Contains information about whether the stack's actual configuration differs, or has <i>drifted</i>, from its expected configuration, as defined in the stack template and any values specified as template parameters. A stack is considered to have drifted if one or more of its resources have drifted.</p>
6310#[derive(Clone, Debug, Default, PartialEq)]
6311#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
6312pub struct StackDriftInformationSummary {
6313    /// <p>Most recent time when a drift detection operation was initiated on the stack, or any of its individual resources that support drift detection.</p>
6314    pub last_check_timestamp: Option<String>,
6315    /// <p><p>Status of the stack&#39;s actual configuration compared to its expected template configuration. </p> <ul> <li> <p> <code>DRIFTED</code>: The stack differs from its expected template configuration. A stack is considered to have drifted if one or more of its resources have drifted.</p> </li> <li> <p> <code>NOT<em>CHECKED</code>: AWS CloudFormation has not checked if the stack differs from its expected template configuration.</p> </li> <li> <p> <code>IN</em>SYNC</code>: The stack&#39;s actual configuration matches its expected template configuration.</p> </li> <li> <p> <code>UNKNOWN</code>: This value is reserved for future use.</p> </li> </ul></p>
6316    pub stack_drift_status: String,
6317}
6318
6319#[allow(dead_code)]
6320struct StackDriftInformationSummaryDeserializer;
6321impl StackDriftInformationSummaryDeserializer {
6322    #[allow(dead_code, unused_variables)]
6323    fn deserialize<T: Peek + Next>(
6324        tag_name: &str,
6325        stack: &mut T,
6326    ) -> Result<StackDriftInformationSummary, XmlParseError> {
6327        deserialize_elements::<_, StackDriftInformationSummary, _>(
6328            tag_name,
6329            stack,
6330            |name, stack, obj| {
6331                match name {
6332                    "LastCheckTimestamp" => {
6333                        obj.last_check_timestamp = Some(TimestampDeserializer::deserialize(
6334                            "LastCheckTimestamp",
6335                            stack,
6336                        )?);
6337                    }
6338                    "StackDriftStatus" => {
6339                        obj.stack_drift_status =
6340                            StackDriftStatusDeserializer::deserialize("StackDriftStatus", stack)?;
6341                    }
6342                    _ => skip_tree(stack),
6343                }
6344                Ok(())
6345            },
6346        )
6347    }
6348}
6349#[allow(dead_code)]
6350struct StackDriftStatusDeserializer;
6351impl StackDriftStatusDeserializer {
6352    #[allow(dead_code, unused_variables)]
6353    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
6354        xml_util::deserialize_primitive(tag_name, stack, Ok)
6355    }
6356}
6357/// <p>The StackEvent data type.</p>
6358#[derive(Clone, Debug, Default, PartialEq)]
6359#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
6360pub struct StackEvent {
6361    /// <p>The token passed to the operation that generated this event.</p> <p>All events triggered by a given stack operation are assigned the same client request token, which you can use to track operations. For example, if you execute a <code>CreateStack</code> operation with the token <code>token1</code>, then all the <code>StackEvents</code> generated by that operation will have <code>ClientRequestToken</code> set as <code>token1</code>.</p> <p>In the console, stack operations display the client request token on the Events tab. Stack operations that are initiated from the console use the token format <i>Console-StackOperation-ID</i>, which helps you easily identify the stack operation . For example, if you create a stack using the console, each stack event would be assigned the same token in the following format: <code>Console-CreateStack-7f59c3cf-00d2-40c7-b2ff-e75db0987002</code>. </p>
6362    pub client_request_token: Option<String>,
6363    /// <p>The unique ID of this event.</p>
6364    pub event_id: String,
6365    /// <p>The logical name of the resource specified in the template.</p>
6366    pub logical_resource_id: Option<String>,
6367    /// <p>The name or unique identifier associated with the physical instance of the resource.</p>
6368    pub physical_resource_id: Option<String>,
6369    /// <p>BLOB of the properties used to create the resource.</p>
6370    pub resource_properties: Option<String>,
6371    /// <p>Current status of the resource.</p>
6372    pub resource_status: Option<String>,
6373    /// <p>Success/failure message associated with the resource.</p>
6374    pub resource_status_reason: Option<String>,
6375    /// <p>Type of resource. (For more information, go to <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html"> AWS Resource Types Reference</a> in the AWS CloudFormation User Guide.)</p>
6376    pub resource_type: Option<String>,
6377    /// <p>The unique ID name of the instance of the stack.</p>
6378    pub stack_id: String,
6379    /// <p>The name associated with a stack.</p>
6380    pub stack_name: String,
6381    /// <p>Time the status was updated.</p>
6382    pub timestamp: String,
6383}
6384
6385#[allow(dead_code)]
6386struct StackEventDeserializer;
6387impl StackEventDeserializer {
6388    #[allow(dead_code, unused_variables)]
6389    fn deserialize<T: Peek + Next>(
6390        tag_name: &str,
6391        stack: &mut T,
6392    ) -> Result<StackEvent, XmlParseError> {
6393        deserialize_elements::<_, StackEvent, _>(tag_name, stack, |name, stack, obj| {
6394            match name {
6395                "ClientRequestToken" => {
6396                    obj.client_request_token = Some(ClientRequestTokenDeserializer::deserialize(
6397                        "ClientRequestToken",
6398                        stack,
6399                    )?);
6400                }
6401                "EventId" => {
6402                    obj.event_id = EventIdDeserializer::deserialize("EventId", stack)?;
6403                }
6404                "LogicalResourceId" => {
6405                    obj.logical_resource_id = Some(LogicalResourceIdDeserializer::deserialize(
6406                        "LogicalResourceId",
6407                        stack,
6408                    )?);
6409                }
6410                "PhysicalResourceId" => {
6411                    obj.physical_resource_id = Some(PhysicalResourceIdDeserializer::deserialize(
6412                        "PhysicalResourceId",
6413                        stack,
6414                    )?);
6415                }
6416                "ResourceProperties" => {
6417                    obj.resource_properties = Some(ResourcePropertiesDeserializer::deserialize(
6418                        "ResourceProperties",
6419                        stack,
6420                    )?);
6421                }
6422                "ResourceStatus" => {
6423                    obj.resource_status = Some(ResourceStatusDeserializer::deserialize(
6424                        "ResourceStatus",
6425                        stack,
6426                    )?);
6427                }
6428                "ResourceStatusReason" => {
6429                    obj.resource_status_reason =
6430                        Some(ResourceStatusReasonDeserializer::deserialize(
6431                            "ResourceStatusReason",
6432                            stack,
6433                        )?);
6434                }
6435                "ResourceType" => {
6436                    obj.resource_type = Some(ResourceTypeDeserializer::deserialize(
6437                        "ResourceType",
6438                        stack,
6439                    )?);
6440                }
6441                "StackId" => {
6442                    obj.stack_id = StackIdDeserializer::deserialize("StackId", stack)?;
6443                }
6444                "StackName" => {
6445                    obj.stack_name = StackNameDeserializer::deserialize("StackName", stack)?;
6446                }
6447                "Timestamp" => {
6448                    obj.timestamp = TimestampDeserializer::deserialize("Timestamp", stack)?;
6449                }
6450                _ => skip_tree(stack),
6451            }
6452            Ok(())
6453        })
6454    }
6455}
6456#[allow(dead_code)]
6457struct StackEventsDeserializer;
6458impl StackEventsDeserializer {
6459    #[allow(dead_code, unused_variables)]
6460    fn deserialize<T: Peek + Next>(
6461        tag_name: &str,
6462        stack: &mut T,
6463    ) -> Result<Vec<StackEvent>, XmlParseError> {
6464        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
6465            if name == "member" {
6466                obj.push(StackEventDeserializer::deserialize("member", stack)?);
6467            } else {
6468                skip_tree(stack);
6469            }
6470            Ok(())
6471        })
6472    }
6473}
6474#[allow(dead_code)]
6475struct StackIdDeserializer;
6476impl StackIdDeserializer {
6477    #[allow(dead_code, unused_variables)]
6478    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
6479        xml_util::deserialize_primitive(tag_name, stack, Ok)
6480    }
6481}
6482/// <p>An AWS CloudFormation stack, in a specific account and Region, that's part of a stack set operation. A stack instance is a reference to an attempted or actual stack in a given account within a given Region. A stack instance can exist without a stack—for example, if the stack couldn't be created for some reason. A stack instance is associated with only one stack set. Each stack instance contains the ID of its associated stack set, as well as the ID of the actual stack and the stack status.</p>
6483#[derive(Clone, Debug, Default, PartialEq)]
6484#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
6485pub struct StackInstance {
6486    /// <p>[<code>Self-managed</code> permissions] The name of the AWS account that the stack instance is associated with.</p>
6487    pub account: Option<String>,
6488    /// <p><p>Status of the stack instance&#39;s actual configuration compared to the expected template and parameter configuration of the stack set to which it belongs. </p> <ul> <li> <p> <code>DRIFTED</code>: The stack differs from the expected template and parameter configuration of the stack set to which it belongs. A stack instance is considered to have drifted if one or more of the resources in the associated stack have drifted.</p> </li> <li> <p> <code>NOT<em>CHECKED</code>: AWS CloudFormation has not checked if the stack instance differs from its expected stack set configuration.</p> </li> <li> <p> <code>IN</em>SYNC</code>: The stack instance&#39;s actual configuration matches its expected stack set configuration.</p> </li> <li> <p> <code>UNKNOWN</code>: This value is reserved for future use.</p> </li> </ul></p>
6489    pub drift_status: Option<String>,
6490    /// <p>Most recent time when CloudFormation performed a drift detection operation on the stack instance. This value will be <code>NULL</code> for any stack instance on which drift detection has not yet been performed.</p>
6491    pub last_drift_check_timestamp: Option<String>,
6492    /// <p>[<code>Service-managed</code> permissions] The organization root ID or organizational unit (OU) IDs that you specified for <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DeploymentTargets.html">DeploymentTargets</a>.</p>
6493    pub organizational_unit_id: Option<String>,
6494    /// <p>A list of parameters from the stack set template whose values have been overridden in this stack instance.</p>
6495    pub parameter_overrides: Option<Vec<Parameter>>,
6496    /// <p>The name of the AWS Region that the stack instance is associated with.</p>
6497    pub region: Option<String>,
6498    /// <p>The ID of the stack instance.</p>
6499    pub stack_id: Option<String>,
6500    /// <p>The detailed status of the stack instance.</p>
6501    pub stack_instance_status: Option<StackInstanceComprehensiveStatus>,
6502    /// <p>The name or unique ID of the stack set that the stack instance is associated with.</p>
6503    pub stack_set_id: Option<String>,
6504    /// <p><p>The status of the stack instance, in terms of its synchronization with its associated stack set.</p> <ul> <li> <p> <code>INOPERABLE</code>: A <code>DeleteStackInstances</code> operation has failed and left the stack in an unstable state. Stacks in this state are excluded from further <code>UpdateStackSet</code> operations. You might need to perform a <code>DeleteStackInstances</code> operation, with <code>RetainStacks</code> set to <code>true</code>, to delete the stack instance, and then delete the stack manually.</p> </li> <li> <p> <code>OUTDATED</code>: The stack isn&#39;t currently up to date with the stack set because:</p> <ul> <li> <p>The associated stack failed during a <code>CreateStackSet</code> or <code>UpdateStackSet</code> operation. </p> </li> <li> <p>The stack was part of a <code>CreateStackSet</code> or <code>UpdateStackSet</code> operation that failed or was stopped before the stack was created or updated. </p> </li> </ul> </li> <li> <p> <code>CURRENT</code>: The stack is currently up to date with the stack set.</p> </li> </ul></p>
6505    pub status: Option<String>,
6506    /// <p>The explanation for the specific status code that is assigned to this stack instance.</p>
6507    pub status_reason: Option<String>,
6508}
6509
6510#[allow(dead_code)]
6511struct StackInstanceDeserializer;
6512impl StackInstanceDeserializer {
6513    #[allow(dead_code, unused_variables)]
6514    fn deserialize<T: Peek + Next>(
6515        tag_name: &str,
6516        stack: &mut T,
6517    ) -> Result<StackInstance, XmlParseError> {
6518        deserialize_elements::<_, StackInstance, _>(tag_name, stack, |name, stack, obj| {
6519            match name {
6520                "Account" => {
6521                    obj.account = Some(AccountDeserializer::deserialize("Account", stack)?);
6522                }
6523                "DriftStatus" => {
6524                    obj.drift_status = Some(StackDriftStatusDeserializer::deserialize(
6525                        "DriftStatus",
6526                        stack,
6527                    )?);
6528                }
6529                "LastDriftCheckTimestamp" => {
6530                    obj.last_drift_check_timestamp = Some(TimestampDeserializer::deserialize(
6531                        "LastDriftCheckTimestamp",
6532                        stack,
6533                    )?);
6534                }
6535                "OrganizationalUnitId" => {
6536                    obj.organizational_unit_id =
6537                        Some(OrganizationalUnitIdDeserializer::deserialize(
6538                            "OrganizationalUnitId",
6539                            stack,
6540                        )?);
6541                }
6542                "ParameterOverrides" => {
6543                    obj.parameter_overrides.get_or_insert(vec![]).extend(
6544                        ParametersDeserializer::deserialize("ParameterOverrides", stack)?,
6545                    );
6546                }
6547                "Region" => {
6548                    obj.region = Some(RegionDeserializer::deserialize("Region", stack)?);
6549                }
6550                "StackId" => {
6551                    obj.stack_id = Some(StackIdDeserializer::deserialize("StackId", stack)?);
6552                }
6553                "StackInstanceStatus" => {
6554                    obj.stack_instance_status =
6555                        Some(StackInstanceComprehensiveStatusDeserializer::deserialize(
6556                            "StackInstanceStatus",
6557                            stack,
6558                        )?);
6559                }
6560                "StackSetId" => {
6561                    obj.stack_set_id =
6562                        Some(StackSetIdDeserializer::deserialize("StackSetId", stack)?);
6563                }
6564                "Status" => {
6565                    obj.status = Some(StackInstanceStatusDeserializer::deserialize(
6566                        "Status", stack,
6567                    )?);
6568                }
6569                "StatusReason" => {
6570                    obj.status_reason =
6571                        Some(ReasonDeserializer::deserialize("StatusReason", stack)?);
6572                }
6573                _ => skip_tree(stack),
6574            }
6575            Ok(())
6576        })
6577    }
6578}
6579/// <p>The detailed status of the stack instance.</p>
6580#[derive(Clone, Debug, Default, PartialEq)]
6581#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
6582pub struct StackInstanceComprehensiveStatus {
6583    /// <ul> <li> <p> <code>CANCELLED</code>: The operation in the specified account and Region has been cancelled. This is either because a user has stopped the stack set operation, or because the failure tolerance of the stack set operation has been exceeded.</p> </li> <li> <p> <code>FAILED</code>: The operation in the specified account and Region failed. If the stack set operation fails in enough accounts within a Region, the failure tolerance for the stack set operation as a whole might be exceeded.</p> </li> <li> <p> <code>INOPERABLE</code>: A <code>DeleteStackInstances</code> operation has failed and left the stack in an unstable state. Stacks in this state are excluded from further <code>UpdateStackSet</code> operations. You might need to perform a <code>DeleteStackInstances</code> operation, with <code>RetainStacks</code> set to <code>true</code>, to delete the stack instance, and then delete the stack manually.</p> </li> <li> <p> <code>PENDING</code>: The operation in the specified account and Region has yet to start.</p> </li> <li> <p> <code>RUNNING</code>: The operation in the specified account and Region is currently in progress.</p> </li> <li> <p> <code>SUCCEEDED</code>: The operation in the specified account and Region completed successfully.</p> </li> </ul>
6584    pub detailed_status: Option<String>,
6585}
6586
6587#[allow(dead_code)]
6588struct StackInstanceComprehensiveStatusDeserializer;
6589impl StackInstanceComprehensiveStatusDeserializer {
6590    #[allow(dead_code, unused_variables)]
6591    fn deserialize<T: Peek + Next>(
6592        tag_name: &str,
6593        stack: &mut T,
6594    ) -> Result<StackInstanceComprehensiveStatus, XmlParseError> {
6595        deserialize_elements::<_, StackInstanceComprehensiveStatus, _>(
6596            tag_name,
6597            stack,
6598            |name, stack, obj| {
6599                match name {
6600                    "DetailedStatus" => {
6601                        obj.detailed_status =
6602                            Some(StackInstanceDetailedStatusDeserializer::deserialize(
6603                                "DetailedStatus",
6604                                stack,
6605                            )?);
6606                    }
6607                    _ => skip_tree(stack),
6608                }
6609                Ok(())
6610            },
6611        )
6612    }
6613}
6614#[allow(dead_code)]
6615struct StackInstanceDetailedStatusDeserializer;
6616impl StackInstanceDetailedStatusDeserializer {
6617    #[allow(dead_code, unused_variables)]
6618    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
6619        xml_util::deserialize_primitive(tag_name, stack, Ok)
6620    }
6621}
6622/// <p>The status that stack instances are filtered by.</p>
6623#[derive(Clone, Debug, Default, PartialEq)]
6624#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
6625pub struct StackInstanceFilter {
6626    /// <p>The type of filter to apply.</p>
6627    pub name: Option<String>,
6628    /// <p>The status to filter by.</p>
6629    pub values: Option<String>,
6630}
6631
6632/// Serialize `StackInstanceFilter` contents to a `SignedRequest`.
6633struct StackInstanceFilterSerializer;
6634impl StackInstanceFilterSerializer {
6635    fn serialize(params: &mut Params, name: &str, obj: &StackInstanceFilter) {
6636        let mut prefix = name.to_string();
6637        if prefix != "" {
6638            prefix.push_str(".");
6639        }
6640
6641        if let Some(ref field_value) = obj.name {
6642            params.put(&format!("{}{}", prefix, "Name"), &field_value);
6643        }
6644        if let Some(ref field_value) = obj.values {
6645            params.put(&format!("{}{}", prefix, "Values"), &field_value);
6646        }
6647    }
6648}
6649
6650/// Serialize `StackInstanceFilters` contents to a `SignedRequest`.
6651struct StackInstanceFiltersSerializer;
6652impl StackInstanceFiltersSerializer {
6653    fn serialize(params: &mut Params, name: &str, obj: &Vec<StackInstanceFilter>) {
6654        for (index, obj) in obj.iter().enumerate() {
6655            let key = format!("{}.member.{}", name, index + 1);
6656            StackInstanceFilterSerializer::serialize(params, &key, obj);
6657        }
6658    }
6659}
6660
6661#[allow(dead_code)]
6662struct StackInstanceStatusDeserializer;
6663impl StackInstanceStatusDeserializer {
6664    #[allow(dead_code, unused_variables)]
6665    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
6666        xml_util::deserialize_primitive(tag_name, stack, Ok)
6667    }
6668}
6669#[allow(dead_code)]
6670struct StackInstanceSummariesDeserializer;
6671impl StackInstanceSummariesDeserializer {
6672    #[allow(dead_code, unused_variables)]
6673    fn deserialize<T: Peek + Next>(
6674        tag_name: &str,
6675        stack: &mut T,
6676    ) -> Result<Vec<StackInstanceSummary>, XmlParseError> {
6677        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
6678            if name == "member" {
6679                obj.push(StackInstanceSummaryDeserializer::deserialize(
6680                    "member", stack,
6681                )?);
6682            } else {
6683                skip_tree(stack);
6684            }
6685            Ok(())
6686        })
6687    }
6688}
6689/// <p>The structure that contains summary information about a stack instance.</p>
6690#[derive(Clone, Debug, Default, PartialEq)]
6691#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
6692pub struct StackInstanceSummary {
6693    /// <p>[<code>Self-managed</code> permissions] The name of the AWS account that the stack instance is associated with.</p>
6694    pub account: Option<String>,
6695    /// <p><p>Status of the stack instance&#39;s actual configuration compared to the expected template and parameter configuration of the stack set to which it belongs. </p> <ul> <li> <p> <code>DRIFTED</code>: The stack differs from the expected template and parameter configuration of the stack set to which it belongs. A stack instance is considered to have drifted if one or more of the resources in the associated stack have drifted.</p> </li> <li> <p> <code>NOT<em>CHECKED</code>: AWS CloudFormation has not checked if the stack instance differs from its expected stack set configuration.</p> </li> <li> <p> <code>IN</em>SYNC</code>: The stack instance&#39;s actual configuration matches its expected stack set configuration.</p> </li> <li> <p> <code>UNKNOWN</code>: This value is reserved for future use.</p> </li> </ul></p>
6696    pub drift_status: Option<String>,
6697    /// <p>Most recent time when CloudFormation performed a drift detection operation on the stack instance. This value will be <code>NULL</code> for any stack instance on which drift detection has not yet been performed.</p>
6698    pub last_drift_check_timestamp: Option<String>,
6699    /// <p>[<code>Service-managed</code> permissions] The organization root ID or organizational unit (OU) IDs that you specified for <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DeploymentTargets.html">DeploymentTargets</a>.</p>
6700    pub organizational_unit_id: Option<String>,
6701    /// <p>The name of the AWS Region that the stack instance is associated with.</p>
6702    pub region: Option<String>,
6703    /// <p>The ID of the stack instance.</p>
6704    pub stack_id: Option<String>,
6705    /// <p>The detailed status of the stack instance.</p>
6706    pub stack_instance_status: Option<StackInstanceComprehensiveStatus>,
6707    /// <p>The name or unique ID of the stack set that the stack instance is associated with.</p>
6708    pub stack_set_id: Option<String>,
6709    /// <p><p>The status of the stack instance, in terms of its synchronization with its associated stack set.</p> <ul> <li> <p> <code>INOPERABLE</code>: A <code>DeleteStackInstances</code> operation has failed and left the stack in an unstable state. Stacks in this state are excluded from further <code>UpdateStackSet</code> operations. You might need to perform a <code>DeleteStackInstances</code> operation, with <code>RetainStacks</code> set to <code>true</code>, to delete the stack instance, and then delete the stack manually.</p> </li> <li> <p> <code>OUTDATED</code>: The stack isn&#39;t currently up to date with the stack set because:</p> <ul> <li> <p>The associated stack failed during a <code>CreateStackSet</code> or <code>UpdateStackSet</code> operation. </p> </li> <li> <p>The stack was part of a <code>CreateStackSet</code> or <code>UpdateStackSet</code> operation that failed or was stopped before the stack was created or updated. </p> </li> </ul> </li> <li> <p> <code>CURRENT</code>: The stack is currently up to date with the stack set.</p> </li> </ul></p>
6710    pub status: Option<String>,
6711    /// <p>The explanation for the specific status code assigned to this stack instance.</p>
6712    pub status_reason: Option<String>,
6713}
6714
6715#[allow(dead_code)]
6716struct StackInstanceSummaryDeserializer;
6717impl StackInstanceSummaryDeserializer {
6718    #[allow(dead_code, unused_variables)]
6719    fn deserialize<T: Peek + Next>(
6720        tag_name: &str,
6721        stack: &mut T,
6722    ) -> Result<StackInstanceSummary, XmlParseError> {
6723        deserialize_elements::<_, StackInstanceSummary, _>(tag_name, stack, |name, stack, obj| {
6724            match name {
6725                "Account" => {
6726                    obj.account = Some(AccountDeserializer::deserialize("Account", stack)?);
6727                }
6728                "DriftStatus" => {
6729                    obj.drift_status = Some(StackDriftStatusDeserializer::deserialize(
6730                        "DriftStatus",
6731                        stack,
6732                    )?);
6733                }
6734                "LastDriftCheckTimestamp" => {
6735                    obj.last_drift_check_timestamp = Some(TimestampDeserializer::deserialize(
6736                        "LastDriftCheckTimestamp",
6737                        stack,
6738                    )?);
6739                }
6740                "OrganizationalUnitId" => {
6741                    obj.organizational_unit_id =
6742                        Some(OrganizationalUnitIdDeserializer::deserialize(
6743                            "OrganizationalUnitId",
6744                            stack,
6745                        )?);
6746                }
6747                "Region" => {
6748                    obj.region = Some(RegionDeserializer::deserialize("Region", stack)?);
6749                }
6750                "StackId" => {
6751                    obj.stack_id = Some(StackIdDeserializer::deserialize("StackId", stack)?);
6752                }
6753                "StackInstanceStatus" => {
6754                    obj.stack_instance_status =
6755                        Some(StackInstanceComprehensiveStatusDeserializer::deserialize(
6756                            "StackInstanceStatus",
6757                            stack,
6758                        )?);
6759                }
6760                "StackSetId" => {
6761                    obj.stack_set_id =
6762                        Some(StackSetIdDeserializer::deserialize("StackSetId", stack)?);
6763                }
6764                "Status" => {
6765                    obj.status = Some(StackInstanceStatusDeserializer::deserialize(
6766                        "Status", stack,
6767                    )?);
6768                }
6769                "StatusReason" => {
6770                    obj.status_reason =
6771                        Some(ReasonDeserializer::deserialize("StatusReason", stack)?);
6772                }
6773                _ => skip_tree(stack),
6774            }
6775            Ok(())
6776        })
6777    }
6778}
6779#[allow(dead_code)]
6780struct StackNameDeserializer;
6781impl StackNameDeserializer {
6782    #[allow(dead_code, unused_variables)]
6783    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
6784        xml_util::deserialize_primitive(tag_name, stack, Ok)
6785    }
6786}
6787#[allow(dead_code)]
6788struct StackPolicyBodyDeserializer;
6789impl StackPolicyBodyDeserializer {
6790    #[allow(dead_code, unused_variables)]
6791    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
6792        xml_util::deserialize_primitive(tag_name, stack, Ok)
6793    }
6794}
6795/// <p>The StackResource data type.</p>
6796#[derive(Clone, Debug, Default, PartialEq)]
6797#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
6798pub struct StackResource {
6799    /// <p>User defined description associated with the resource.</p>
6800    pub description: Option<String>,
6801    /// <p>Information about whether the resource's actual configuration differs, or has <i>drifted</i>, from its expected configuration, as defined in the stack template and any values specified as template parameters. For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html">Detecting Unregulated Configuration Changes to Stacks and Resources</a>.</p>
6802    pub drift_information: Option<StackResourceDriftInformation>,
6803    /// <p>The logical name of the resource specified in the template.</p>
6804    pub logical_resource_id: String,
6805    /// <p>The name or unique identifier that corresponds to a physical instance ID of a resource supported by AWS CloudFormation.</p>
6806    pub physical_resource_id: Option<String>,
6807    /// <p>Current status of the resource.</p>
6808    pub resource_status: String,
6809    /// <p>Success/failure message associated with the resource.</p>
6810    pub resource_status_reason: Option<String>,
6811    /// <p>Type of resource. (For more information, go to <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html"> AWS Resource Types Reference</a> in the AWS CloudFormation User Guide.)</p>
6812    pub resource_type: String,
6813    /// <p>Unique identifier of the stack.</p>
6814    pub stack_id: Option<String>,
6815    /// <p>The name associated with the stack.</p>
6816    pub stack_name: Option<String>,
6817    /// <p>Time the status was updated.</p>
6818    pub timestamp: String,
6819}
6820
6821#[allow(dead_code)]
6822struct StackResourceDeserializer;
6823impl StackResourceDeserializer {
6824    #[allow(dead_code, unused_variables)]
6825    fn deserialize<T: Peek + Next>(
6826        tag_name: &str,
6827        stack: &mut T,
6828    ) -> Result<StackResource, XmlParseError> {
6829        deserialize_elements::<_, StackResource, _>(tag_name, stack, |name, stack, obj| {
6830            match name {
6831                "Description" => {
6832                    obj.description =
6833                        Some(DescriptionDeserializer::deserialize("Description", stack)?);
6834                }
6835                "DriftInformation" => {
6836                    obj.drift_information =
6837                        Some(StackResourceDriftInformationDeserializer::deserialize(
6838                            "DriftInformation",
6839                            stack,
6840                        )?);
6841                }
6842                "LogicalResourceId" => {
6843                    obj.logical_resource_id =
6844                        LogicalResourceIdDeserializer::deserialize("LogicalResourceId", stack)?;
6845                }
6846                "PhysicalResourceId" => {
6847                    obj.physical_resource_id = Some(PhysicalResourceIdDeserializer::deserialize(
6848                        "PhysicalResourceId",
6849                        stack,
6850                    )?);
6851                }
6852                "ResourceStatus" => {
6853                    obj.resource_status =
6854                        ResourceStatusDeserializer::deserialize("ResourceStatus", stack)?;
6855                }
6856                "ResourceStatusReason" => {
6857                    obj.resource_status_reason =
6858                        Some(ResourceStatusReasonDeserializer::deserialize(
6859                            "ResourceStatusReason",
6860                            stack,
6861                        )?);
6862                }
6863                "ResourceType" => {
6864                    obj.resource_type =
6865                        ResourceTypeDeserializer::deserialize("ResourceType", stack)?;
6866                }
6867                "StackId" => {
6868                    obj.stack_id = Some(StackIdDeserializer::deserialize("StackId", stack)?);
6869                }
6870                "StackName" => {
6871                    obj.stack_name = Some(StackNameDeserializer::deserialize("StackName", stack)?);
6872                }
6873                "Timestamp" => {
6874                    obj.timestamp = TimestampDeserializer::deserialize("Timestamp", stack)?;
6875                }
6876                _ => skip_tree(stack),
6877            }
6878            Ok(())
6879        })
6880    }
6881}
6882/// <p>Contains detailed information about the specified stack resource.</p>
6883#[derive(Clone, Debug, Default, PartialEq)]
6884#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
6885pub struct StackResourceDetail {
6886    /// <p>User defined description associated with the resource.</p>
6887    pub description: Option<String>,
6888    /// <p>Information about whether the resource's actual configuration differs, or has <i>drifted</i>, from its expected configuration, as defined in the stack template and any values specified as template parameters. For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html">Detecting Unregulated Configuration Changes to Stacks and Resources</a>.</p>
6889    pub drift_information: Option<StackResourceDriftInformation>,
6890    /// <p>Time the status was updated.</p>
6891    pub last_updated_timestamp: String,
6892    /// <p>The logical name of the resource specified in the template.</p>
6893    pub logical_resource_id: String,
6894    /// <p>The content of the <code>Metadata</code> attribute declared for the resource. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-metadata.html">Metadata Attribute</a> in the AWS CloudFormation User Guide.</p>
6895    pub metadata: Option<String>,
6896    /// <p>The name or unique identifier that corresponds to a physical instance ID of a resource supported by AWS CloudFormation.</p>
6897    pub physical_resource_id: Option<String>,
6898    /// <p>Current status of the resource.</p>
6899    pub resource_status: String,
6900    /// <p>Success/failure message associated with the resource.</p>
6901    pub resource_status_reason: Option<String>,
6902    /// <p>Type of resource. ((For more information, go to <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html"> AWS Resource Types Reference</a> in the AWS CloudFormation User Guide.)</p>
6903    pub resource_type: String,
6904    /// <p>Unique identifier of the stack.</p>
6905    pub stack_id: Option<String>,
6906    /// <p>The name associated with the stack.</p>
6907    pub stack_name: Option<String>,
6908}
6909
6910#[allow(dead_code)]
6911struct StackResourceDetailDeserializer;
6912impl StackResourceDetailDeserializer {
6913    #[allow(dead_code, unused_variables)]
6914    fn deserialize<T: Peek + Next>(
6915        tag_name: &str,
6916        stack: &mut T,
6917    ) -> Result<StackResourceDetail, XmlParseError> {
6918        deserialize_elements::<_, StackResourceDetail, _>(tag_name, stack, |name, stack, obj| {
6919            match name {
6920                "Description" => {
6921                    obj.description =
6922                        Some(DescriptionDeserializer::deserialize("Description", stack)?);
6923                }
6924                "DriftInformation" => {
6925                    obj.drift_information =
6926                        Some(StackResourceDriftInformationDeserializer::deserialize(
6927                            "DriftInformation",
6928                            stack,
6929                        )?);
6930                }
6931                "LastUpdatedTimestamp" => {
6932                    obj.last_updated_timestamp =
6933                        TimestampDeserializer::deserialize("LastUpdatedTimestamp", stack)?;
6934                }
6935                "LogicalResourceId" => {
6936                    obj.logical_resource_id =
6937                        LogicalResourceIdDeserializer::deserialize("LogicalResourceId", stack)?;
6938                }
6939                "Metadata" => {
6940                    obj.metadata = Some(MetadataDeserializer::deserialize("Metadata", stack)?);
6941                }
6942                "PhysicalResourceId" => {
6943                    obj.physical_resource_id = Some(PhysicalResourceIdDeserializer::deserialize(
6944                        "PhysicalResourceId",
6945                        stack,
6946                    )?);
6947                }
6948                "ResourceStatus" => {
6949                    obj.resource_status =
6950                        ResourceStatusDeserializer::deserialize("ResourceStatus", stack)?;
6951                }
6952                "ResourceStatusReason" => {
6953                    obj.resource_status_reason =
6954                        Some(ResourceStatusReasonDeserializer::deserialize(
6955                            "ResourceStatusReason",
6956                            stack,
6957                        )?);
6958                }
6959                "ResourceType" => {
6960                    obj.resource_type =
6961                        ResourceTypeDeserializer::deserialize("ResourceType", stack)?;
6962                }
6963                "StackId" => {
6964                    obj.stack_id = Some(StackIdDeserializer::deserialize("StackId", stack)?);
6965                }
6966                "StackName" => {
6967                    obj.stack_name = Some(StackNameDeserializer::deserialize("StackName", stack)?);
6968                }
6969                _ => skip_tree(stack),
6970            }
6971            Ok(())
6972        })
6973    }
6974}
6975/// <p>Contains the drift information for a resource that has been checked for drift. This includes actual and expected property values for resources in which AWS CloudFormation has detected drift. Only resource properties explicitly defined in the stack template are checked for drift. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html">Detecting Unregulated Configuration Changes to Stacks and Resources</a>.</p> <p>Resources that do not currently support drift detection cannot be checked. For a list of resources that support drift detection, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift-resource-list.html">Resources that Support Drift Detection</a>.</p> <p>Use <a>DetectStackResourceDrift</a> to detect drift on individual resources, or <a>DetectStackDrift</a> to detect drift on all resources in a given stack that support drift detection.</p>
6976#[derive(Clone, Debug, Default, PartialEq)]
6977#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
6978pub struct StackResourceDrift {
6979    /// <p>A JSON structure containing the actual property values of the stack resource.</p> <p>For resources whose <code>StackResourceDriftStatus</code> is <code>DELETED</code>, this structure will not be present. </p>
6980    pub actual_properties: Option<String>,
6981    /// <p>A JSON structure containing the expected property values of the stack resource, as defined in the stack template and any values specified as template parameters. </p> <p>For resources whose <code>StackResourceDriftStatus</code> is <code>DELETED</code>, this structure will not be present. </p>
6982    pub expected_properties: Option<String>,
6983    /// <p>The logical name of the resource specified in the template.</p>
6984    pub logical_resource_id: String,
6985    /// <p>The name or unique identifier that corresponds to a physical instance ID of a resource supported by AWS CloudFormation. </p>
6986    pub physical_resource_id: Option<String>,
6987    /// <p>Context information that enables AWS CloudFormation to uniquely identify a resource. AWS CloudFormation uses context key-value pairs in cases where a resource's logical and physical IDs are not enough to uniquely identify that resource. Each context key-value pair specifies a unique resource that contains the targeted resource.</p>
6988    pub physical_resource_id_context: Option<Vec<PhysicalResourceIdContextKeyValuePair>>,
6989    /// <p>A collection of the resource properties whose actual values differ from their expected values. These will be present only for resources whose <code>StackResourceDriftStatus</code> is <code>MODIFIED</code>. </p>
6990    pub property_differences: Option<Vec<PropertyDifference>>,
6991    /// <p>The type of the resource.</p>
6992    pub resource_type: String,
6993    /// <p>The ID of the stack.</p>
6994    pub stack_id: String,
6995    /// <p><p>Status of the resource&#39;s actual configuration compared to its expected configuration</p> <ul> <li> <p> <code>DELETED</code>: The resource differs from its expected template configuration because the resource has been deleted.</p> </li> <li> <p> <code>MODIFIED</code>: One or more resource properties differ from their expected values (as defined in the stack template and any values specified as template parameters).</p> </li> <li> <p> <code>IN<em>SYNC</code>: The resources&#39;s actual configuration matches its expected template configuration.</p> </li> <li> <p> <code>NOT</em>CHECKED</code>: AWS CloudFormation does not currently return this value.</p> </li> </ul></p>
6996    pub stack_resource_drift_status: String,
6997    /// <p>Time at which AWS CloudFormation performed drift detection on the stack resource.</p>
6998    pub timestamp: String,
6999}
7000
7001#[allow(dead_code)]
7002struct StackResourceDriftDeserializer;
7003impl StackResourceDriftDeserializer {
7004    #[allow(dead_code, unused_variables)]
7005    fn deserialize<T: Peek + Next>(
7006        tag_name: &str,
7007        stack: &mut T,
7008    ) -> Result<StackResourceDrift, XmlParseError> {
7009        deserialize_elements::<_, StackResourceDrift, _>(tag_name, stack, |name, stack, obj| {
7010            match name {
7011                "ActualProperties" => {
7012                    obj.actual_properties = Some(PropertiesDeserializer::deserialize(
7013                        "ActualProperties",
7014                        stack,
7015                    )?);
7016                }
7017                "ExpectedProperties" => {
7018                    obj.expected_properties = Some(PropertiesDeserializer::deserialize(
7019                        "ExpectedProperties",
7020                        stack,
7021                    )?);
7022                }
7023                "LogicalResourceId" => {
7024                    obj.logical_resource_id =
7025                        LogicalResourceIdDeserializer::deserialize("LogicalResourceId", stack)?;
7026                }
7027                "PhysicalResourceId" => {
7028                    obj.physical_resource_id = Some(PhysicalResourceIdDeserializer::deserialize(
7029                        "PhysicalResourceId",
7030                        stack,
7031                    )?);
7032                }
7033                "PhysicalResourceIdContext" => {
7034                    obj.physical_resource_id_context
7035                        .get_or_insert(vec![])
7036                        .extend(PhysicalResourceIdContextDeserializer::deserialize(
7037                            "PhysicalResourceIdContext",
7038                            stack,
7039                        )?);
7040                }
7041                "PropertyDifferences" => {
7042                    obj.property_differences.get_or_insert(vec![]).extend(
7043                        PropertyDifferencesDeserializer::deserialize("PropertyDifferences", stack)?,
7044                    );
7045                }
7046                "ResourceType" => {
7047                    obj.resource_type =
7048                        ResourceTypeDeserializer::deserialize("ResourceType", stack)?;
7049                }
7050                "StackId" => {
7051                    obj.stack_id = StackIdDeserializer::deserialize("StackId", stack)?;
7052                }
7053                "StackResourceDriftStatus" => {
7054                    obj.stack_resource_drift_status =
7055                        StackResourceDriftStatusDeserializer::deserialize(
7056                            "StackResourceDriftStatus",
7057                            stack,
7058                        )?;
7059                }
7060                "Timestamp" => {
7061                    obj.timestamp = TimestampDeserializer::deserialize("Timestamp", stack)?;
7062                }
7063                _ => skip_tree(stack),
7064            }
7065            Ok(())
7066        })
7067    }
7068}
7069/// <p>Contains information about whether the resource's actual configuration differs, or has <i>drifted</i>, from its expected configuration.</p>
7070#[derive(Clone, Debug, Default, PartialEq)]
7071#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
7072pub struct StackResourceDriftInformation {
7073    /// <p>When AWS CloudFormation last checked if the resource had drifted from its expected configuration.</p>
7074    pub last_check_timestamp: Option<String>,
7075    /// <p><p>Status of the resource&#39;s actual configuration compared to its expected configuration</p> <ul> <li> <p> <code>DELETED</code>: The resource differs from its expected configuration in that it has been deleted.</p> </li> <li> <p> <code>MODIFIED</code>: The resource differs from its expected configuration.</p> </li> <li> <p> <code>NOT<em>CHECKED</code>: AWS CloudFormation has not checked if the resource differs from its expected configuration.</p> <p>Any resources that do not currently support drift detection have a status of <code>NOT</em>CHECKED</code>. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift-resource-list.html">Resources that Support Drift Detection</a>. </p> </li> <li> <p> <code>IN_SYNC</code>: The resources&#39;s actual configuration matches its expected configuration.</p> </li> </ul></p>
7076    pub stack_resource_drift_status: String,
7077}
7078
7079#[allow(dead_code)]
7080struct StackResourceDriftInformationDeserializer;
7081impl StackResourceDriftInformationDeserializer {
7082    #[allow(dead_code, unused_variables)]
7083    fn deserialize<T: Peek + Next>(
7084        tag_name: &str,
7085        stack: &mut T,
7086    ) -> Result<StackResourceDriftInformation, XmlParseError> {
7087        deserialize_elements::<_, StackResourceDriftInformation, _>(
7088            tag_name,
7089            stack,
7090            |name, stack, obj| {
7091                match name {
7092                    "LastCheckTimestamp" => {
7093                        obj.last_check_timestamp = Some(TimestampDeserializer::deserialize(
7094                            "LastCheckTimestamp",
7095                            stack,
7096                        )?);
7097                    }
7098                    "StackResourceDriftStatus" => {
7099                        obj.stack_resource_drift_status =
7100                            StackResourceDriftStatusDeserializer::deserialize(
7101                                "StackResourceDriftStatus",
7102                                stack,
7103                            )?;
7104                    }
7105                    _ => skip_tree(stack),
7106                }
7107                Ok(())
7108            },
7109        )
7110    }
7111}
7112/// <p>Summarizes information about whether the resource's actual configuration differs, or has <i>drifted</i>, from its expected configuration.</p>
7113#[derive(Clone, Debug, Default, PartialEq)]
7114#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
7115pub struct StackResourceDriftInformationSummary {
7116    /// <p>When AWS CloudFormation last checked if the resource had drifted from its expected configuration.</p>
7117    pub last_check_timestamp: Option<String>,
7118    /// <p><p>Status of the resource&#39;s actual configuration compared to its expected configuration</p> <ul> <li> <p> <code>DELETED</code>: The resource differs from its expected configuration in that it has been deleted.</p> </li> <li> <p> <code>MODIFIED</code>: The resource differs from its expected configuration.</p> </li> <li> <p> <code>NOT<em>CHECKED</code>: AWS CloudFormation has not checked if the resource differs from its expected configuration.</p> <p>Any resources that do not currently support drift detection have a status of <code>NOT</em>CHECKED</code>. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift-resource-list.html">Resources that Support Drift Detection</a>. If you performed an <a>ContinueUpdateRollback</a> operation on a stack, any resources included in <code>ResourcesToSkip</code> will also have a status of <code>NOT<em>CHECKED</code>. For more information on skipping resources during rollback operations, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-continueupdaterollback.html">Continue Rolling Back an Update</a> in the AWS CloudFormation User Guide.</p> </li> <li> <p> <code>IN</em>SYNC</code>: The resources&#39;s actual configuration matches its expected configuration.</p> </li> </ul></p>
7119    pub stack_resource_drift_status: String,
7120}
7121
7122#[allow(dead_code)]
7123struct StackResourceDriftInformationSummaryDeserializer;
7124impl StackResourceDriftInformationSummaryDeserializer {
7125    #[allow(dead_code, unused_variables)]
7126    fn deserialize<T: Peek + Next>(
7127        tag_name: &str,
7128        stack: &mut T,
7129    ) -> Result<StackResourceDriftInformationSummary, XmlParseError> {
7130        deserialize_elements::<_, StackResourceDriftInformationSummary, _>(
7131            tag_name,
7132            stack,
7133            |name, stack, obj| {
7134                match name {
7135                    "LastCheckTimestamp" => {
7136                        obj.last_check_timestamp = Some(TimestampDeserializer::deserialize(
7137                            "LastCheckTimestamp",
7138                            stack,
7139                        )?);
7140                    }
7141                    "StackResourceDriftStatus" => {
7142                        obj.stack_resource_drift_status =
7143                            StackResourceDriftStatusDeserializer::deserialize(
7144                                "StackResourceDriftStatus",
7145                                stack,
7146                            )?;
7147                    }
7148                    _ => skip_tree(stack),
7149                }
7150                Ok(())
7151            },
7152        )
7153    }
7154}
7155#[allow(dead_code)]
7156struct StackResourceDriftStatusDeserializer;
7157impl StackResourceDriftStatusDeserializer {
7158    #[allow(dead_code, unused_variables)]
7159    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
7160        xml_util::deserialize_primitive(tag_name, stack, Ok)
7161    }
7162}
7163
7164/// Serialize `StackResourceDriftStatusFilters` contents to a `SignedRequest`.
7165struct StackResourceDriftStatusFiltersSerializer;
7166impl StackResourceDriftStatusFiltersSerializer {
7167    fn serialize(params: &mut Params, name: &str, obj: &Vec<String>) {
7168        for (index, obj) in obj.iter().enumerate() {
7169            let key = format!("{}.member.{}", name, index + 1);
7170            params.put(&key, &obj);
7171        }
7172    }
7173}
7174
7175#[allow(dead_code)]
7176struct StackResourceDriftsDeserializer;
7177impl StackResourceDriftsDeserializer {
7178    #[allow(dead_code, unused_variables)]
7179    fn deserialize<T: Peek + Next>(
7180        tag_name: &str,
7181        stack: &mut T,
7182    ) -> Result<Vec<StackResourceDrift>, XmlParseError> {
7183        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
7184            if name == "member" {
7185                obj.push(StackResourceDriftDeserializer::deserialize(
7186                    "member", stack,
7187                )?);
7188            } else {
7189                skip_tree(stack);
7190            }
7191            Ok(())
7192        })
7193    }
7194}
7195#[allow(dead_code)]
7196struct StackResourceSummariesDeserializer;
7197impl StackResourceSummariesDeserializer {
7198    #[allow(dead_code, unused_variables)]
7199    fn deserialize<T: Peek + Next>(
7200        tag_name: &str,
7201        stack: &mut T,
7202    ) -> Result<Vec<StackResourceSummary>, XmlParseError> {
7203        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
7204            if name == "member" {
7205                obj.push(StackResourceSummaryDeserializer::deserialize(
7206                    "member", stack,
7207                )?);
7208            } else {
7209                skip_tree(stack);
7210            }
7211            Ok(())
7212        })
7213    }
7214}
7215/// <p>Contains high-level information about the specified stack resource.</p>
7216#[derive(Clone, Debug, Default, PartialEq)]
7217#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
7218pub struct StackResourceSummary {
7219    /// <p>Information about whether the resource's actual configuration differs, or has <i>drifted</i>, from its expected configuration, as defined in the stack template and any values specified as template parameters. For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html">Detecting Unregulated Configuration Changes to Stacks and Resources</a>.</p>
7220    pub drift_information: Option<StackResourceDriftInformationSummary>,
7221    /// <p>Time the status was updated.</p>
7222    pub last_updated_timestamp: String,
7223    /// <p>The logical name of the resource specified in the template.</p>
7224    pub logical_resource_id: String,
7225    /// <p>The name or unique identifier that corresponds to a physical instance ID of the resource.</p>
7226    pub physical_resource_id: Option<String>,
7227    /// <p>Current status of the resource.</p>
7228    pub resource_status: String,
7229    /// <p>Success/failure message associated with the resource.</p>
7230    pub resource_status_reason: Option<String>,
7231    /// <p>Type of resource. (For more information, go to <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html"> AWS Resource Types Reference</a> in the AWS CloudFormation User Guide.)</p>
7232    pub resource_type: String,
7233}
7234
7235#[allow(dead_code)]
7236struct StackResourceSummaryDeserializer;
7237impl StackResourceSummaryDeserializer {
7238    #[allow(dead_code, unused_variables)]
7239    fn deserialize<T: Peek + Next>(
7240        tag_name: &str,
7241        stack: &mut T,
7242    ) -> Result<StackResourceSummary, XmlParseError> {
7243        deserialize_elements::<_, StackResourceSummary, _>(tag_name, stack, |name, stack, obj| {
7244            match name {
7245                "DriftInformation" => {
7246                    obj.drift_information = Some(
7247                        StackResourceDriftInformationSummaryDeserializer::deserialize(
7248                            "DriftInformation",
7249                            stack,
7250                        )?,
7251                    );
7252                }
7253                "LastUpdatedTimestamp" => {
7254                    obj.last_updated_timestamp =
7255                        TimestampDeserializer::deserialize("LastUpdatedTimestamp", stack)?;
7256                }
7257                "LogicalResourceId" => {
7258                    obj.logical_resource_id =
7259                        LogicalResourceIdDeserializer::deserialize("LogicalResourceId", stack)?;
7260                }
7261                "PhysicalResourceId" => {
7262                    obj.physical_resource_id = Some(PhysicalResourceIdDeserializer::deserialize(
7263                        "PhysicalResourceId",
7264                        stack,
7265                    )?);
7266                }
7267                "ResourceStatus" => {
7268                    obj.resource_status =
7269                        ResourceStatusDeserializer::deserialize("ResourceStatus", stack)?;
7270                }
7271                "ResourceStatusReason" => {
7272                    obj.resource_status_reason =
7273                        Some(ResourceStatusReasonDeserializer::deserialize(
7274                            "ResourceStatusReason",
7275                            stack,
7276                        )?);
7277                }
7278                "ResourceType" => {
7279                    obj.resource_type =
7280                        ResourceTypeDeserializer::deserialize("ResourceType", stack)?;
7281                }
7282                _ => skip_tree(stack),
7283            }
7284            Ok(())
7285        })
7286    }
7287}
7288#[allow(dead_code)]
7289struct StackResourcesDeserializer;
7290impl StackResourcesDeserializer {
7291    #[allow(dead_code, unused_variables)]
7292    fn deserialize<T: Peek + Next>(
7293        tag_name: &str,
7294        stack: &mut T,
7295    ) -> Result<Vec<StackResource>, XmlParseError> {
7296        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
7297            if name == "member" {
7298                obj.push(StackResourceDeserializer::deserialize("member", stack)?);
7299            } else {
7300                skip_tree(stack);
7301            }
7302            Ok(())
7303        })
7304    }
7305}
7306/// <p>A structure that contains information about a stack set. A stack set enables you to provision stacks into AWS accounts and across Regions by using a single CloudFormation template. In the stack set, you specify the template to use, as well as any parameters and capabilities that the template requires. </p>
7307#[derive(Clone, Debug, Default, PartialEq)]
7308#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
7309pub struct StackSet {
7310    /// <p>The Amazon Resource Number (ARN) of the IAM role used to create or update the stack set.</p> <p>Use customized administrator roles to control which users or groups can manage specific stack sets within the same administrator account. For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-prereqs.html">Prerequisites: Granting Permissions for Stack Set Operations</a> in the <i>AWS CloudFormation User Guide</i>.</p>
7311    pub administration_role_arn: Option<String>,
7312    /// <p>[<code>Service-managed</code> permissions] Describes whether StackSets automatically deploys to AWS Organizations accounts that are added to a target organization or organizational unit (OU).</p>
7313    pub auto_deployment: Option<AutoDeployment>,
7314    /// <p>The capabilities that are allowed in the stack set. Some stack set templates might include resources that can affect permissions in your AWS account—for example, by creating new AWS Identity and Access Management (IAM) users. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html#capabilities">Acknowledging IAM Resources in AWS CloudFormation Templates.</a> </p>
7315    pub capabilities: Option<Vec<String>>,
7316    /// <p>A description of the stack set that you specify when the stack set is created or updated.</p>
7317    pub description: Option<String>,
7318    /// <p>The name of the IAM execution role used to create or update the stack set. </p> <p>Use customized execution roles to control which stack resources users and groups can include in their stack sets. </p>
7319    pub execution_role_name: Option<String>,
7320    /// <p>[<code>Service-managed</code> permissions] The organization root ID or organizational unit (OU) IDs that you specified for <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DeploymentTargets.html">DeploymentTargets</a>.</p>
7321    pub organizational_unit_ids: Option<Vec<String>>,
7322    /// <p>A list of input parameters for a stack set.</p>
7323    pub parameters: Option<Vec<Parameter>>,
7324    /// <p><p>Describes how the IAM roles required for stack set operations are created.</p> <ul> <li> <p>With <code>self-managed</code> permissions, you must create the administrator and execution roles required to deploy to target accounts. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-prereqs-self-managed.html">Grant Self-Managed Stack Set Permissions</a>.</p> </li> <li> <p>With <code>service-managed</code> permissions, StackSets automatically creates the IAM roles required to deploy to accounts managed by AWS Organizations. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-prereqs-service-managed.html">Grant Service-Managed Stack Set Permissions</a>.</p> </li> </ul></p>
7325    pub permission_model: Option<String>,
7326    /// <p>The Amazon Resource Number (ARN) of the stack set.</p>
7327    pub stack_set_arn: Option<String>,
7328    /// <p>Detailed information about the drift status of the stack set.</p> <p>For stack sets, contains information about the last <i>completed</i> drift operation performed on the stack set. Information about drift operations currently in progress is not included.</p>
7329    pub stack_set_drift_detection_details: Option<StackSetDriftDetectionDetails>,
7330    /// <p>The ID of the stack set.</p>
7331    pub stack_set_id: Option<String>,
7332    /// <p>The name that's associated with the stack set.</p>
7333    pub stack_set_name: Option<String>,
7334    /// <p>The status of the stack set.</p>
7335    pub status: Option<String>,
7336    /// <p>A list of tags that specify information about the stack set. A maximum number of 50 tags can be specified.</p>
7337    pub tags: Option<Vec<Tag>>,
7338    /// <p>The structure that contains the body of the template that was used to create or update the stack set.</p>
7339    pub template_body: Option<String>,
7340}
7341
7342#[allow(dead_code)]
7343struct StackSetDeserializer;
7344impl StackSetDeserializer {
7345    #[allow(dead_code, unused_variables)]
7346    fn deserialize<T: Peek + Next>(
7347        tag_name: &str,
7348        stack: &mut T,
7349    ) -> Result<StackSet, XmlParseError> {
7350        deserialize_elements::<_, StackSet, _>(tag_name, stack, |name, stack, obj| {
7351            match name {
7352                "AdministrationRoleARN" => {
7353                    obj.administration_role_arn = Some(RoleARNDeserializer::deserialize(
7354                        "AdministrationRoleARN",
7355                        stack,
7356                    )?);
7357                }
7358                "AutoDeployment" => {
7359                    obj.auto_deployment = Some(AutoDeploymentDeserializer::deserialize(
7360                        "AutoDeployment",
7361                        stack,
7362                    )?);
7363                }
7364                "Capabilities" => {
7365                    obj.capabilities.get_or_insert(vec![]).extend(
7366                        CapabilitiesDeserializer::deserialize("Capabilities", stack)?,
7367                    );
7368                }
7369                "Description" => {
7370                    obj.description =
7371                        Some(DescriptionDeserializer::deserialize("Description", stack)?);
7372                }
7373                "ExecutionRoleName" => {
7374                    obj.execution_role_name = Some(ExecutionRoleNameDeserializer::deserialize(
7375                        "ExecutionRoleName",
7376                        stack,
7377                    )?);
7378                }
7379                "OrganizationalUnitIds" => {
7380                    obj.organizational_unit_ids.get_or_insert(vec![]).extend(
7381                        OrganizationalUnitIdListDeserializer::deserialize(
7382                            "OrganizationalUnitIds",
7383                            stack,
7384                        )?,
7385                    );
7386                }
7387                "Parameters" => {
7388                    obj.parameters
7389                        .get_or_insert(vec![])
7390                        .extend(ParametersDeserializer::deserialize("Parameters", stack)?);
7391                }
7392                "PermissionModel" => {
7393                    obj.permission_model = Some(PermissionModelsDeserializer::deserialize(
7394                        "PermissionModel",
7395                        stack,
7396                    )?);
7397                }
7398                "StackSetARN" => {
7399                    obj.stack_set_arn =
7400                        Some(StackSetARNDeserializer::deserialize("StackSetARN", stack)?);
7401                }
7402                "StackSetDriftDetectionDetails" => {
7403                    obj.stack_set_drift_detection_details =
7404                        Some(StackSetDriftDetectionDetailsDeserializer::deserialize(
7405                            "StackSetDriftDetectionDetails",
7406                            stack,
7407                        )?);
7408                }
7409                "StackSetId" => {
7410                    obj.stack_set_id =
7411                        Some(StackSetIdDeserializer::deserialize("StackSetId", stack)?);
7412                }
7413                "StackSetName" => {
7414                    obj.stack_set_name = Some(StackSetNameDeserializer::deserialize(
7415                        "StackSetName",
7416                        stack,
7417                    )?);
7418                }
7419                "Status" => {
7420                    obj.status = Some(StackSetStatusDeserializer::deserialize("Status", stack)?);
7421                }
7422                "Tags" => {
7423                    obj.tags
7424                        .get_or_insert(vec![])
7425                        .extend(TagsDeserializer::deserialize("Tags", stack)?);
7426                }
7427                "TemplateBody" => {
7428                    obj.template_body = Some(TemplateBodyDeserializer::deserialize(
7429                        "TemplateBody",
7430                        stack,
7431                    )?);
7432                }
7433                _ => skip_tree(stack),
7434            }
7435            Ok(())
7436        })
7437    }
7438}
7439#[allow(dead_code)]
7440struct StackSetARNDeserializer;
7441impl StackSetARNDeserializer {
7442    #[allow(dead_code, unused_variables)]
7443    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
7444        xml_util::deserialize_primitive(tag_name, stack, Ok)
7445    }
7446}
7447/// <p>Detailed information about the drift status of the stack set.</p> <p>For stack sets, contains information about the last <i>completed</i> drift operation performed on the stack set. Information about drift operations in-progress is not included. </p> <p>For stack set operations, includes information about drift operations currently being performed on the stack set.</p> <p>For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-drift.html">Detecting Unmanaged Changes in Stack Sets</a> in the <i>AWS CloudFormation User Guide</i>.</p>
7448#[derive(Clone, Debug, Default, PartialEq)]
7449#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
7450pub struct StackSetDriftDetectionDetails {
7451    /// <p><p>The status of the stack set drift detection operation.</p> <ul> <li> <p> <code>COMPLETED</code>: The drift detection operation completed without failing on any stack instances.</p> </li> <li> <p> <code>FAILED</code>: The drift detection operation exceeded the specified failure tolerance. </p> </li> <li> <p> <code>PARTIAL<em>SUCCESS</code>: The drift detection operation completed without exceeding the failure tolerance for the operation.</p> </li> <li> <p> <code>IN</em>PROGRESS</code>: The drift detection operation is currently being performed.</p> </li> <li> <p> <code>STOPPED</code>: The user has cancelled the drift detection operation.</p> </li> </ul></p>
7452    pub drift_detection_status: Option<String>,
7453    /// <p><p>Status of the stack set&#39;s actual configuration compared to its expected template and parameter configuration. A stack set is considered to have drifted if one or more of its stack instances have drifted from their expected template and parameter configuration.</p> <ul> <li> <p> <code>DRIFTED</code>: One or more of the stack instances belonging to the stack set stack differs from the expected template and parameter configuration. A stack instance is considered to have drifted if one or more of the resources in the associated stack have drifted.</p> </li> <li> <p> <code>NOT<em>CHECKED</code>: AWS CloudFormation has not checked the stack set for drift.</p> </li> <li> <p> <code>IN</em>SYNC</code>: All of the stack instances belonging to the stack set stack match from the expected template and parameter configuration.</p> </li> </ul></p>
7454    pub drift_status: Option<String>,
7455    /// <p>The number of stack instances that have drifted from the expected template and parameter configuration of the stack set. A stack instance is considered to have drifted if one or more of the resources in the associated stack do not match their expected configuration.</p>
7456    pub drifted_stack_instances_count: Option<i64>,
7457    /// <p>The number of stack instances for which the drift detection operation failed.</p>
7458    pub failed_stack_instances_count: Option<i64>,
7459    /// <p>The number of stack instances that are currently being checked for drift.</p>
7460    pub in_progress_stack_instances_count: Option<i64>,
7461    /// <p>The number of stack instances which match the expected template and parameter configuration of the stack set.</p>
7462    pub in_sync_stack_instances_count: Option<i64>,
7463    /// <p>Most recent time when CloudFormation performed a drift detection operation on the stack set. This value will be <code>NULL</code> for any stack set on which drift detection has not yet been performed.</p>
7464    pub last_drift_check_timestamp: Option<String>,
7465    /// <p><p>The total number of stack instances belonging to this stack set. </p> <p>The total number of stack instances is equal to the total of:</p> <ul> <li> <p>Stack instances that match the stack set configuration. </p> </li> <li> <p>Stack instances that have drifted from the stack set configuration. </p> </li> <li> <p>Stack instances where the drift detection operation has failed.</p> </li> <li> <p>Stack instances currently being checked for drift.</p> </li> </ul></p>
7466    pub total_stack_instances_count: Option<i64>,
7467}
7468
7469#[allow(dead_code)]
7470struct StackSetDriftDetectionDetailsDeserializer;
7471impl StackSetDriftDetectionDetailsDeserializer {
7472    #[allow(dead_code, unused_variables)]
7473    fn deserialize<T: Peek + Next>(
7474        tag_name: &str,
7475        stack: &mut T,
7476    ) -> Result<StackSetDriftDetectionDetails, XmlParseError> {
7477        deserialize_elements::<_, StackSetDriftDetectionDetails, _>(
7478            tag_name,
7479            stack,
7480            |name, stack, obj| {
7481                match name {
7482                    "DriftDetectionStatus" => {
7483                        obj.drift_detection_status =
7484                            Some(StackSetDriftDetectionStatusDeserializer::deserialize(
7485                                "DriftDetectionStatus",
7486                                stack,
7487                            )?);
7488                    }
7489                    "DriftStatus" => {
7490                        obj.drift_status = Some(StackSetDriftStatusDeserializer::deserialize(
7491                            "DriftStatus",
7492                            stack,
7493                        )?);
7494                    }
7495                    "DriftedStackInstancesCount" => {
7496                        obj.drifted_stack_instances_count =
7497                            Some(DriftedStackInstancesCountDeserializer::deserialize(
7498                                "DriftedStackInstancesCount",
7499                                stack,
7500                            )?);
7501                    }
7502                    "FailedStackInstancesCount" => {
7503                        obj.failed_stack_instances_count =
7504                            Some(FailedStackInstancesCountDeserializer::deserialize(
7505                                "FailedStackInstancesCount",
7506                                stack,
7507                            )?);
7508                    }
7509                    "InProgressStackInstancesCount" => {
7510                        obj.in_progress_stack_instances_count =
7511                            Some(InProgressStackInstancesCountDeserializer::deserialize(
7512                                "InProgressStackInstancesCount",
7513                                stack,
7514                            )?);
7515                    }
7516                    "InSyncStackInstancesCount" => {
7517                        obj.in_sync_stack_instances_count =
7518                            Some(InSyncStackInstancesCountDeserializer::deserialize(
7519                                "InSyncStackInstancesCount",
7520                                stack,
7521                            )?);
7522                    }
7523                    "LastDriftCheckTimestamp" => {
7524                        obj.last_drift_check_timestamp = Some(TimestampDeserializer::deserialize(
7525                            "LastDriftCheckTimestamp",
7526                            stack,
7527                        )?);
7528                    }
7529                    "TotalStackInstancesCount" => {
7530                        obj.total_stack_instances_count =
7531                            Some(TotalStackInstancesCountDeserializer::deserialize(
7532                                "TotalStackInstancesCount",
7533                                stack,
7534                            )?);
7535                    }
7536                    _ => skip_tree(stack),
7537                }
7538                Ok(())
7539            },
7540        )
7541    }
7542}
7543#[allow(dead_code)]
7544struct StackSetDriftDetectionStatusDeserializer;
7545impl StackSetDriftDetectionStatusDeserializer {
7546    #[allow(dead_code, unused_variables)]
7547    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
7548        xml_util::deserialize_primitive(tag_name, stack, Ok)
7549    }
7550}
7551#[allow(dead_code)]
7552struct StackSetDriftStatusDeserializer;
7553impl StackSetDriftStatusDeserializer {
7554    #[allow(dead_code, unused_variables)]
7555    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
7556        xml_util::deserialize_primitive(tag_name, stack, Ok)
7557    }
7558}
7559#[allow(dead_code)]
7560struct StackSetIdDeserializer;
7561impl StackSetIdDeserializer {
7562    #[allow(dead_code, unused_variables)]
7563    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
7564        xml_util::deserialize_primitive(tag_name, stack, Ok)
7565    }
7566}
7567#[allow(dead_code)]
7568struct StackSetNameDeserializer;
7569impl StackSetNameDeserializer {
7570    #[allow(dead_code, unused_variables)]
7571    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
7572        xml_util::deserialize_primitive(tag_name, stack, Ok)
7573    }
7574}
7575/// <p>The structure that contains information about a stack set operation. </p>
7576#[derive(Clone, Debug, Default, PartialEq)]
7577#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
7578pub struct StackSetOperation {
7579    /// <p>The type of stack set operation: <code>CREATE</code>, <code>UPDATE</code>, or <code>DELETE</code>. Create and delete operations affect only the specified stack set instances that are associated with the specified stack set. Update operations affect both the stack set itself, as well as <i>all</i> associated stack set instances.</p>
7580    pub action: Option<String>,
7581    /// <p>The Amazon Resource Number (ARN) of the IAM role used to perform this stack set operation. </p> <p>Use customized administrator roles to control which users or groups can manage specific stack sets within the same administrator account. For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-prereqs.html">Define Permissions for Multiple Administrators</a> in the <i>AWS CloudFormation User Guide</i>.</p>
7582    pub administration_role_arn: Option<String>,
7583    /// <p>The time at which the operation was initiated. Note that the creation times for the stack set operation might differ from the creation time of the individual stacks themselves. This is because AWS CloudFormation needs to perform preparatory work for the operation, such as dispatching the work to the requested Regions, before actually creating the first stacks.</p>
7584    pub creation_timestamp: Option<String>,
7585    /// <p>[<code>Service-managed</code> permissions] The AWS Organizations accounts affected by the stack operation.</p>
7586    pub deployment_targets: Option<DeploymentTargets>,
7587    /// <p>The time at which the stack set operation ended, across all accounts and Regions specified. Note that this doesn't necessarily mean that the stack set operation was successful, or even attempted, in each account or Region.</p>
7588    pub end_timestamp: Option<String>,
7589    /// <p>The name of the IAM execution role used to create or update the stack set.</p> <p>Use customized execution roles to control which stack resources users and groups can include in their stack sets. </p>
7590    pub execution_role_name: Option<String>,
7591    /// <p>The unique ID of a stack set operation.</p>
7592    pub operation_id: Option<String>,
7593    /// <p>The preferences for how AWS CloudFormation performs this stack set operation.</p>
7594    pub operation_preferences: Option<StackSetOperationPreferences>,
7595    /// <p>For stack set operations of action type <code>DELETE</code>, specifies whether to remove the stack instances from the specified stack set, but doesn't delete the stacks. You can't reassociate a retained stack, or add an existing, saved stack to a new stack set.</p>
7596    pub retain_stacks: Option<bool>,
7597    /// <p>Detailed information about the drift status of the stack set. This includes information about drift operations currently being performed on the stack set.</p> <p>this information will only be present for stack set operations whose <code>Action</code> type is <code>DETECT_DRIFT</code>.</p> <p>For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-drift.html">Detecting Unmanaged Changes in Stack Sets</a> in the AWS CloudFormation User Guide.</p>
7598    pub stack_set_drift_detection_details: Option<StackSetDriftDetectionDetails>,
7599    /// <p>The ID of the stack set.</p>
7600    pub stack_set_id: Option<String>,
7601    /// <p><p>The status of the operation. </p> <ul> <li> <p> <code>FAILED</code>: The operation exceeded the specified failure tolerance. The failure tolerance value that you&#39;ve set for an operation is applied for each Region during stack create and update operations. If the number of failed stacks within a Region exceeds the failure tolerance, the status of the operation in the Region is set to <code>FAILED</code>. This in turn sets the status of the operation as a whole to <code>FAILED</code>, and AWS CloudFormation cancels the operation in any remaining Regions.</p> </li> <li> <p> <code>QUEUED</code>: [<code>Service-managed</code> permissions] For automatic deployments that require a sequence of operations, the operation is queued to be performed. For more information, see the <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-concepts.html#stackset-status-codes">stack set operation status codes</a> in the AWS CloudFormation User Guide.</p> </li> <li> <p> <code>RUNNING</code>: The operation is currently being performed.</p> </li> <li> <p> <code>STOPPED</code>: The user has cancelled the operation.</p> </li> <li> <p> <code>STOPPING</code>: The operation is in the process of stopping, at user request. </p> </li> <li> <p> <code>SUCCEEDED</code>: The operation completed creating or updating all the specified stacks without exceeding the failure tolerance for the operation.</p> </li> </ul></p>
7602    pub status: Option<String>,
7603}
7604
7605#[allow(dead_code)]
7606struct StackSetOperationDeserializer;
7607impl StackSetOperationDeserializer {
7608    #[allow(dead_code, unused_variables)]
7609    fn deserialize<T: Peek + Next>(
7610        tag_name: &str,
7611        stack: &mut T,
7612    ) -> Result<StackSetOperation, XmlParseError> {
7613        deserialize_elements::<_, StackSetOperation, _>(tag_name, stack, |name, stack, obj| {
7614            match name {
7615                "Action" => {
7616                    obj.action = Some(StackSetOperationActionDeserializer::deserialize(
7617                        "Action", stack,
7618                    )?);
7619                }
7620                "AdministrationRoleARN" => {
7621                    obj.administration_role_arn = Some(RoleARNDeserializer::deserialize(
7622                        "AdministrationRoleARN",
7623                        stack,
7624                    )?);
7625                }
7626                "CreationTimestamp" => {
7627                    obj.creation_timestamp = Some(TimestampDeserializer::deserialize(
7628                        "CreationTimestamp",
7629                        stack,
7630                    )?);
7631                }
7632                "DeploymentTargets" => {
7633                    obj.deployment_targets = Some(DeploymentTargetsDeserializer::deserialize(
7634                        "DeploymentTargets",
7635                        stack,
7636                    )?);
7637                }
7638                "EndTimestamp" => {
7639                    obj.end_timestamp =
7640                        Some(TimestampDeserializer::deserialize("EndTimestamp", stack)?);
7641                }
7642                "ExecutionRoleName" => {
7643                    obj.execution_role_name = Some(ExecutionRoleNameDeserializer::deserialize(
7644                        "ExecutionRoleName",
7645                        stack,
7646                    )?);
7647                }
7648                "OperationId" => {
7649                    obj.operation_id = Some(ClientRequestTokenDeserializer::deserialize(
7650                        "OperationId",
7651                        stack,
7652                    )?);
7653                }
7654                "OperationPreferences" => {
7655                    obj.operation_preferences =
7656                        Some(StackSetOperationPreferencesDeserializer::deserialize(
7657                            "OperationPreferences",
7658                            stack,
7659                        )?);
7660                }
7661                "RetainStacks" => {
7662                    obj.retain_stacks = Some(RetainStacksNullableDeserializer::deserialize(
7663                        "RetainStacks",
7664                        stack,
7665                    )?);
7666                }
7667                "StackSetDriftDetectionDetails" => {
7668                    obj.stack_set_drift_detection_details =
7669                        Some(StackSetDriftDetectionDetailsDeserializer::deserialize(
7670                            "StackSetDriftDetectionDetails",
7671                            stack,
7672                        )?);
7673                }
7674                "StackSetId" => {
7675                    obj.stack_set_id =
7676                        Some(StackSetIdDeserializer::deserialize("StackSetId", stack)?);
7677                }
7678                "Status" => {
7679                    obj.status = Some(StackSetOperationStatusDeserializer::deserialize(
7680                        "Status", stack,
7681                    )?);
7682                }
7683                _ => skip_tree(stack),
7684            }
7685            Ok(())
7686        })
7687    }
7688}
7689#[allow(dead_code)]
7690struct StackSetOperationActionDeserializer;
7691impl StackSetOperationActionDeserializer {
7692    #[allow(dead_code, unused_variables)]
7693    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
7694        xml_util::deserialize_primitive(tag_name, stack, Ok)
7695    }
7696}
7697/// <p>The user-specified preferences for how AWS CloudFormation performs a stack set operation. </p> <p>For more information on maximum concurrent accounts and failure tolerance, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-concepts.html#stackset-ops-options">Stack set operation options</a>.</p>
7698#[derive(Clone, Debug, Default, PartialEq)]
7699#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
7700#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
7701pub struct StackSetOperationPreferences {
7702    /// <p>The number of accounts, per Region, for which this operation can fail before AWS CloudFormation stops the operation in that Region. If the operation is stopped in a Region, AWS CloudFormation doesn't attempt the operation in any subsequent Regions.</p> <p>Conditional: You must specify either <code>FailureToleranceCount</code> or <code>FailureTolerancePercentage</code> (but not both).</p>
7703    pub failure_tolerance_count: Option<i64>,
7704    /// <p>The percentage of accounts, per Region, for which this stack operation can fail before AWS CloudFormation stops the operation in that Region. If the operation is stopped in a Region, AWS CloudFormation doesn't attempt the operation in any subsequent Regions.</p> <p>When calculating the number of accounts based on the specified percentage, AWS CloudFormation rounds <i>down</i> to the next whole number.</p> <p>Conditional: You must specify either <code>FailureToleranceCount</code> or <code>FailureTolerancePercentage</code>, but not both.</p>
7705    pub failure_tolerance_percentage: Option<i64>,
7706    /// <p>The maximum number of accounts in which to perform this operation at one time. This is dependent on the value of <code>FailureToleranceCount</code>. <code>MaxConcurrentCount</code> is at most one more than the <code>FailureToleranceCount</code>.</p> <p>Note that this setting lets you specify the <i>maximum</i> for operations. For large deployments, under certain circumstances the actual number of accounts acted upon concurrently may be lower due to service throttling.</p> <p>Conditional: You must specify either <code>MaxConcurrentCount</code> or <code>MaxConcurrentPercentage</code>, but not both.</p>
7707    pub max_concurrent_count: Option<i64>,
7708    /// <p>The maximum percentage of accounts in which to perform this operation at one time.</p> <p>When calculating the number of accounts based on the specified percentage, AWS CloudFormation rounds down to the next whole number. This is true except in cases where rounding down would result is zero. In this case, CloudFormation sets the number as one instead.</p> <p>Note that this setting lets you specify the <i>maximum</i> for operations. For large deployments, under certain circumstances the actual number of accounts acted upon concurrently may be lower due to service throttling.</p> <p>Conditional: You must specify either <code>MaxConcurrentCount</code> or <code>MaxConcurrentPercentage</code>, but not both.</p>
7709    pub max_concurrent_percentage: Option<i64>,
7710    /// <p>The order of the Regions in where you want to perform the stack operation.</p>
7711    pub region_order: Option<Vec<String>>,
7712}
7713
7714#[allow(dead_code)]
7715struct StackSetOperationPreferencesDeserializer;
7716impl StackSetOperationPreferencesDeserializer {
7717    #[allow(dead_code, unused_variables)]
7718    fn deserialize<T: Peek + Next>(
7719        tag_name: &str,
7720        stack: &mut T,
7721    ) -> Result<StackSetOperationPreferences, XmlParseError> {
7722        deserialize_elements::<_, StackSetOperationPreferences, _>(
7723            tag_name,
7724            stack,
7725            |name, stack, obj| {
7726                match name {
7727                    "FailureToleranceCount" => {
7728                        obj.failure_tolerance_count =
7729                            Some(FailureToleranceCountDeserializer::deserialize(
7730                                "FailureToleranceCount",
7731                                stack,
7732                            )?);
7733                    }
7734                    "FailureTolerancePercentage" => {
7735                        obj.failure_tolerance_percentage =
7736                            Some(FailureTolerancePercentageDeserializer::deserialize(
7737                                "FailureTolerancePercentage",
7738                                stack,
7739                            )?);
7740                    }
7741                    "MaxConcurrentCount" => {
7742                        obj.max_concurrent_count =
7743                            Some(MaxConcurrentCountDeserializer::deserialize(
7744                                "MaxConcurrentCount",
7745                                stack,
7746                            )?);
7747                    }
7748                    "MaxConcurrentPercentage" => {
7749                        obj.max_concurrent_percentage =
7750                            Some(MaxConcurrentPercentageDeserializer::deserialize(
7751                                "MaxConcurrentPercentage",
7752                                stack,
7753                            )?);
7754                    }
7755                    "RegionOrder" => {
7756                        obj.region_order
7757                            .get_or_insert(vec![])
7758                            .extend(RegionListDeserializer::deserialize("RegionOrder", stack)?);
7759                    }
7760                    _ => skip_tree(stack),
7761                }
7762                Ok(())
7763            },
7764        )
7765    }
7766}
7767
7768/// Serialize `StackSetOperationPreferences` contents to a `SignedRequest`.
7769struct StackSetOperationPreferencesSerializer;
7770impl StackSetOperationPreferencesSerializer {
7771    fn serialize(params: &mut Params, name: &str, obj: &StackSetOperationPreferences) {
7772        let mut prefix = name.to_string();
7773        if prefix != "" {
7774            prefix.push_str(".");
7775        }
7776
7777        if let Some(ref field_value) = obj.failure_tolerance_count {
7778            params.put(
7779                &format!("{}{}", prefix, "FailureToleranceCount"),
7780                &field_value,
7781            );
7782        }
7783        if let Some(ref field_value) = obj.failure_tolerance_percentage {
7784            params.put(
7785                &format!("{}{}", prefix, "FailureTolerancePercentage"),
7786                &field_value,
7787            );
7788        }
7789        if let Some(ref field_value) = obj.max_concurrent_count {
7790            params.put(&format!("{}{}", prefix, "MaxConcurrentCount"), &field_value);
7791        }
7792        if let Some(ref field_value) = obj.max_concurrent_percentage {
7793            params.put(
7794                &format!("{}{}", prefix, "MaxConcurrentPercentage"),
7795                &field_value,
7796            );
7797        }
7798        if let Some(ref field_value) = obj.region_order {
7799            RegionListSerializer::serialize(
7800                params,
7801                &format!("{}{}", prefix, "RegionOrder"),
7802                field_value,
7803            );
7804        }
7805    }
7806}
7807
7808#[allow(dead_code)]
7809struct StackSetOperationResultStatusDeserializer;
7810impl StackSetOperationResultStatusDeserializer {
7811    #[allow(dead_code, unused_variables)]
7812    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
7813        xml_util::deserialize_primitive(tag_name, stack, Ok)
7814    }
7815}
7816#[allow(dead_code)]
7817struct StackSetOperationResultSummariesDeserializer;
7818impl StackSetOperationResultSummariesDeserializer {
7819    #[allow(dead_code, unused_variables)]
7820    fn deserialize<T: Peek + Next>(
7821        tag_name: &str,
7822        stack: &mut T,
7823    ) -> Result<Vec<StackSetOperationResultSummary>, XmlParseError> {
7824        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
7825            if name == "member" {
7826                obj.push(StackSetOperationResultSummaryDeserializer::deserialize(
7827                    "member", stack,
7828                )?);
7829            } else {
7830                skip_tree(stack);
7831            }
7832            Ok(())
7833        })
7834    }
7835}
7836/// <p>The structure that contains information about a specified operation's results for a given account in a given Region.</p>
7837#[derive(Clone, Debug, Default, PartialEq)]
7838#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
7839pub struct StackSetOperationResultSummary {
7840    /// <p>[<code>Self-managed</code> permissions] The name of the AWS account for this operation result.</p>
7841    pub account: Option<String>,
7842    /// <p>The results of the account gate function AWS CloudFormation invokes, if present, before proceeding with stack set operations in an account</p>
7843    pub account_gate_result: Option<AccountGateResult>,
7844    /// <p>[<code>Service-managed</code> permissions] The organization root ID or organizational unit (OU) IDs that you specified for <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DeploymentTargets.html">DeploymentTargets</a>.</p>
7845    pub organizational_unit_id: Option<String>,
7846    /// <p>The name of the AWS Region for this operation result.</p>
7847    pub region: Option<String>,
7848    /// <p><p>The result status of the stack set operation for the given account in the given Region.</p> <ul> <li> <p> <code>CANCELLED</code>: The operation in the specified account and Region has been cancelled. This is either because a user has stopped the stack set operation, or because the failure tolerance of the stack set operation has been exceeded.</p> </li> <li> <p> <code>FAILED</code>: The operation in the specified account and Region failed. </p> <p>If the stack set operation fails in enough accounts within a Region, the failure tolerance for the stack set operation as a whole might be exceeded. </p> </li> <li> <p> <code>RUNNING</code>: The operation in the specified account and Region is currently in progress.</p> </li> <li> <p> <code>PENDING</code>: The operation in the specified account and Region has yet to start. </p> </li> <li> <p> <code>SUCCEEDED</code>: The operation in the specified account and Region completed successfully.</p> </li> </ul></p>
7849    pub status: Option<String>,
7850    /// <p>The reason for the assigned result status.</p>
7851    pub status_reason: Option<String>,
7852}
7853
7854#[allow(dead_code)]
7855struct StackSetOperationResultSummaryDeserializer;
7856impl StackSetOperationResultSummaryDeserializer {
7857    #[allow(dead_code, unused_variables)]
7858    fn deserialize<T: Peek + Next>(
7859        tag_name: &str,
7860        stack: &mut T,
7861    ) -> Result<StackSetOperationResultSummary, XmlParseError> {
7862        deserialize_elements::<_, StackSetOperationResultSummary, _>(
7863            tag_name,
7864            stack,
7865            |name, stack, obj| {
7866                match name {
7867                    "Account" => {
7868                        obj.account = Some(AccountDeserializer::deserialize("Account", stack)?);
7869                    }
7870                    "AccountGateResult" => {
7871                        obj.account_gate_result = Some(AccountGateResultDeserializer::deserialize(
7872                            "AccountGateResult",
7873                            stack,
7874                        )?);
7875                    }
7876                    "OrganizationalUnitId" => {
7877                        obj.organizational_unit_id =
7878                            Some(OrganizationalUnitIdDeserializer::deserialize(
7879                                "OrganizationalUnitId",
7880                                stack,
7881                            )?);
7882                    }
7883                    "Region" => {
7884                        obj.region = Some(RegionDeserializer::deserialize("Region", stack)?);
7885                    }
7886                    "Status" => {
7887                        obj.status = Some(StackSetOperationResultStatusDeserializer::deserialize(
7888                            "Status", stack,
7889                        )?);
7890                    }
7891                    "StatusReason" => {
7892                        obj.status_reason =
7893                            Some(ReasonDeserializer::deserialize("StatusReason", stack)?);
7894                    }
7895                    _ => skip_tree(stack),
7896                }
7897                Ok(())
7898            },
7899        )
7900    }
7901}
7902#[allow(dead_code)]
7903struct StackSetOperationStatusDeserializer;
7904impl StackSetOperationStatusDeserializer {
7905    #[allow(dead_code, unused_variables)]
7906    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
7907        xml_util::deserialize_primitive(tag_name, stack, Ok)
7908    }
7909}
7910#[allow(dead_code)]
7911struct StackSetOperationSummariesDeserializer;
7912impl StackSetOperationSummariesDeserializer {
7913    #[allow(dead_code, unused_variables)]
7914    fn deserialize<T: Peek + Next>(
7915        tag_name: &str,
7916        stack: &mut T,
7917    ) -> Result<Vec<StackSetOperationSummary>, XmlParseError> {
7918        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
7919            if name == "member" {
7920                obj.push(StackSetOperationSummaryDeserializer::deserialize(
7921                    "member", stack,
7922                )?);
7923            } else {
7924                skip_tree(stack);
7925            }
7926            Ok(())
7927        })
7928    }
7929}
7930/// <p>The structures that contain summary information about the specified operation.</p>
7931#[derive(Clone, Debug, Default, PartialEq)]
7932#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
7933pub struct StackSetOperationSummary {
7934    /// <p>The type of operation: <code>CREATE</code>, <code>UPDATE</code>, or <code>DELETE</code>. Create and delete operations affect only the specified stack instances that are associated with the specified stack set. Update operations affect both the stack set itself as well as <i>all</i> associated stack set instances.</p>
7935    pub action: Option<String>,
7936    /// <p>The time at which the operation was initiated. Note that the creation times for the stack set operation might differ from the creation time of the individual stacks themselves. This is because AWS CloudFormation needs to perform preparatory work for the operation, such as dispatching the work to the requested Regions, before actually creating the first stacks.</p>
7937    pub creation_timestamp: Option<String>,
7938    /// <p>The time at which the stack set operation ended, across all accounts and Regions specified. Note that this doesn't necessarily mean that the stack set operation was successful, or even attempted, in each account or Region.</p>
7939    pub end_timestamp: Option<String>,
7940    /// <p>The unique ID of the stack set operation.</p>
7941    pub operation_id: Option<String>,
7942    /// <p><p>The overall status of the operation.</p> <ul> <li> <p> <code>FAILED</code>: The operation exceeded the specified failure tolerance. The failure tolerance value that you&#39;ve set for an operation is applied for each Region during stack create and update operations. If the number of failed stacks within a Region exceeds the failure tolerance, the status of the operation in the Region is set to <code>FAILED</code>. This in turn sets the status of the operation as a whole to <code>FAILED</code>, and AWS CloudFormation cancels the operation in any remaining Regions.</p> </li> <li> <p> <code>QUEUED</code>: [<code>Service-managed</code> permissions] For automatic deployments that require a sequence of operations, the operation is queued to be performed. For more information, see the <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-concepts.html#stackset-status-codes">stack set operation status codes</a> in the AWS CloudFormation User Guide.</p> </li> <li> <p> <code>RUNNING</code>: The operation is currently being performed.</p> </li> <li> <p> <code>STOPPED</code>: The user has cancelled the operation.</p> </li> <li> <p> <code>STOPPING</code>: The operation is in the process of stopping, at user request. </p> </li> <li> <p> <code>SUCCEEDED</code>: The operation completed creating or updating all the specified stacks without exceeding the failure tolerance for the operation.</p> </li> </ul></p>
7943    pub status: Option<String>,
7944}
7945
7946#[allow(dead_code)]
7947struct StackSetOperationSummaryDeserializer;
7948impl StackSetOperationSummaryDeserializer {
7949    #[allow(dead_code, unused_variables)]
7950    fn deserialize<T: Peek + Next>(
7951        tag_name: &str,
7952        stack: &mut T,
7953    ) -> Result<StackSetOperationSummary, XmlParseError> {
7954        deserialize_elements::<_, StackSetOperationSummary, _>(
7955            tag_name,
7956            stack,
7957            |name, stack, obj| {
7958                match name {
7959                    "Action" => {
7960                        obj.action = Some(StackSetOperationActionDeserializer::deserialize(
7961                            "Action", stack,
7962                        )?);
7963                    }
7964                    "CreationTimestamp" => {
7965                        obj.creation_timestamp = Some(TimestampDeserializer::deserialize(
7966                            "CreationTimestamp",
7967                            stack,
7968                        )?);
7969                    }
7970                    "EndTimestamp" => {
7971                        obj.end_timestamp =
7972                            Some(TimestampDeserializer::deserialize("EndTimestamp", stack)?);
7973                    }
7974                    "OperationId" => {
7975                        obj.operation_id = Some(ClientRequestTokenDeserializer::deserialize(
7976                            "OperationId",
7977                            stack,
7978                        )?);
7979                    }
7980                    "Status" => {
7981                        obj.status = Some(StackSetOperationStatusDeserializer::deserialize(
7982                            "Status", stack,
7983                        )?);
7984                    }
7985                    _ => skip_tree(stack),
7986                }
7987                Ok(())
7988            },
7989        )
7990    }
7991}
7992#[allow(dead_code)]
7993struct StackSetStatusDeserializer;
7994impl StackSetStatusDeserializer {
7995    #[allow(dead_code, unused_variables)]
7996    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
7997        xml_util::deserialize_primitive(tag_name, stack, Ok)
7998    }
7999}
8000#[allow(dead_code)]
8001struct StackSetSummariesDeserializer;
8002impl StackSetSummariesDeserializer {
8003    #[allow(dead_code, unused_variables)]
8004    fn deserialize<T: Peek + Next>(
8005        tag_name: &str,
8006        stack: &mut T,
8007    ) -> Result<Vec<StackSetSummary>, XmlParseError> {
8008        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
8009            if name == "member" {
8010                obj.push(StackSetSummaryDeserializer::deserialize("member", stack)?);
8011            } else {
8012                skip_tree(stack);
8013            }
8014            Ok(())
8015        })
8016    }
8017}
8018/// <p>The structures that contain summary information about the specified stack set.</p>
8019#[derive(Clone, Debug, Default, PartialEq)]
8020#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
8021pub struct StackSetSummary {
8022    /// <p>[<code>Service-managed</code> permissions] Describes whether StackSets automatically deploys to AWS Organizations accounts that are added to a target organizational unit (OU).</p>
8023    pub auto_deployment: Option<AutoDeployment>,
8024    /// <p>A description of the stack set that you specify when the stack set is created or updated.</p>
8025    pub description: Option<String>,
8026    /// <p><p>Status of the stack set&#39;s actual configuration compared to its expected template and parameter configuration. A stack set is considered to have drifted if one or more of its stack instances have drifted from their expected template and parameter configuration.</p> <ul> <li> <p> <code>DRIFTED</code>: One or more of the stack instances belonging to the stack set stack differs from the expected template and parameter configuration. A stack instance is considered to have drifted if one or more of the resources in the associated stack have drifted.</p> </li> <li> <p> <code>NOT<em>CHECKED</code>: AWS CloudFormation has not checked the stack set for drift.</p> </li> <li> <p> <code>IN</em>SYNC</code>: All of the stack instances belonging to the stack set stack match from the expected template and parameter configuration.</p> </li> <li> <p> <code>UNKNOWN</code>: This value is reserved for future use.</p> </li> </ul></p>
8027    pub drift_status: Option<String>,
8028    /// <p>Most recent time when CloudFormation performed a drift detection operation on the stack set. This value will be <code>NULL</code> for any stack set on which drift detection has not yet been performed.</p>
8029    pub last_drift_check_timestamp: Option<String>,
8030    /// <p><p>Describes how the IAM roles required for stack set operations are created.</p> <ul> <li> <p>With <code>self-managed</code> permissions, you must create the administrator and execution roles required to deploy to target accounts. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-prereqs-self-managed.html">Grant Self-Managed Stack Set Permissions</a>.</p> </li> <li> <p>With <code>service-managed</code> permissions, StackSets automatically creates the IAM roles required to deploy to accounts managed by AWS Organizations. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-prereqs-service-managed.html">Grant Service-Managed Stack Set Permissions</a>.</p> </li> </ul></p>
8031    pub permission_model: Option<String>,
8032    /// <p>The ID of the stack set.</p>
8033    pub stack_set_id: Option<String>,
8034    /// <p>The name of the stack set.</p>
8035    pub stack_set_name: Option<String>,
8036    /// <p>The status of the stack set.</p>
8037    pub status: Option<String>,
8038}
8039
8040#[allow(dead_code)]
8041struct StackSetSummaryDeserializer;
8042impl StackSetSummaryDeserializer {
8043    #[allow(dead_code, unused_variables)]
8044    fn deserialize<T: Peek + Next>(
8045        tag_name: &str,
8046        stack: &mut T,
8047    ) -> Result<StackSetSummary, XmlParseError> {
8048        deserialize_elements::<_, StackSetSummary, _>(tag_name, stack, |name, stack, obj| {
8049            match name {
8050                "AutoDeployment" => {
8051                    obj.auto_deployment = Some(AutoDeploymentDeserializer::deserialize(
8052                        "AutoDeployment",
8053                        stack,
8054                    )?);
8055                }
8056                "Description" => {
8057                    obj.description =
8058                        Some(DescriptionDeserializer::deserialize("Description", stack)?);
8059                }
8060                "DriftStatus" => {
8061                    obj.drift_status = Some(StackDriftStatusDeserializer::deserialize(
8062                        "DriftStatus",
8063                        stack,
8064                    )?);
8065                }
8066                "LastDriftCheckTimestamp" => {
8067                    obj.last_drift_check_timestamp = Some(TimestampDeserializer::deserialize(
8068                        "LastDriftCheckTimestamp",
8069                        stack,
8070                    )?);
8071                }
8072                "PermissionModel" => {
8073                    obj.permission_model = Some(PermissionModelsDeserializer::deserialize(
8074                        "PermissionModel",
8075                        stack,
8076                    )?);
8077                }
8078                "StackSetId" => {
8079                    obj.stack_set_id =
8080                        Some(StackSetIdDeserializer::deserialize("StackSetId", stack)?);
8081                }
8082                "StackSetName" => {
8083                    obj.stack_set_name = Some(StackSetNameDeserializer::deserialize(
8084                        "StackSetName",
8085                        stack,
8086                    )?);
8087                }
8088                "Status" => {
8089                    obj.status = Some(StackSetStatusDeserializer::deserialize("Status", stack)?);
8090                }
8091                _ => skip_tree(stack),
8092            }
8093            Ok(())
8094        })
8095    }
8096}
8097#[allow(dead_code)]
8098struct StackStatusDeserializer;
8099impl StackStatusDeserializer {
8100    #[allow(dead_code, unused_variables)]
8101    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
8102        xml_util::deserialize_primitive(tag_name, stack, Ok)
8103    }
8104}
8105
8106/// Serialize `StackStatusFilter` contents to a `SignedRequest`.
8107struct StackStatusFilterSerializer;
8108impl StackStatusFilterSerializer {
8109    fn serialize(params: &mut Params, name: &str, obj: &Vec<String>) {
8110        for (index, obj) in obj.iter().enumerate() {
8111            let key = format!("{}.member.{}", name, index + 1);
8112            params.put(&key, &obj);
8113        }
8114    }
8115}
8116
8117#[allow(dead_code)]
8118struct StackStatusReasonDeserializer;
8119impl StackStatusReasonDeserializer {
8120    #[allow(dead_code, unused_variables)]
8121    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
8122        xml_util::deserialize_primitive(tag_name, stack, Ok)
8123    }
8124}
8125#[allow(dead_code)]
8126struct StackSummariesDeserializer;
8127impl StackSummariesDeserializer {
8128    #[allow(dead_code, unused_variables)]
8129    fn deserialize<T: Peek + Next>(
8130        tag_name: &str,
8131        stack: &mut T,
8132    ) -> Result<Vec<StackSummary>, XmlParseError> {
8133        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
8134            if name == "member" {
8135                obj.push(StackSummaryDeserializer::deserialize("member", stack)?);
8136            } else {
8137                skip_tree(stack);
8138            }
8139            Ok(())
8140        })
8141    }
8142}
8143/// <p>The StackSummary Data Type</p>
8144#[derive(Clone, Debug, Default, PartialEq)]
8145#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
8146pub struct StackSummary {
8147    /// <p>The time the stack was created.</p>
8148    pub creation_time: String,
8149    /// <p>The time the stack was deleted.</p>
8150    pub deletion_time: Option<String>,
8151    /// <p>Summarizes information on whether a stack's actual configuration differs, or has <i>drifted</i>, from it's expected configuration, as defined in the stack template and any values specified as template parameters. For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html">Detecting Unregulated Configuration Changes to Stacks and Resources</a>.</p>
8152    pub drift_information: Option<StackDriftInformationSummary>,
8153    /// <p>The time the stack was last updated. This field will only be returned if the stack has been updated at least once.</p>
8154    pub last_updated_time: Option<String>,
8155    /// <p>For nested stacks--stacks created as resources for another stack--the stack ID of the direct parent of this stack. For the first level of nested stacks, the root stack is also the parent stack.</p> <p>For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-nested-stacks.html">Working with Nested Stacks</a> in the <i>AWS CloudFormation User Guide</i>.</p>
8156    pub parent_id: Option<String>,
8157    /// <p>For nested stacks--stacks created as resources for another stack--the stack ID of the top-level stack to which the nested stack ultimately belongs.</p> <p>For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-nested-stacks.html">Working with Nested Stacks</a> in the <i>AWS CloudFormation User Guide</i>.</p>
8158    pub root_id: Option<String>,
8159    /// <p>Unique stack identifier.</p>
8160    pub stack_id: Option<String>,
8161    /// <p>The name associated with the stack.</p>
8162    pub stack_name: String,
8163    /// <p>The current status of the stack.</p>
8164    pub stack_status: String,
8165    /// <p>Success/Failure message associated with the stack status.</p>
8166    pub stack_status_reason: Option<String>,
8167    /// <p>The template description of the template used to create the stack.</p>
8168    pub template_description: Option<String>,
8169}
8170
8171#[allow(dead_code)]
8172struct StackSummaryDeserializer;
8173impl StackSummaryDeserializer {
8174    #[allow(dead_code, unused_variables)]
8175    fn deserialize<T: Peek + Next>(
8176        tag_name: &str,
8177        stack: &mut T,
8178    ) -> Result<StackSummary, XmlParseError> {
8179        deserialize_elements::<_, StackSummary, _>(tag_name, stack, |name, stack, obj| {
8180            match name {
8181                "CreationTime" => {
8182                    obj.creation_time =
8183                        CreationTimeDeserializer::deserialize("CreationTime", stack)?;
8184                }
8185                "DeletionTime" => {
8186                    obj.deletion_time = Some(DeletionTimeDeserializer::deserialize(
8187                        "DeletionTime",
8188                        stack,
8189                    )?);
8190                }
8191                "DriftInformation" => {
8192                    obj.drift_information =
8193                        Some(StackDriftInformationSummaryDeserializer::deserialize(
8194                            "DriftInformation",
8195                            stack,
8196                        )?);
8197                }
8198                "LastUpdatedTime" => {
8199                    obj.last_updated_time = Some(LastUpdatedTimeDeserializer::deserialize(
8200                        "LastUpdatedTime",
8201                        stack,
8202                    )?);
8203                }
8204                "ParentId" => {
8205                    obj.parent_id = Some(StackIdDeserializer::deserialize("ParentId", stack)?);
8206                }
8207                "RootId" => {
8208                    obj.root_id = Some(StackIdDeserializer::deserialize("RootId", stack)?);
8209                }
8210                "StackId" => {
8211                    obj.stack_id = Some(StackIdDeserializer::deserialize("StackId", stack)?);
8212                }
8213                "StackName" => {
8214                    obj.stack_name = StackNameDeserializer::deserialize("StackName", stack)?;
8215                }
8216                "StackStatus" => {
8217                    obj.stack_status = StackStatusDeserializer::deserialize("StackStatus", stack)?;
8218                }
8219                "StackStatusReason" => {
8220                    obj.stack_status_reason = Some(StackStatusReasonDeserializer::deserialize(
8221                        "StackStatusReason",
8222                        stack,
8223                    )?);
8224                }
8225                "TemplateDescription" => {
8226                    obj.template_description = Some(TemplateDescriptionDeserializer::deserialize(
8227                        "TemplateDescription",
8228                        stack,
8229                    )?);
8230                }
8231                _ => skip_tree(stack),
8232            }
8233            Ok(())
8234        })
8235    }
8236}
8237#[allow(dead_code)]
8238struct StacksDeserializer;
8239impl StacksDeserializer {
8240    #[allow(dead_code, unused_variables)]
8241    fn deserialize<T: Peek + Next>(
8242        tag_name: &str,
8243        stack: &mut T,
8244    ) -> Result<Vec<Stack>, XmlParseError> {
8245        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
8246            if name == "member" {
8247                obj.push(StackDeserializer::deserialize("member", stack)?);
8248            } else {
8249                skip_tree(stack);
8250            }
8251            Ok(())
8252        })
8253    }
8254}
8255#[allow(dead_code)]
8256struct StageListDeserializer;
8257impl StageListDeserializer {
8258    #[allow(dead_code, unused_variables)]
8259    fn deserialize<T: Peek + Next>(
8260        tag_name: &str,
8261        stack: &mut T,
8262    ) -> Result<Vec<String>, XmlParseError> {
8263        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
8264            if name == "member" {
8265                obj.push(TemplateStageDeserializer::deserialize("member", stack)?);
8266            } else {
8267                skip_tree(stack);
8268            }
8269            Ok(())
8270        })
8271    }
8272}
8273#[derive(Clone, Debug, Default, PartialEq)]
8274#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
8275pub struct StopStackSetOperationInput {
8276    /// <p>The ID of the stack operation. </p>
8277    pub operation_id: String,
8278    /// <p>The name or unique ID of the stack set that you want to stop the operation for.</p>
8279    pub stack_set_name: String,
8280}
8281
8282/// Serialize `StopStackSetOperationInput` contents to a `SignedRequest`.
8283struct StopStackSetOperationInputSerializer;
8284impl StopStackSetOperationInputSerializer {
8285    fn serialize(params: &mut Params, name: &str, obj: &StopStackSetOperationInput) {
8286        let mut prefix = name.to_string();
8287        if prefix != "" {
8288            prefix.push_str(".");
8289        }
8290
8291        params.put(&format!("{}{}", prefix, "OperationId"), &obj.operation_id);
8292        params.put(
8293            &format!("{}{}", prefix, "StackSetName"),
8294            &obj.stack_set_name,
8295        );
8296    }
8297}
8298
8299#[derive(Clone, Debug, Default, PartialEq)]
8300#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
8301pub struct StopStackSetOperationOutput {}
8302
8303#[allow(dead_code)]
8304struct StopStackSetOperationOutputDeserializer;
8305impl StopStackSetOperationOutputDeserializer {
8306    #[allow(dead_code, unused_variables)]
8307    fn deserialize<T: Peek + Next>(
8308        tag_name: &str,
8309        stack: &mut T,
8310    ) -> Result<StopStackSetOperationOutput, XmlParseError> {
8311        xml_util::start_element(tag_name, stack)?;
8312
8313        let obj = StopStackSetOperationOutput::default();
8314
8315        xml_util::end_element(tag_name, stack)?;
8316
8317        Ok(obj)
8318    }
8319}
8320/// <p>The Tag type enables you to specify a key-value pair that can be used to store information about an AWS CloudFormation stack.</p>
8321#[derive(Clone, Debug, Default, PartialEq)]
8322#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
8323#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
8324pub struct Tag {
8325    /// <p> <i>Required</i>. A string used to identify this tag. You can specify a maximum of 128 characters for a tag key. Tags owned by Amazon Web Services (AWS) have the reserved prefix: <code>aws:</code>.</p>
8326    pub key: String,
8327    /// <p> <i>Required</i>. A string containing the value for this tag. You can specify a maximum of 256 characters for a tag value.</p>
8328    pub value: String,
8329}
8330
8331#[allow(dead_code)]
8332struct TagDeserializer;
8333impl TagDeserializer {
8334    #[allow(dead_code, unused_variables)]
8335    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<Tag, XmlParseError> {
8336        deserialize_elements::<_, Tag, _>(tag_name, stack, |name, stack, obj| {
8337            match name {
8338                "Key" => {
8339                    obj.key = TagKeyDeserializer::deserialize("Key", stack)?;
8340                }
8341                "Value" => {
8342                    obj.value = TagValueDeserializer::deserialize("Value", stack)?;
8343                }
8344                _ => skip_tree(stack),
8345            }
8346            Ok(())
8347        })
8348    }
8349}
8350
8351/// Serialize `Tag` contents to a `SignedRequest`.
8352struct TagSerializer;
8353impl TagSerializer {
8354    fn serialize(params: &mut Params, name: &str, obj: &Tag) {
8355        let mut prefix = name.to_string();
8356        if prefix != "" {
8357            prefix.push_str(".");
8358        }
8359
8360        params.put(&format!("{}{}", prefix, "Key"), &obj.key);
8361        params.put(&format!("{}{}", prefix, "Value"), &obj.value);
8362    }
8363}
8364
8365#[allow(dead_code)]
8366struct TagKeyDeserializer;
8367impl TagKeyDeserializer {
8368    #[allow(dead_code, unused_variables)]
8369    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
8370        xml_util::deserialize_primitive(tag_name, stack, Ok)
8371    }
8372}
8373#[allow(dead_code)]
8374struct TagValueDeserializer;
8375impl TagValueDeserializer {
8376    #[allow(dead_code, unused_variables)]
8377    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
8378        xml_util::deserialize_primitive(tag_name, stack, Ok)
8379    }
8380}
8381#[allow(dead_code)]
8382struct TagsDeserializer;
8383impl TagsDeserializer {
8384    #[allow(dead_code, unused_variables)]
8385    fn deserialize<T: Peek + Next>(
8386        tag_name: &str,
8387        stack: &mut T,
8388    ) -> Result<Vec<Tag>, XmlParseError> {
8389        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
8390            if name == "member" {
8391                obj.push(TagDeserializer::deserialize("member", stack)?);
8392            } else {
8393                skip_tree(stack);
8394            }
8395            Ok(())
8396        })
8397    }
8398}
8399
8400/// Serialize `Tags` contents to a `SignedRequest`.
8401struct TagsSerializer;
8402impl TagsSerializer {
8403    fn serialize(params: &mut Params, name: &str, obj: &Vec<Tag>) {
8404        for (index, obj) in obj.iter().enumerate() {
8405            let key = format!("{}.member.{}", name, index + 1);
8406            TagSerializer::serialize(params, &key, obj);
8407        }
8408    }
8409}
8410
8411#[allow(dead_code)]
8412struct TemplateBodyDeserializer;
8413impl TemplateBodyDeserializer {
8414    #[allow(dead_code, unused_variables)]
8415    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
8416        xml_util::deserialize_primitive(tag_name, stack, Ok)
8417    }
8418}
8419#[allow(dead_code)]
8420struct TemplateDescriptionDeserializer;
8421impl TemplateDescriptionDeserializer {
8422    #[allow(dead_code, unused_variables)]
8423    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
8424        xml_util::deserialize_primitive(tag_name, stack, Ok)
8425    }
8426}
8427/// <p>The TemplateParameter data type.</p>
8428#[derive(Clone, Debug, Default, PartialEq)]
8429#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
8430pub struct TemplateParameter {
8431    /// <p>The default value associated with the parameter.</p>
8432    pub default_value: Option<String>,
8433    /// <p>User defined description associated with the parameter.</p>
8434    pub description: Option<String>,
8435    /// <p>Flag indicating whether the parameter should be displayed as plain text in logs and UIs.</p>
8436    pub no_echo: Option<bool>,
8437    /// <p>The name associated with the parameter.</p>
8438    pub parameter_key: Option<String>,
8439}
8440
8441#[allow(dead_code)]
8442struct TemplateParameterDeserializer;
8443impl TemplateParameterDeserializer {
8444    #[allow(dead_code, unused_variables)]
8445    fn deserialize<T: Peek + Next>(
8446        tag_name: &str,
8447        stack: &mut T,
8448    ) -> Result<TemplateParameter, XmlParseError> {
8449        deserialize_elements::<_, TemplateParameter, _>(tag_name, stack, |name, stack, obj| {
8450            match name {
8451                "DefaultValue" => {
8452                    obj.default_value = Some(ParameterValueDeserializer::deserialize(
8453                        "DefaultValue",
8454                        stack,
8455                    )?);
8456                }
8457                "Description" => {
8458                    obj.description =
8459                        Some(DescriptionDeserializer::deserialize("Description", stack)?);
8460                }
8461                "NoEcho" => {
8462                    obj.no_echo = Some(NoEchoDeserializer::deserialize("NoEcho", stack)?);
8463                }
8464                "ParameterKey" => {
8465                    obj.parameter_key = Some(ParameterKeyDeserializer::deserialize(
8466                        "ParameterKey",
8467                        stack,
8468                    )?);
8469                }
8470                _ => skip_tree(stack),
8471            }
8472            Ok(())
8473        })
8474    }
8475}
8476#[allow(dead_code)]
8477struct TemplateParametersDeserializer;
8478impl TemplateParametersDeserializer {
8479    #[allow(dead_code, unused_variables)]
8480    fn deserialize<T: Peek + Next>(
8481        tag_name: &str,
8482        stack: &mut T,
8483    ) -> Result<Vec<TemplateParameter>, XmlParseError> {
8484        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
8485            if name == "member" {
8486                obj.push(TemplateParameterDeserializer::deserialize("member", stack)?);
8487            } else {
8488                skip_tree(stack);
8489            }
8490            Ok(())
8491        })
8492    }
8493}
8494#[allow(dead_code)]
8495struct TemplateStageDeserializer;
8496impl TemplateStageDeserializer {
8497    #[allow(dead_code, unused_variables)]
8498    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
8499        xml_util::deserialize_primitive(tag_name, stack, Ok)
8500    }
8501}
8502#[allow(dead_code)]
8503struct TimeoutMinutesDeserializer;
8504impl TimeoutMinutesDeserializer {
8505    #[allow(dead_code, unused_variables)]
8506    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<i64, XmlParseError> {
8507        xml_util::deserialize_primitive(tag_name, stack, |s| Ok(i64::from_str(&s).unwrap()))
8508    }
8509}
8510#[allow(dead_code)]
8511struct TimestampDeserializer;
8512impl TimestampDeserializer {
8513    #[allow(dead_code, unused_variables)]
8514    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
8515        xml_util::deserialize_primitive(tag_name, stack, Ok)
8516    }
8517}
8518#[allow(dead_code)]
8519struct TotalStackInstancesCountDeserializer;
8520impl TotalStackInstancesCountDeserializer {
8521    #[allow(dead_code, unused_variables)]
8522    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<i64, XmlParseError> {
8523        xml_util::deserialize_primitive(tag_name, stack, |s| Ok(i64::from_str(&s).unwrap()))
8524    }
8525}
8526#[allow(dead_code)]
8527struct TransformNameDeserializer;
8528impl TransformNameDeserializer {
8529    #[allow(dead_code, unused_variables)]
8530    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
8531        xml_util::deserialize_primitive(tag_name, stack, Ok)
8532    }
8533}
8534#[allow(dead_code)]
8535struct TransformsListDeserializer;
8536impl TransformsListDeserializer {
8537    #[allow(dead_code, unused_variables)]
8538    fn deserialize<T: Peek + Next>(
8539        tag_name: &str,
8540        stack: &mut T,
8541    ) -> Result<Vec<String>, XmlParseError> {
8542        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
8543            if name == "member" {
8544                obj.push(TransformNameDeserializer::deserialize("member", stack)?);
8545            } else {
8546                skip_tree(stack);
8547            }
8548            Ok(())
8549        })
8550    }
8551}
8552#[allow(dead_code)]
8553struct TypeDeserializer;
8554impl TypeDeserializer {
8555    #[allow(dead_code, unused_variables)]
8556    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
8557        xml_util::deserialize_primitive(tag_name, stack, Ok)
8558    }
8559}
8560#[allow(dead_code)]
8561struct TypeArnDeserializer;
8562impl TypeArnDeserializer {
8563    #[allow(dead_code, unused_variables)]
8564    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
8565        xml_util::deserialize_primitive(tag_name, stack, Ok)
8566    }
8567}
8568#[allow(dead_code)]
8569struct TypeNameDeserializer;
8570impl TypeNameDeserializer {
8571    #[allow(dead_code, unused_variables)]
8572    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
8573        xml_util::deserialize_primitive(tag_name, stack, Ok)
8574    }
8575}
8576#[allow(dead_code)]
8577struct TypeSchemaDeserializer;
8578impl TypeSchemaDeserializer {
8579    #[allow(dead_code, unused_variables)]
8580    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
8581        xml_util::deserialize_primitive(tag_name, stack, Ok)
8582    }
8583}
8584#[allow(dead_code)]
8585struct TypeSummariesDeserializer;
8586impl TypeSummariesDeserializer {
8587    #[allow(dead_code, unused_variables)]
8588    fn deserialize<T: Peek + Next>(
8589        tag_name: &str,
8590        stack: &mut T,
8591    ) -> Result<Vec<TypeSummary>, XmlParseError> {
8592        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
8593            if name == "member" {
8594                obj.push(TypeSummaryDeserializer::deserialize("member", stack)?);
8595            } else {
8596                skip_tree(stack);
8597            }
8598            Ok(())
8599        })
8600    }
8601}
8602/// <p>Contains summary information about the specified CloudFormation type.</p>
8603#[derive(Clone, Debug, Default, PartialEq)]
8604#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
8605pub struct TypeSummary {
8606    /// <p>The ID of the default version of the type. The default version is used when the type version is not specified.</p> <p>To set the default version of a type, use <code> <a>SetTypeDefaultVersion</a> </code>. </p>
8607    pub default_version_id: Option<String>,
8608    /// <p>The description of the type.</p>
8609    pub description: Option<String>,
8610    /// <p>When the current default version of the type was registered.</p>
8611    pub last_updated: Option<String>,
8612    /// <p>The kind of type.</p>
8613    pub type_: Option<String>,
8614    /// <p>The Amazon Resource Name (ARN) of the type.</p>
8615    pub type_arn: Option<String>,
8616    /// <p>The name of the type.</p>
8617    pub type_name: Option<String>,
8618}
8619
8620#[allow(dead_code)]
8621struct TypeSummaryDeserializer;
8622impl TypeSummaryDeserializer {
8623    #[allow(dead_code, unused_variables)]
8624    fn deserialize<T: Peek + Next>(
8625        tag_name: &str,
8626        stack: &mut T,
8627    ) -> Result<TypeSummary, XmlParseError> {
8628        deserialize_elements::<_, TypeSummary, _>(tag_name, stack, |name, stack, obj| {
8629            match name {
8630                "DefaultVersionId" => {
8631                    obj.default_version_id = Some(TypeVersionIdDeserializer::deserialize(
8632                        "DefaultVersionId",
8633                        stack,
8634                    )?);
8635                }
8636                "Description" => {
8637                    obj.description =
8638                        Some(DescriptionDeserializer::deserialize("Description", stack)?);
8639                }
8640                "LastUpdated" => {
8641                    obj.last_updated =
8642                        Some(TimestampDeserializer::deserialize("LastUpdated", stack)?);
8643                }
8644                "Type" => {
8645                    obj.type_ = Some(RegistryTypeDeserializer::deserialize("Type", stack)?);
8646                }
8647                "TypeArn" => {
8648                    obj.type_arn = Some(TypeArnDeserializer::deserialize("TypeArn", stack)?);
8649                }
8650                "TypeName" => {
8651                    obj.type_name = Some(TypeNameDeserializer::deserialize("TypeName", stack)?);
8652                }
8653                _ => skip_tree(stack),
8654            }
8655            Ok(())
8656        })
8657    }
8658}
8659#[allow(dead_code)]
8660struct TypeVersionIdDeserializer;
8661impl TypeVersionIdDeserializer {
8662    #[allow(dead_code, unused_variables)]
8663    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
8664        xml_util::deserialize_primitive(tag_name, stack, Ok)
8665    }
8666}
8667#[allow(dead_code)]
8668struct TypeVersionSummariesDeserializer;
8669impl TypeVersionSummariesDeserializer {
8670    #[allow(dead_code, unused_variables)]
8671    fn deserialize<T: Peek + Next>(
8672        tag_name: &str,
8673        stack: &mut T,
8674    ) -> Result<Vec<TypeVersionSummary>, XmlParseError> {
8675        deserialize_elements::<_, Vec<_>, _>(tag_name, stack, |name, stack, obj| {
8676            if name == "member" {
8677                obj.push(TypeVersionSummaryDeserializer::deserialize(
8678                    "member", stack,
8679                )?);
8680            } else {
8681                skip_tree(stack);
8682            }
8683            Ok(())
8684        })
8685    }
8686}
8687/// <p>Contains summary information about a specific version of a CloudFormation type.</p>
8688#[derive(Clone, Debug, Default, PartialEq)]
8689#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
8690pub struct TypeVersionSummary {
8691    /// <p>The Amazon Resource Name (ARN) of the type version.</p>
8692    pub arn: Option<String>,
8693    /// <p>The description of the type version.</p>
8694    pub description: Option<String>,
8695    /// <p>Whether the specified type version is set as the default version.</p>
8696    pub is_default_version: Option<bool>,
8697    /// <p>When the version was registered.</p>
8698    pub time_created: Option<String>,
8699    /// <p>The kind of type.</p>
8700    pub type_: Option<String>,
8701    /// <p>The name of the type.</p>
8702    pub type_name: Option<String>,
8703    /// <p>The ID of a specific version of the type. The version ID is the value at the end of the Amazon Resource Name (ARN) assigned to the type version when it is registered.</p>
8704    pub version_id: Option<String>,
8705}
8706
8707#[allow(dead_code)]
8708struct TypeVersionSummaryDeserializer;
8709impl TypeVersionSummaryDeserializer {
8710    #[allow(dead_code, unused_variables)]
8711    fn deserialize<T: Peek + Next>(
8712        tag_name: &str,
8713        stack: &mut T,
8714    ) -> Result<TypeVersionSummary, XmlParseError> {
8715        deserialize_elements::<_, TypeVersionSummary, _>(tag_name, stack, |name, stack, obj| {
8716            match name {
8717                "Arn" => {
8718                    obj.arn = Some(TypeArnDeserializer::deserialize("Arn", stack)?);
8719                }
8720                "Description" => {
8721                    obj.description =
8722                        Some(DescriptionDeserializer::deserialize("Description", stack)?);
8723                }
8724                "IsDefaultVersion" => {
8725                    obj.is_default_version = Some(IsDefaultVersionDeserializer::deserialize(
8726                        "IsDefaultVersion",
8727                        stack,
8728                    )?);
8729                }
8730                "TimeCreated" => {
8731                    obj.time_created =
8732                        Some(TimestampDeserializer::deserialize("TimeCreated", stack)?);
8733                }
8734                "Type" => {
8735                    obj.type_ = Some(RegistryTypeDeserializer::deserialize("Type", stack)?);
8736                }
8737                "TypeName" => {
8738                    obj.type_name = Some(TypeNameDeserializer::deserialize("TypeName", stack)?);
8739                }
8740                "VersionId" => {
8741                    obj.version_id =
8742                        Some(TypeVersionIdDeserializer::deserialize("VersionId", stack)?);
8743                }
8744                _ => skip_tree(stack),
8745            }
8746            Ok(())
8747        })
8748    }
8749}
8750/// <p>The input for an <a>UpdateStack</a> action.</p>
8751#[derive(Clone, Debug, Default, PartialEq)]
8752#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
8753pub struct UpdateStackInput {
8754    /// <p><p>In some cases, you must explicitly acknowledge that your stack template contains certain capabilities in order for AWS CloudFormation to update the stack.</p> <ul> <li> <p> <code>CAPABILITY<em>IAM</code> and <code>CAPABILITY</em>NAMED<em>IAM</code> </p> <p>Some stack templates might include resources that can affect permissions in your AWS account; for example, by creating new AWS Identity and Access Management (IAM) users. For those stacks, you must explicitly acknowledge this by specifying one of these capabilities.</p> <p>The following IAM resources require you to specify either the <code>CAPABILITY</em>IAM</code> or <code>CAPABILITY<em>NAMED</em>IAM</code> capability.</p> <ul> <li> <p>If you have IAM resources, you can specify either capability. </p> </li> <li> <p>If you have IAM resources with custom names, you <i>must</i> specify <code>CAPABILITY<em>NAMED</em>IAM</code>. </p> </li> <li> <p>If you don&#39;t specify either of these capabilities, AWS CloudFormation returns an <code>InsufficientCapabilities</code> error.</p> </li> </ul> <p>If your stack template contains these resources, we recommend that you review all permissions associated with them and edit their permissions if necessary.</p> <ul> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-accesskey.html"> AWS::IAM::AccessKey</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-group.html"> AWS::IAM::Group</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-instanceprofile.html"> AWS::IAM::InstanceProfile</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html"> AWS::IAM::Policy</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html"> AWS::IAM::Role</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user.html"> AWS::IAM::User</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-addusertogroup.html"> AWS::IAM::UserToGroupAddition</a> </p> </li> </ul> <p>For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html#capabilities">Acknowledging IAM Resources in AWS CloudFormation Templates</a>.</p> </li> <li> <p> <code>CAPABILITY<em>AUTO</em>EXPAND</code> </p> <p>Some template contain macros. Macros perform custom processing on templates; this can include simple actions like find-and-replace operations, all the way to extensive transformations of entire templates. Because of this, users typically create a change set from the processed template, so that they can review the changes resulting from the macros before actually updating the stack. If your stack template contains one or more macros, and you choose to update a stack directly from the processed template, without first reviewing the resulting changes in a change set, you must acknowledge this capability. This includes the <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/create-reusable-transform-function-snippets-and-add-to-your-template-with-aws-include-transform.html">AWS::Include</a> and <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/transform-aws-serverless.html">AWS::Serverless</a> transforms, which are macros hosted by AWS CloudFormation.</p> <p>Change sets do not currently support nested stacks. If you want to update a stack from a stack template that contains macros <i>and</i> nested stacks, you must update the stack directly from the template using this capability.</p> <important> <p>You should only update stacks directly from a stack template that contains macros if you know what processing the macro performs.</p> <p>Each macro relies on an underlying Lambda service function for processing stack templates. Be aware that the Lambda function owner can update the function operation without AWS CloudFormation being notified.</p> </important> <p>For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-macros.html">Using AWS CloudFormation Macros to Perform Custom Processing on Templates</a>.</p> </li> </ul></p>
8755    pub capabilities: Option<Vec<String>>,
8756    /// <p>A unique identifier for this <code>UpdateStack</code> request. Specify this token if you plan to retry requests so that AWS CloudFormation knows that you're not attempting to update a stack with the same name. You might retry <code>UpdateStack</code> requests to ensure that AWS CloudFormation successfully received them.</p> <p>All events triggered by a given stack operation are assigned the same client request token, which you can use to track operations. For example, if you execute a <code>CreateStack</code> operation with the token <code>token1</code>, then all the <code>StackEvents</code> generated by that operation will have <code>ClientRequestToken</code> set as <code>token1</code>.</p> <p>In the console, stack operations display the client request token on the Events tab. Stack operations that are initiated from the console use the token format <i>Console-StackOperation-ID</i>, which helps you easily identify the stack operation . For example, if you create a stack using the console, each stack event would be assigned the same token in the following format: <code>Console-CreateStack-7f59c3cf-00d2-40c7-b2ff-e75db0987002</code>. </p>
8757    pub client_request_token: Option<String>,
8758    /// <p>Amazon Simple Notification Service topic Amazon Resource Names (ARNs) that AWS CloudFormation associates with the stack. Specify an empty list to remove all notification topics.</p>
8759    pub notification_ar_ns: Option<Vec<String>>,
8760    /// <p>A list of <code>Parameter</code> structures that specify input parameters for the stack. For more information, see the <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_Parameter.html">Parameter</a> data type.</p>
8761    pub parameters: Option<Vec<Parameter>>,
8762    /// <p>The template resource types that you have permissions to work with for this update stack action, such as <code>AWS::EC2::Instance</code>, <code>AWS::EC2::*</code>, or <code>Custom::MyCustomInstance</code>.</p> <p>If the list of resource types doesn't include a resource that you're updating, the stack update fails. By default, AWS CloudFormation grants permissions to all resource types. AWS Identity and Access Management (IAM) uses this parameter for AWS CloudFormation-specific condition keys in IAM policies. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html">Controlling Access with AWS Identity and Access Management</a>.</p>
8763    pub resource_types: Option<Vec<String>>,
8764    /// <p>The Amazon Resource Name (ARN) of an AWS Identity and Access Management (IAM) role that AWS CloudFormation assumes to update the stack. AWS CloudFormation uses the role's credentials to make calls on your behalf. AWS CloudFormation always uses this role for all future operations on the stack. As long as users have permission to operate on the stack, AWS CloudFormation uses this role even if the users don't have permission to pass it. Ensure that the role grants least privilege.</p> <p>If you don't specify a value, AWS CloudFormation uses the role that was previously associated with the stack. If no role is available, AWS CloudFormation uses a temporary session that is generated from your user credentials.</p>
8765    pub role_arn: Option<String>,
8766    /// <p>The rollback triggers for AWS CloudFormation to monitor during stack creation and updating operations, and for the specified monitoring period afterwards.</p>
8767    pub rollback_configuration: Option<RollbackConfiguration>,
8768    /// <p>The name or unique stack ID of the stack to update.</p>
8769    pub stack_name: String,
8770    /// <p>Structure containing a new stack policy body. You can specify either the <code>StackPolicyBody</code> or the <code>StackPolicyURL</code> parameter, but not both.</p> <p>You might update the stack policy, for example, in order to protect a new resource that you created during a stack update. If you do not specify a stack policy, the current policy that is associated with the stack is unchanged.</p>
8771    pub stack_policy_body: Option<String>,
8772    /// <p>Structure containing the temporary overriding stack policy body. You can specify either the <code>StackPolicyDuringUpdateBody</code> or the <code>StackPolicyDuringUpdateURL</code> parameter, but not both.</p> <p>If you want to update protected resources, specify a temporary overriding stack policy during this update. If you do not specify a stack policy, the current policy that is associated with the stack will be used.</p>
8773    pub stack_policy_during_update_body: Option<String>,
8774    /// <p>Location of a file containing the temporary overriding stack policy. The URL must point to a policy (max size: 16KB) located in an S3 bucket in the same Region as the stack. You can specify either the <code>StackPolicyDuringUpdateBody</code> or the <code>StackPolicyDuringUpdateURL</code> parameter, but not both.</p> <p>If you want to update protected resources, specify a temporary overriding stack policy during this update. If you do not specify a stack policy, the current policy that is associated with the stack will be used.</p>
8775    pub stack_policy_during_update_url: Option<String>,
8776    /// <p>Location of a file containing the updated stack policy. The URL must point to a policy (max size: 16KB) located in an S3 bucket in the same Region as the stack. You can specify either the <code>StackPolicyBody</code> or the <code>StackPolicyURL</code> parameter, but not both.</p> <p>You might update the stack policy, for example, in order to protect a new resource that you created during a stack update. If you do not specify a stack policy, the current policy that is associated with the stack is unchanged.</p>
8777    pub stack_policy_url: Option<String>,
8778    /// <p>Key-value pairs to associate with this stack. AWS CloudFormation also propagates these tags to supported resources in the stack. You can specify a maximum number of 50 tags.</p> <p>If you don't specify this parameter, AWS CloudFormation doesn't modify the stack's tags. If you specify an empty value, AWS CloudFormation removes all associated tags.</p>
8779    pub tags: Option<Vec<Tag>>,
8780    /// <p>Structure containing the template body with a minimum length of 1 byte and a maximum length of 51,200 bytes. (For more information, go to <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html">Template Anatomy</a> in the AWS CloudFormation User Guide.)</p> <p>Conditional: You must specify only one of the following parameters: <code>TemplateBody</code>, <code>TemplateURL</code>, or set the <code>UsePreviousTemplate</code> to <code>true</code>.</p>
8781    pub template_body: Option<String>,
8782    /// <p>Location of file containing the template body. The URL must point to a template that is located in an Amazon S3 bucket. For more information, go to <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html">Template Anatomy</a> in the AWS CloudFormation User Guide.</p> <p>Conditional: You must specify only one of the following parameters: <code>TemplateBody</code>, <code>TemplateURL</code>, or set the <code>UsePreviousTemplate</code> to <code>true</code>.</p>
8783    pub template_url: Option<String>,
8784    /// <p>Reuse the existing template that is associated with the stack that you are updating.</p> <p>Conditional: You must specify only one of the following parameters: <code>TemplateBody</code>, <code>TemplateURL</code>, or set the <code>UsePreviousTemplate</code> to <code>true</code>.</p>
8785    pub use_previous_template: Option<bool>,
8786}
8787
8788/// Serialize `UpdateStackInput` contents to a `SignedRequest`.
8789struct UpdateStackInputSerializer;
8790impl UpdateStackInputSerializer {
8791    fn serialize(params: &mut Params, name: &str, obj: &UpdateStackInput) {
8792        let mut prefix = name.to_string();
8793        if prefix != "" {
8794            prefix.push_str(".");
8795        }
8796
8797        if let Some(ref field_value) = obj.capabilities {
8798            CapabilitiesSerializer::serialize(
8799                params,
8800                &format!("{}{}", prefix, "Capabilities"),
8801                field_value,
8802            );
8803        }
8804        if let Some(ref field_value) = obj.client_request_token {
8805            params.put(&format!("{}{}", prefix, "ClientRequestToken"), &field_value);
8806        }
8807        if let Some(ref field_value) = obj.notification_ar_ns {
8808            NotificationARNsSerializer::serialize(
8809                params,
8810                &format!("{}{}", prefix, "NotificationARNs"),
8811                field_value,
8812            );
8813        }
8814        if let Some(ref field_value) = obj.parameters {
8815            ParametersSerializer::serialize(
8816                params,
8817                &format!("{}{}", prefix, "Parameters"),
8818                field_value,
8819            );
8820        }
8821        if let Some(ref field_value) = obj.resource_types {
8822            ResourceTypesSerializer::serialize(
8823                params,
8824                &format!("{}{}", prefix, "ResourceTypes"),
8825                field_value,
8826            );
8827        }
8828        if let Some(ref field_value) = obj.role_arn {
8829            params.put(&format!("{}{}", prefix, "RoleARN"), &field_value);
8830        }
8831        if let Some(ref field_value) = obj.rollback_configuration {
8832            RollbackConfigurationSerializer::serialize(
8833                params,
8834                &format!("{}{}", prefix, "RollbackConfiguration"),
8835                field_value,
8836            );
8837        }
8838        params.put(&format!("{}{}", prefix, "StackName"), &obj.stack_name);
8839        if let Some(ref field_value) = obj.stack_policy_body {
8840            params.put(&format!("{}{}", prefix, "StackPolicyBody"), &field_value);
8841        }
8842        if let Some(ref field_value) = obj.stack_policy_during_update_body {
8843            params.put(
8844                &format!("{}{}", prefix, "StackPolicyDuringUpdateBody"),
8845                &field_value,
8846            );
8847        }
8848        if let Some(ref field_value) = obj.stack_policy_during_update_url {
8849            params.put(
8850                &format!("{}{}", prefix, "StackPolicyDuringUpdateURL"),
8851                &field_value,
8852            );
8853        }
8854        if let Some(ref field_value) = obj.stack_policy_url {
8855            params.put(&format!("{}{}", prefix, "StackPolicyURL"), &field_value);
8856        }
8857        if let Some(ref field_value) = obj.tags {
8858            TagsSerializer::serialize(params, &format!("{}{}", prefix, "Tags"), field_value);
8859        }
8860        if let Some(ref field_value) = obj.template_body {
8861            params.put(&format!("{}{}", prefix, "TemplateBody"), &field_value);
8862        }
8863        if let Some(ref field_value) = obj.template_url {
8864            params.put(&format!("{}{}", prefix, "TemplateURL"), &field_value);
8865        }
8866        if let Some(ref field_value) = obj.use_previous_template {
8867            params.put(
8868                &format!("{}{}", prefix, "UsePreviousTemplate"),
8869                &field_value,
8870            );
8871        }
8872    }
8873}
8874
8875#[derive(Clone, Debug, Default, PartialEq)]
8876#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
8877pub struct UpdateStackInstancesInput {
8878    /// <p>[<code>Self-managed</code> permissions] The names of one or more AWS accounts for which you want to update parameter values for stack instances. The overridden parameter values will be applied to all stack instances in the specified accounts and Regions.</p> <p>You can specify <code>Accounts</code> or <code>DeploymentTargets</code>, but not both.</p>
8879    pub accounts: Option<Vec<String>>,
8880    /// <p>[<code>Service-managed</code> permissions] The AWS Organizations accounts for which you want to update parameter values for stack instances. If your update targets OUs, the overridden parameter values only apply to the accounts that are currently in the target OUs and their child OUs. Accounts added to the target OUs and their child OUs in the future won't use the overridden values.</p> <p>You can specify <code>Accounts</code> or <code>DeploymentTargets</code>, but not both.</p>
8881    pub deployment_targets: Option<DeploymentTargets>,
8882    /// <p>The unique identifier for this stack set operation. </p> <p>The operation ID also functions as an idempotency token, to ensure that AWS CloudFormation performs the stack set operation only once, even if you retry the request multiple times. You might retry stack set operation requests to ensure that AWS CloudFormation successfully received them.</p> <p>If you don't specify an operation ID, the SDK generates one automatically. </p>
8883    pub operation_id: Option<String>,
8884    /// <p>Preferences for how AWS CloudFormation performs this stack set operation.</p>
8885    pub operation_preferences: Option<StackSetOperationPreferences>,
8886    /// <p> A list of input parameters whose values you want to update for the specified stack instances. </p> <p>Any overridden parameter values will be applied to all stack instances in the specified accounts and Regions. When specifying parameters and their values, be aware of how AWS CloudFormation sets parameter values during stack instance update operations:</p> <ul> <li> <p>To override the current value for a parameter, include the parameter and specify its value.</p> </li> <li> <p>To leave a parameter set to its present value, you can do one of the following:</p> <ul> <li> <p>Do not include the parameter in the list.</p> </li> <li> <p>Include the parameter and specify <code>UsePreviousValue</code> as <code>true</code>. (You cannot specify both a value and set <code>UsePreviousValue</code> to <code>true</code>.)</p> </li> </ul> </li> <li> <p>To set all overridden parameter back to the values specified in the stack set, specify a parameter list but do not include any parameters.</p> </li> <li> <p>To leave all parameters set to their present values, do not specify this property at all.</p> </li> </ul> <p>During stack set updates, any parameter values overridden for a stack instance are not updated, but retain their overridden value.</p> <p>You can only override the parameter <i>values</i> that are specified in the stack set; to add or delete a parameter itself, use <code>UpdateStackSet</code> to update the stack set template. If you add a parameter to a template, before you can override the parameter value specified in the stack set you must first use <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStackSet.html">UpdateStackSet</a> to update all stack instances with the updated template and parameter value specified in the stack set. Once a stack instance has been updated with the new parameter, you can then override the parameter value using <code>UpdateStackInstances</code>.</p>
8887    pub parameter_overrides: Option<Vec<Parameter>>,
8888    /// <p>The names of one or more Regions in which you want to update parameter values for stack instances. The overridden parameter values will be applied to all stack instances in the specified accounts and Regions.</p>
8889    pub regions: Vec<String>,
8890    /// <p>The name or unique ID of the stack set associated with the stack instances.</p>
8891    pub stack_set_name: String,
8892}
8893
8894/// Serialize `UpdateStackInstancesInput` contents to a `SignedRequest`.
8895struct UpdateStackInstancesInputSerializer;
8896impl UpdateStackInstancesInputSerializer {
8897    fn serialize(params: &mut Params, name: &str, obj: &UpdateStackInstancesInput) {
8898        let mut prefix = name.to_string();
8899        if prefix != "" {
8900            prefix.push_str(".");
8901        }
8902
8903        if let Some(ref field_value) = obj.accounts {
8904            AccountListSerializer::serialize(
8905                params,
8906                &format!("{}{}", prefix, "Accounts"),
8907                field_value,
8908            );
8909        }
8910        if let Some(ref field_value) = obj.deployment_targets {
8911            DeploymentTargetsSerializer::serialize(
8912                params,
8913                &format!("{}{}", prefix, "DeploymentTargets"),
8914                field_value,
8915            );
8916        }
8917        if let Some(ref field_value) = obj.operation_id {
8918            params.put(&format!("{}{}", prefix, "OperationId"), &field_value);
8919        }
8920        if let Some(ref field_value) = obj.operation_preferences {
8921            StackSetOperationPreferencesSerializer::serialize(
8922                params,
8923                &format!("{}{}", prefix, "OperationPreferences"),
8924                field_value,
8925            );
8926        }
8927        if let Some(ref field_value) = obj.parameter_overrides {
8928            ParametersSerializer::serialize(
8929                params,
8930                &format!("{}{}", prefix, "ParameterOverrides"),
8931                field_value,
8932            );
8933        }
8934        RegionListSerializer::serialize(params, &format!("{}{}", prefix, "Regions"), &obj.regions);
8935        params.put(
8936            &format!("{}{}", prefix, "StackSetName"),
8937            &obj.stack_set_name,
8938        );
8939    }
8940}
8941
8942#[derive(Clone, Debug, Default, PartialEq)]
8943#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
8944pub struct UpdateStackInstancesOutput {
8945    /// <p>The unique identifier for this stack set operation. </p>
8946    pub operation_id: Option<String>,
8947}
8948
8949#[allow(dead_code)]
8950struct UpdateStackInstancesOutputDeserializer;
8951impl UpdateStackInstancesOutputDeserializer {
8952    #[allow(dead_code, unused_variables)]
8953    fn deserialize<T: Peek + Next>(
8954        tag_name: &str,
8955        stack: &mut T,
8956    ) -> Result<UpdateStackInstancesOutput, XmlParseError> {
8957        deserialize_elements::<_, UpdateStackInstancesOutput, _>(
8958            tag_name,
8959            stack,
8960            |name, stack, obj| {
8961                match name {
8962                    "OperationId" => {
8963                        obj.operation_id = Some(ClientRequestTokenDeserializer::deserialize(
8964                            "OperationId",
8965                            stack,
8966                        )?);
8967                    }
8968                    _ => skip_tree(stack),
8969                }
8970                Ok(())
8971            },
8972        )
8973    }
8974}
8975/// <p>The output for an <a>UpdateStack</a> action.</p>
8976#[derive(Clone, Debug, Default, PartialEq)]
8977#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
8978pub struct UpdateStackOutput {
8979    /// <p>Unique identifier of the stack.</p>
8980    pub stack_id: Option<String>,
8981}
8982
8983#[allow(dead_code)]
8984struct UpdateStackOutputDeserializer;
8985impl UpdateStackOutputDeserializer {
8986    #[allow(dead_code, unused_variables)]
8987    fn deserialize<T: Peek + Next>(
8988        tag_name: &str,
8989        stack: &mut T,
8990    ) -> Result<UpdateStackOutput, XmlParseError> {
8991        deserialize_elements::<_, UpdateStackOutput, _>(tag_name, stack, |name, stack, obj| {
8992            match name {
8993                "StackId" => {
8994                    obj.stack_id = Some(StackIdDeserializer::deserialize("StackId", stack)?);
8995                }
8996                _ => skip_tree(stack),
8997            }
8998            Ok(())
8999        })
9000    }
9001}
9002#[derive(Clone, Debug, Default, PartialEq)]
9003#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
9004pub struct UpdateStackSetInput {
9005    /// <p>[<code>Self-managed</code> permissions] The accounts in which to update associated stack instances. If you specify accounts, you must also specify the Regions in which to update stack set instances.</p> <p>To update <i>all</i> the stack instances associated with this stack set, do not specify the <code>Accounts</code> or <code>Regions</code> properties.</p> <p>If the stack set update includes changes to the template (that is, if the <code>TemplateBody</code> or <code>TemplateURL</code> properties are specified), or the <code>Parameters</code> property, AWS CloudFormation marks all stack instances with a status of <code>OUTDATED</code> prior to updating the stack instances in the specified accounts and Regions. If the stack set update does not include changes to the template or parameters, AWS CloudFormation updates the stack instances in the specified accounts and Regions, while leaving all other stack instances with their existing stack instance status. </p>
9006    pub accounts: Option<Vec<String>>,
9007    /// <p>The Amazon Resource Number (ARN) of the IAM role to use to update this stack set.</p> <p>Specify an IAM role only if you are using customized administrator roles to control which users or groups can manage specific stack sets within the same administrator account. For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-prereqs.html">Granting Permissions for Stack Set Operations</a> in the <i>AWS CloudFormation User Guide</i>.</p> <p>If you specified a customized administrator role when you created the stack set, you must specify a customized administrator role, even if it is the same customized administrator role used with this stack set previously.</p>
9008    pub administration_role_arn: Option<String>,
9009    /// <p>[<code>Service-managed</code> permissions] Describes whether StackSets automatically deploys to AWS Organizations accounts that are added to a target organization or organizational unit (OU).</p> <p>If you specify <code>AutoDeployment</code>, do not specify <code>DeploymentTargets</code> or <code>Regions</code>.</p>
9010    pub auto_deployment: Option<AutoDeployment>,
9011    /// <p><p>In some cases, you must explicitly acknowledge that your stack template contains certain capabilities in order for AWS CloudFormation to update the stack set and its associated stack instances.</p> <ul> <li> <p> <code>CAPABILITY<em>IAM</code> and <code>CAPABILITY</em>NAMED<em>IAM</code> </p> <p>Some stack templates might include resources that can affect permissions in your AWS account; for example, by creating new AWS Identity and Access Management (IAM) users. For those stacks sets, you must explicitly acknowledge this by specifying one of these capabilities.</p> <p>The following IAM resources require you to specify either the <code>CAPABILITY</em>IAM</code> or <code>CAPABILITY<em>NAMED</em>IAM</code> capability.</p> <ul> <li> <p>If you have IAM resources, you can specify either capability. </p> </li> <li> <p>If you have IAM resources with custom names, you <i>must</i> specify <code>CAPABILITY<em>NAMED</em>IAM</code>. </p> </li> <li> <p>If you don&#39;t specify either of these capabilities, AWS CloudFormation returns an <code>InsufficientCapabilities</code> error.</p> </li> </ul> <p>If your stack template contains these resources, we recommend that you review all permissions associated with them and edit their permissions if necessary.</p> <ul> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-accesskey.html"> AWS::IAM::AccessKey</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-group.html"> AWS::IAM::Group</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-instanceprofile.html"> AWS::IAM::InstanceProfile</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html"> AWS::IAM::Policy</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html"> AWS::IAM::Role</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user.html"> AWS::IAM::User</a> </p> </li> <li> <p> <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-addusertogroup.html"> AWS::IAM::UserToGroupAddition</a> </p> </li> </ul> <p>For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html#capabilities">Acknowledging IAM Resources in AWS CloudFormation Templates</a>.</p> </li> <li> <p> <code>CAPABILITY<em>AUTO</em>EXPAND</code> </p> <p>Some templates contain macros. If your stack template contains one or more macros, and you choose to update a stack directly from the processed template, without first reviewing the resulting changes in a change set, you must acknowledge this capability. For more information, see <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-macros.html">Using AWS CloudFormation Macros to Perform Custom Processing on Templates</a>.</p> <important> <p>Stack sets do not currently support macros in stack templates. (This includes the <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/create-reusable-transform-function-snippets-and-add-to-your-template-with-aws-include-transform.html">AWS::Include</a> and <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/transform-aws-serverless.html">AWS::Serverless</a> transforms, which are macros hosted by AWS CloudFormation.) Even if you specify this capability, if you include a macro in your template the stack set operation will fail.</p> </important> </li> </ul></p>
9012    pub capabilities: Option<Vec<String>>,
9013    /// <p>[<code>Service-managed</code> permissions] The AWS Organizations accounts in which to update associated stack instances.</p> <p>To update all the stack instances associated with this stack set, do not specify <code>DeploymentTargets</code> or <code>Regions</code>.</p> <p>If the stack set update includes changes to the template (that is, if <code>TemplateBody</code> or <code>TemplateURL</code> is specified), or the <code>Parameters</code>, AWS CloudFormation marks all stack instances with a status of <code>OUTDATED</code> prior to updating the stack instances in the specified accounts and Regions. If the stack set update does not include changes to the template or parameters, AWS CloudFormation updates the stack instances in the specified accounts and Regions, while leaving all other stack instances with their existing stack instance status.</p>
9014    pub deployment_targets: Option<DeploymentTargets>,
9015    /// <p>A brief description of updates that you are making.</p>
9016    pub description: Option<String>,
9017    /// <p>The name of the IAM execution role to use to update the stack set. If you do not specify an execution role, AWS CloudFormation uses the <code>AWSCloudFormationStackSetExecutionRole</code> role for the stack set operation.</p> <p>Specify an IAM role only if you are using customized execution roles to control which stack resources users and groups can include in their stack sets. </p> <p> If you specify a customized execution role, AWS CloudFormation uses that role to update the stack. If you do not specify a customized execution role, AWS CloudFormation performs the update using the role previously associated with the stack set, so long as you have permissions to perform operations on the stack set.</p>
9018    pub execution_role_name: Option<String>,
9019    /// <p>The unique ID for this stack set operation. </p> <p>The operation ID also functions as an idempotency token, to ensure that AWS CloudFormation performs the stack set operation only once, even if you retry the request multiple times. You might retry stack set operation requests to ensure that AWS CloudFormation successfully received them.</p> <p>If you don't specify an operation ID, AWS CloudFormation generates one automatically.</p> <p>Repeating this stack set operation with a new operation ID retries all stack instances whose status is <code>OUTDATED</code>. </p>
9020    pub operation_id: Option<String>,
9021    /// <p>Preferences for how AWS CloudFormation performs this stack set operation.</p>
9022    pub operation_preferences: Option<StackSetOperationPreferences>,
9023    /// <p>A list of input parameters for the stack set template. </p>
9024    pub parameters: Option<Vec<Parameter>>,
9025    /// <p><p>Describes how the IAM roles required for stack set operations are created. You cannot modify <code>PermissionModel</code> if there are stack instances associated with your stack set.</p> <ul> <li> <p>With <code>self-managed</code> permissions, you must create the administrator and execution roles required to deploy to target accounts. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-prereqs-self-managed.html">Grant Self-Managed Stack Set Permissions</a>.</p> </li> <li> <p>With <code>service-managed</code> permissions, StackSets automatically creates the IAM roles required to deploy to accounts managed by AWS Organizations. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-prereqs-service-managed.html">Grant Service-Managed Stack Set Permissions</a>.</p> </li> </ul></p>
9026    pub permission_model: Option<String>,
9027    /// <p>The Regions in which to update associated stack instances. If you specify Regions, you must also specify accounts in which to update stack set instances.</p> <p>To update <i>all</i> the stack instances associated with this stack set, do not specify the <code>Accounts</code> or <code>Regions</code> properties.</p> <p>If the stack set update includes changes to the template (that is, if the <code>TemplateBody</code> or <code>TemplateURL</code> properties are specified), or the <code>Parameters</code> property, AWS CloudFormation marks all stack instances with a status of <code>OUTDATED</code> prior to updating the stack instances in the specified accounts and Regions. If the stack set update does not include changes to the template or parameters, AWS CloudFormation updates the stack instances in the specified accounts and Regions, while leaving all other stack instances with their existing stack instance status. </p>
9028    pub regions: Option<Vec<String>>,
9029    /// <p>The name or unique ID of the stack set that you want to update.</p>
9030    pub stack_set_name: String,
9031    /// <p>The key-value pairs to associate with this stack set and the stacks created from it. AWS CloudFormation also propagates these tags to supported resources that are created in the stacks. You can specify a maximum number of 50 tags.</p> <p>If you specify tags for this parameter, those tags replace any list of tags that are currently associated with this stack set. This means:</p> <ul> <li> <p>If you don't specify this parameter, AWS CloudFormation doesn't modify the stack's tags. </p> </li> <li> <p>If you specify <i>any</i> tags using this parameter, you must specify <i>all</i> the tags that you want associated with this stack set, even tags you've specifed before (for example, when creating the stack set or during a previous update of the stack set.). Any tags that you don't include in the updated list of tags are removed from the stack set, and therefore from the stacks and resources as well. </p> </li> <li> <p>If you specify an empty value, AWS CloudFormation removes all currently associated tags.</p> </li> </ul> <p>If you specify new tags as part of an <code>UpdateStackSet</code> action, AWS CloudFormation checks to see if you have the required IAM permission to tag resources. If you omit tags that are currently associated with the stack set from the list of tags you specify, AWS CloudFormation assumes that you want to remove those tags from the stack set, and checks to see if you have permission to untag resources. If you don't have the necessary permission(s), the entire <code>UpdateStackSet</code> action fails with an <code>access denied</code> error, and the stack set is not updated.</p>
9032    pub tags: Option<Vec<Tag>>,
9033    /// <p>The structure that contains the template body, with a minimum length of 1 byte and a maximum length of 51,200 bytes. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html">Template Anatomy</a> in the AWS CloudFormation User Guide.</p> <p>Conditional: You must specify only one of the following parameters: <code>TemplateBody</code> or <code>TemplateURL</code>—or set <code>UsePreviousTemplate</code> to true.</p>
9034    pub template_body: Option<String>,
9035    /// <p>The location of the file that contains the template body. The URL must point to a template (maximum size: 460,800 bytes) that is located in an Amazon S3 bucket. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html">Template Anatomy</a> in the AWS CloudFormation User Guide.</p> <p>Conditional: You must specify only one of the following parameters: <code>TemplateBody</code> or <code>TemplateURL</code>—or set <code>UsePreviousTemplate</code> to true. </p>
9036    pub template_url: Option<String>,
9037    /// <p>Use the existing template that's associated with the stack set that you're updating.</p> <p>Conditional: You must specify only one of the following parameters: <code>TemplateBody</code> or <code>TemplateURL</code>—or set <code>UsePreviousTemplate</code> to true. </p>
9038    pub use_previous_template: Option<bool>,
9039}
9040
9041/// Serialize `UpdateStackSetInput` contents to a `SignedRequest`.
9042struct UpdateStackSetInputSerializer;
9043impl UpdateStackSetInputSerializer {
9044    fn serialize(params: &mut Params, name: &str, obj: &UpdateStackSetInput) {
9045        let mut prefix = name.to_string();
9046        if prefix != "" {
9047            prefix.push_str(".");
9048        }
9049
9050        if let Some(ref field_value) = obj.accounts {
9051            AccountListSerializer::serialize(
9052                params,
9053                &format!("{}{}", prefix, "Accounts"),
9054                field_value,
9055            );
9056        }
9057        if let Some(ref field_value) = obj.administration_role_arn {
9058            params.put(
9059                &format!("{}{}", prefix, "AdministrationRoleARN"),
9060                &field_value,
9061            );
9062        }
9063        if let Some(ref field_value) = obj.auto_deployment {
9064            AutoDeploymentSerializer::serialize(
9065                params,
9066                &format!("{}{}", prefix, "AutoDeployment"),
9067                field_value,
9068            );
9069        }
9070        if let Some(ref field_value) = obj.capabilities {
9071            CapabilitiesSerializer::serialize(
9072                params,
9073                &format!("{}{}", prefix, "Capabilities"),
9074                field_value,
9075            );
9076        }
9077        if let Some(ref field_value) = obj.deployment_targets {
9078            DeploymentTargetsSerializer::serialize(
9079                params,
9080                &format!("{}{}", prefix, "DeploymentTargets"),
9081                field_value,
9082            );
9083        }
9084        if let Some(ref field_value) = obj.description {
9085            params.put(&format!("{}{}", prefix, "Description"), &field_value);
9086        }
9087        if let Some(ref field_value) = obj.execution_role_name {
9088            params.put(&format!("{}{}", prefix, "ExecutionRoleName"), &field_value);
9089        }
9090        if let Some(ref field_value) = obj.operation_id {
9091            params.put(&format!("{}{}", prefix, "OperationId"), &field_value);
9092        }
9093        if let Some(ref field_value) = obj.operation_preferences {
9094            StackSetOperationPreferencesSerializer::serialize(
9095                params,
9096                &format!("{}{}", prefix, "OperationPreferences"),
9097                field_value,
9098            );
9099        }
9100        if let Some(ref field_value) = obj.parameters {
9101            ParametersSerializer::serialize(
9102                params,
9103                &format!("{}{}", prefix, "Parameters"),
9104                field_value,
9105            );
9106        }
9107        if let Some(ref field_value) = obj.permission_model {
9108            params.put(&format!("{}{}", prefix, "PermissionModel"), &field_value);
9109        }
9110        if let Some(ref field_value) = obj.regions {
9111            RegionListSerializer::serialize(
9112                params,
9113                &format!("{}{}", prefix, "Regions"),
9114                field_value,
9115            );
9116        }
9117        params.put(
9118            &format!("{}{}", prefix, "StackSetName"),
9119            &obj.stack_set_name,
9120        );
9121        if let Some(ref field_value) = obj.tags {
9122            TagsSerializer::serialize(params, &format!("{}{}", prefix, "Tags"), field_value);
9123        }
9124        if let Some(ref field_value) = obj.template_body {
9125            params.put(&format!("{}{}", prefix, "TemplateBody"), &field_value);
9126        }
9127        if let Some(ref field_value) = obj.template_url {
9128            params.put(&format!("{}{}", prefix, "TemplateURL"), &field_value);
9129        }
9130        if let Some(ref field_value) = obj.use_previous_template {
9131            params.put(
9132                &format!("{}{}", prefix, "UsePreviousTemplate"),
9133                &field_value,
9134            );
9135        }
9136    }
9137}
9138
9139#[derive(Clone, Debug, Default, PartialEq)]
9140#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
9141pub struct UpdateStackSetOutput {
9142    /// <p>The unique ID for this stack set operation.</p>
9143    pub operation_id: Option<String>,
9144}
9145
9146#[allow(dead_code)]
9147struct UpdateStackSetOutputDeserializer;
9148impl UpdateStackSetOutputDeserializer {
9149    #[allow(dead_code, unused_variables)]
9150    fn deserialize<T: Peek + Next>(
9151        tag_name: &str,
9152        stack: &mut T,
9153    ) -> Result<UpdateStackSetOutput, XmlParseError> {
9154        deserialize_elements::<_, UpdateStackSetOutput, _>(tag_name, stack, |name, stack, obj| {
9155            match name {
9156                "OperationId" => {
9157                    obj.operation_id = Some(ClientRequestTokenDeserializer::deserialize(
9158                        "OperationId",
9159                        stack,
9160                    )?);
9161                }
9162                _ => skip_tree(stack),
9163            }
9164            Ok(())
9165        })
9166    }
9167}
9168#[derive(Clone, Debug, Default, PartialEq)]
9169#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
9170pub struct UpdateTerminationProtectionInput {
9171    /// <p>Whether to enable termination protection on the specified stack.</p>
9172    pub enable_termination_protection: bool,
9173    /// <p>The name or unique ID of the stack for which you want to set termination protection.</p>
9174    pub stack_name: String,
9175}
9176
9177/// Serialize `UpdateTerminationProtectionInput` contents to a `SignedRequest`.
9178struct UpdateTerminationProtectionInputSerializer;
9179impl UpdateTerminationProtectionInputSerializer {
9180    fn serialize(params: &mut Params, name: &str, obj: &UpdateTerminationProtectionInput) {
9181        let mut prefix = name.to_string();
9182        if prefix != "" {
9183            prefix.push_str(".");
9184        }
9185
9186        params.put(
9187            &format!("{}{}", prefix, "EnableTerminationProtection"),
9188            &obj.enable_termination_protection,
9189        );
9190        params.put(&format!("{}{}", prefix, "StackName"), &obj.stack_name);
9191    }
9192}
9193
9194#[derive(Clone, Debug, Default, PartialEq)]
9195#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
9196pub struct UpdateTerminationProtectionOutput {
9197    /// <p>The unique ID of the stack.</p>
9198    pub stack_id: Option<String>,
9199}
9200
9201#[allow(dead_code)]
9202struct UpdateTerminationProtectionOutputDeserializer;
9203impl UpdateTerminationProtectionOutputDeserializer {
9204    #[allow(dead_code, unused_variables)]
9205    fn deserialize<T: Peek + Next>(
9206        tag_name: &str,
9207        stack: &mut T,
9208    ) -> Result<UpdateTerminationProtectionOutput, XmlParseError> {
9209        deserialize_elements::<_, UpdateTerminationProtectionOutput, _>(
9210            tag_name,
9211            stack,
9212            |name, stack, obj| {
9213                match name {
9214                    "StackId" => {
9215                        obj.stack_id = Some(StackIdDeserializer::deserialize("StackId", stack)?);
9216                    }
9217                    _ => skip_tree(stack),
9218                }
9219                Ok(())
9220            },
9221        )
9222    }
9223}
9224#[allow(dead_code)]
9225struct UrlDeserializer;
9226impl UrlDeserializer {
9227    #[allow(dead_code, unused_variables)]
9228    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
9229        xml_util::deserialize_primitive(tag_name, stack, Ok)
9230    }
9231}
9232#[allow(dead_code)]
9233struct UsePreviousValueDeserializer;
9234impl UsePreviousValueDeserializer {
9235    #[allow(dead_code, unused_variables)]
9236    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<bool, XmlParseError> {
9237        xml_util::deserialize_primitive(tag_name, stack, |s| Ok(bool::from_str(&s).unwrap()))
9238    }
9239}
9240/// <p>The input for <a>ValidateTemplate</a> action.</p>
9241#[derive(Clone, Debug, Default, PartialEq)]
9242#[cfg_attr(feature = "deserialize_structs", derive(Deserialize))]
9243pub struct ValidateTemplateInput {
9244    /// <p>Structure containing the template body with a minimum length of 1 byte and a maximum length of 51,200 bytes. For more information, go to <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html">Template Anatomy</a> in the AWS CloudFormation User Guide.</p> <p>Conditional: You must pass <code>TemplateURL</code> or <code>TemplateBody</code>. If both are passed, only <code>TemplateBody</code> is used.</p>
9245    pub template_body: Option<String>,
9246    /// <p>Location of file containing the template body. The URL must point to a template (max size: 460,800 bytes) that is located in an Amazon S3 bucket. For more information, go to <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html">Template Anatomy</a> in the AWS CloudFormation User Guide.</p> <p>Conditional: You must pass <code>TemplateURL</code> or <code>TemplateBody</code>. If both are passed, only <code>TemplateBody</code> is used.</p>
9247    pub template_url: Option<String>,
9248}
9249
9250/// Serialize `ValidateTemplateInput` contents to a `SignedRequest`.
9251struct ValidateTemplateInputSerializer;
9252impl ValidateTemplateInputSerializer {
9253    fn serialize(params: &mut Params, name: &str, obj: &ValidateTemplateInput) {
9254        let mut prefix = name.to_string();
9255        if prefix != "" {
9256            prefix.push_str(".");
9257        }
9258
9259        if let Some(ref field_value) = obj.template_body {
9260            params.put(&format!("{}{}", prefix, "TemplateBody"), &field_value);
9261        }
9262        if let Some(ref field_value) = obj.template_url {
9263            params.put(&format!("{}{}", prefix, "TemplateURL"), &field_value);
9264        }
9265    }
9266}
9267
9268/// <p>The output for <a>ValidateTemplate</a> action.</p>
9269#[derive(Clone, Debug, Default, PartialEq)]
9270#[cfg_attr(feature = "serialize_structs", derive(Serialize))]
9271pub struct ValidateTemplateOutput {
9272    /// <p>The capabilities found within the template. If your template contains IAM resources, you must specify the CAPABILITY_IAM or CAPABILITY_NAMED_IAM value for this parameter when you use the <a>CreateStack</a> or <a>UpdateStack</a> actions with your template; otherwise, those actions return an InsufficientCapabilities error.</p> <p>For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html#capabilities">Acknowledging IAM Resources in AWS CloudFormation Templates</a>.</p>
9273    pub capabilities: Option<Vec<String>>,
9274    /// <p>The list of resources that generated the values in the <code>Capabilities</code> response element.</p>
9275    pub capabilities_reason: Option<String>,
9276    /// <p>A list of the transforms that are declared in the template.</p>
9277    pub declared_transforms: Option<Vec<String>>,
9278    /// <p>The description found within the template.</p>
9279    pub description: Option<String>,
9280    /// <p>A list of <code>TemplateParameter</code> structures.</p>
9281    pub parameters: Option<Vec<TemplateParameter>>,
9282}
9283
9284#[allow(dead_code)]
9285struct ValidateTemplateOutputDeserializer;
9286impl ValidateTemplateOutputDeserializer {
9287    #[allow(dead_code, unused_variables)]
9288    fn deserialize<T: Peek + Next>(
9289        tag_name: &str,
9290        stack: &mut T,
9291    ) -> Result<ValidateTemplateOutput, XmlParseError> {
9292        deserialize_elements::<_, ValidateTemplateOutput, _>(tag_name, stack, |name, stack, obj| {
9293            match name {
9294                "Capabilities" => {
9295                    obj.capabilities.get_or_insert(vec![]).extend(
9296                        CapabilitiesDeserializer::deserialize("Capabilities", stack)?,
9297                    );
9298                }
9299                "CapabilitiesReason" => {
9300                    obj.capabilities_reason = Some(CapabilitiesReasonDeserializer::deserialize(
9301                        "CapabilitiesReason",
9302                        stack,
9303                    )?);
9304                }
9305                "DeclaredTransforms" => {
9306                    obj.declared_transforms.get_or_insert(vec![]).extend(
9307                        TransformsListDeserializer::deserialize("DeclaredTransforms", stack)?,
9308                    );
9309                }
9310                "Description" => {
9311                    obj.description =
9312                        Some(DescriptionDeserializer::deserialize("Description", stack)?);
9313                }
9314                "Parameters" => {
9315                    obj.parameters.get_or_insert(vec![]).extend(
9316                        TemplateParametersDeserializer::deserialize("Parameters", stack)?,
9317                    );
9318                }
9319                _ => skip_tree(stack),
9320            }
9321            Ok(())
9322        })
9323    }
9324}
9325#[allow(dead_code)]
9326struct ValueDeserializer;
9327impl ValueDeserializer {
9328    #[allow(dead_code, unused_variables)]
9329    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
9330        xml_util::deserialize_primitive(tag_name, stack, Ok)
9331    }
9332}
9333#[allow(dead_code)]
9334struct VersionDeserializer;
9335impl VersionDeserializer {
9336    #[allow(dead_code, unused_variables)]
9337    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
9338        xml_util::deserialize_primitive(tag_name, stack, Ok)
9339    }
9340}
9341#[allow(dead_code)]
9342struct VisibilityDeserializer;
9343impl VisibilityDeserializer {
9344    #[allow(dead_code, unused_variables)]
9345    fn deserialize<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<String, XmlParseError> {
9346        xml_util::deserialize_primitive(tag_name, stack, Ok)
9347    }
9348}
9349/// Errors returned by CancelUpdateStack
9350#[derive(Debug, PartialEq)]
9351pub enum CancelUpdateStackError {
9352    /// <p>A client request token already exists.</p>
9353    TokenAlreadyExists(String),
9354}
9355
9356impl CancelUpdateStackError {
9357    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<CancelUpdateStackError> {
9358        {
9359            let reader = EventReader::new(res.body.as_ref());
9360            let mut stack = XmlResponse::new(reader.into_iter().peekable());
9361            find_start_element(&mut stack);
9362            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
9363                match &parsed_error.code[..] {
9364                    "TokenAlreadyExistsException" => {
9365                        return RusotoError::Service(CancelUpdateStackError::TokenAlreadyExists(
9366                            parsed_error.message,
9367                        ))
9368                    }
9369                    _ => {}
9370                }
9371            }
9372        }
9373        RusotoError::Unknown(res)
9374    }
9375
9376    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
9377    where
9378        T: Peek + Next,
9379    {
9380        xml_util::start_element("ErrorResponse", stack)?;
9381        XmlErrorDeserializer::deserialize("Error", stack)
9382    }
9383}
9384impl fmt::Display for CancelUpdateStackError {
9385    #[allow(unused_variables)]
9386    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
9387        match *self {
9388            CancelUpdateStackError::TokenAlreadyExists(ref cause) => write!(f, "{}", cause),
9389        }
9390    }
9391}
9392impl Error for CancelUpdateStackError {}
9393/// Errors returned by ContinueUpdateRollback
9394#[derive(Debug, PartialEq)]
9395pub enum ContinueUpdateRollbackError {
9396    /// <p>A client request token already exists.</p>
9397    TokenAlreadyExists(String),
9398}
9399
9400impl ContinueUpdateRollbackError {
9401    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<ContinueUpdateRollbackError> {
9402        {
9403            let reader = EventReader::new(res.body.as_ref());
9404            let mut stack = XmlResponse::new(reader.into_iter().peekable());
9405            find_start_element(&mut stack);
9406            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
9407                match &parsed_error.code[..] {
9408                    "TokenAlreadyExistsException" => {
9409                        return RusotoError::Service(
9410                            ContinueUpdateRollbackError::TokenAlreadyExists(parsed_error.message),
9411                        )
9412                    }
9413                    _ => {}
9414                }
9415            }
9416        }
9417        RusotoError::Unknown(res)
9418    }
9419
9420    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
9421    where
9422        T: Peek + Next,
9423    {
9424        xml_util::start_element("ErrorResponse", stack)?;
9425        XmlErrorDeserializer::deserialize("Error", stack)
9426    }
9427}
9428impl fmt::Display for ContinueUpdateRollbackError {
9429    #[allow(unused_variables)]
9430    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
9431        match *self {
9432            ContinueUpdateRollbackError::TokenAlreadyExists(ref cause) => write!(f, "{}", cause),
9433        }
9434    }
9435}
9436impl Error for ContinueUpdateRollbackError {}
9437/// Errors returned by CreateChangeSet
9438#[derive(Debug, PartialEq)]
9439pub enum CreateChangeSetError {
9440    /// <p>The resource with the name requested already exists.</p>
9441    AlreadyExists(String),
9442    /// <p>The template contains resources with capabilities that weren't specified in the Capabilities parameter.</p>
9443    InsufficientCapabilities(String),
9444    /// <p>The quota for the resource has already been reached.</p> <p>For information on resource and stack limitations, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html">Limits</a> in the <i>AWS CloudFormation User Guide</i>.</p>
9445    LimitExceeded(String),
9446}
9447
9448impl CreateChangeSetError {
9449    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<CreateChangeSetError> {
9450        {
9451            let reader = EventReader::new(res.body.as_ref());
9452            let mut stack = XmlResponse::new(reader.into_iter().peekable());
9453            find_start_element(&mut stack);
9454            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
9455                match &parsed_error.code[..] {
9456                    "AlreadyExistsException" => {
9457                        return RusotoError::Service(CreateChangeSetError::AlreadyExists(
9458                            parsed_error.message,
9459                        ))
9460                    }
9461                    "InsufficientCapabilitiesException" => {
9462                        return RusotoError::Service(
9463                            CreateChangeSetError::InsufficientCapabilities(parsed_error.message),
9464                        )
9465                    }
9466                    "LimitExceededException" => {
9467                        return RusotoError::Service(CreateChangeSetError::LimitExceeded(
9468                            parsed_error.message,
9469                        ))
9470                    }
9471                    _ => {}
9472                }
9473            }
9474        }
9475        RusotoError::Unknown(res)
9476    }
9477
9478    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
9479    where
9480        T: Peek + Next,
9481    {
9482        xml_util::start_element("ErrorResponse", stack)?;
9483        XmlErrorDeserializer::deserialize("Error", stack)
9484    }
9485}
9486impl fmt::Display for CreateChangeSetError {
9487    #[allow(unused_variables)]
9488    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
9489        match *self {
9490            CreateChangeSetError::AlreadyExists(ref cause) => write!(f, "{}", cause),
9491            CreateChangeSetError::InsufficientCapabilities(ref cause) => write!(f, "{}", cause),
9492            CreateChangeSetError::LimitExceeded(ref cause) => write!(f, "{}", cause),
9493        }
9494    }
9495}
9496impl Error for CreateChangeSetError {}
9497/// Errors returned by CreateStack
9498#[derive(Debug, PartialEq)]
9499pub enum CreateStackError {
9500    /// <p>The resource with the name requested already exists.</p>
9501    AlreadyExists(String),
9502    /// <p>The template contains resources with capabilities that weren't specified in the Capabilities parameter.</p>
9503    InsufficientCapabilities(String),
9504    /// <p>The quota for the resource has already been reached.</p> <p>For information on resource and stack limitations, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html">Limits</a> in the <i>AWS CloudFormation User Guide</i>.</p>
9505    LimitExceeded(String),
9506    /// <p>A client request token already exists.</p>
9507    TokenAlreadyExists(String),
9508}
9509
9510impl CreateStackError {
9511    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<CreateStackError> {
9512        {
9513            let reader = EventReader::new(res.body.as_ref());
9514            let mut stack = XmlResponse::new(reader.into_iter().peekable());
9515            find_start_element(&mut stack);
9516            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
9517                match &parsed_error.code[..] {
9518                    "AlreadyExistsException" => {
9519                        return RusotoError::Service(CreateStackError::AlreadyExists(
9520                            parsed_error.message,
9521                        ))
9522                    }
9523                    "InsufficientCapabilitiesException" => {
9524                        return RusotoError::Service(CreateStackError::InsufficientCapabilities(
9525                            parsed_error.message,
9526                        ))
9527                    }
9528                    "LimitExceededException" => {
9529                        return RusotoError::Service(CreateStackError::LimitExceeded(
9530                            parsed_error.message,
9531                        ))
9532                    }
9533                    "TokenAlreadyExistsException" => {
9534                        return RusotoError::Service(CreateStackError::TokenAlreadyExists(
9535                            parsed_error.message,
9536                        ))
9537                    }
9538                    _ => {}
9539                }
9540            }
9541        }
9542        RusotoError::Unknown(res)
9543    }
9544
9545    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
9546    where
9547        T: Peek + Next,
9548    {
9549        xml_util::start_element("ErrorResponse", stack)?;
9550        XmlErrorDeserializer::deserialize("Error", stack)
9551    }
9552}
9553impl fmt::Display for CreateStackError {
9554    #[allow(unused_variables)]
9555    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
9556        match *self {
9557            CreateStackError::AlreadyExists(ref cause) => write!(f, "{}", cause),
9558            CreateStackError::InsufficientCapabilities(ref cause) => write!(f, "{}", cause),
9559            CreateStackError::LimitExceeded(ref cause) => write!(f, "{}", cause),
9560            CreateStackError::TokenAlreadyExists(ref cause) => write!(f, "{}", cause),
9561        }
9562    }
9563}
9564impl Error for CreateStackError {}
9565/// Errors returned by CreateStackInstances
9566#[derive(Debug, PartialEq)]
9567pub enum CreateStackInstancesError {
9568    /// <p>The specified operation isn't valid.</p>
9569    InvalidOperation(String),
9570    /// <p>The quota for the resource has already been reached.</p> <p>For information on resource and stack limitations, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html">Limits</a> in the <i>AWS CloudFormation User Guide</i>.</p>
9571    LimitExceeded(String),
9572    /// <p>The specified operation ID already exists.</p>
9573    OperationIdAlreadyExists(String),
9574    /// <p>Another operation is currently in progress for this stack set. Only one operation can be performed for a stack set at a given time.</p>
9575    OperationInProgress(String),
9576    /// <p>The specified stack set doesn't exist.</p>
9577    StackSetNotFound(String),
9578    /// <p>Another operation has been performed on this stack set since the specified operation was performed. </p>
9579    StaleRequest(String),
9580}
9581
9582impl CreateStackInstancesError {
9583    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<CreateStackInstancesError> {
9584        {
9585            let reader = EventReader::new(res.body.as_ref());
9586            let mut stack = XmlResponse::new(reader.into_iter().peekable());
9587            find_start_element(&mut stack);
9588            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
9589                match &parsed_error.code[..] {
9590                    "InvalidOperationException" => {
9591                        return RusotoError::Service(CreateStackInstancesError::InvalidOperation(
9592                            parsed_error.message,
9593                        ))
9594                    }
9595                    "LimitExceededException" => {
9596                        return RusotoError::Service(CreateStackInstancesError::LimitExceeded(
9597                            parsed_error.message,
9598                        ))
9599                    }
9600                    "OperationIdAlreadyExistsException" => {
9601                        return RusotoError::Service(
9602                            CreateStackInstancesError::OperationIdAlreadyExists(
9603                                parsed_error.message,
9604                            ),
9605                        )
9606                    }
9607                    "OperationInProgressException" => {
9608                        return RusotoError::Service(
9609                            CreateStackInstancesError::OperationInProgress(parsed_error.message),
9610                        )
9611                    }
9612                    "StackSetNotFoundException" => {
9613                        return RusotoError::Service(CreateStackInstancesError::StackSetNotFound(
9614                            parsed_error.message,
9615                        ))
9616                    }
9617                    "StaleRequestException" => {
9618                        return RusotoError::Service(CreateStackInstancesError::StaleRequest(
9619                            parsed_error.message,
9620                        ))
9621                    }
9622                    _ => {}
9623                }
9624            }
9625        }
9626        RusotoError::Unknown(res)
9627    }
9628
9629    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
9630    where
9631        T: Peek + Next,
9632    {
9633        xml_util::start_element("ErrorResponse", stack)?;
9634        XmlErrorDeserializer::deserialize("Error", stack)
9635    }
9636}
9637impl fmt::Display for CreateStackInstancesError {
9638    #[allow(unused_variables)]
9639    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
9640        match *self {
9641            CreateStackInstancesError::InvalidOperation(ref cause) => write!(f, "{}", cause),
9642            CreateStackInstancesError::LimitExceeded(ref cause) => write!(f, "{}", cause),
9643            CreateStackInstancesError::OperationIdAlreadyExists(ref cause) => {
9644                write!(f, "{}", cause)
9645            }
9646            CreateStackInstancesError::OperationInProgress(ref cause) => write!(f, "{}", cause),
9647            CreateStackInstancesError::StackSetNotFound(ref cause) => write!(f, "{}", cause),
9648            CreateStackInstancesError::StaleRequest(ref cause) => write!(f, "{}", cause),
9649        }
9650    }
9651}
9652impl Error for CreateStackInstancesError {}
9653/// Errors returned by CreateStackSet
9654#[derive(Debug, PartialEq)]
9655pub enum CreateStackSetError {
9656    /// <p>The specified resource exists, but has been changed.</p>
9657    CreatedButModified(String),
9658    /// <p>The quota for the resource has already been reached.</p> <p>For information on resource and stack limitations, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html">Limits</a> in the <i>AWS CloudFormation User Guide</i>.</p>
9659    LimitExceeded(String),
9660    /// <p>The specified name is already in use.</p>
9661    NameAlreadyExists(String),
9662}
9663
9664impl CreateStackSetError {
9665    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<CreateStackSetError> {
9666        {
9667            let reader = EventReader::new(res.body.as_ref());
9668            let mut stack = XmlResponse::new(reader.into_iter().peekable());
9669            find_start_element(&mut stack);
9670            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
9671                match &parsed_error.code[..] {
9672                    "CreatedButModifiedException" => {
9673                        return RusotoError::Service(CreateStackSetError::CreatedButModified(
9674                            parsed_error.message,
9675                        ))
9676                    }
9677                    "LimitExceededException" => {
9678                        return RusotoError::Service(CreateStackSetError::LimitExceeded(
9679                            parsed_error.message,
9680                        ))
9681                    }
9682                    "NameAlreadyExistsException" => {
9683                        return RusotoError::Service(CreateStackSetError::NameAlreadyExists(
9684                            parsed_error.message,
9685                        ))
9686                    }
9687                    _ => {}
9688                }
9689            }
9690        }
9691        RusotoError::Unknown(res)
9692    }
9693
9694    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
9695    where
9696        T: Peek + Next,
9697    {
9698        xml_util::start_element("ErrorResponse", stack)?;
9699        XmlErrorDeserializer::deserialize("Error", stack)
9700    }
9701}
9702impl fmt::Display for CreateStackSetError {
9703    #[allow(unused_variables)]
9704    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
9705        match *self {
9706            CreateStackSetError::CreatedButModified(ref cause) => write!(f, "{}", cause),
9707            CreateStackSetError::LimitExceeded(ref cause) => write!(f, "{}", cause),
9708            CreateStackSetError::NameAlreadyExists(ref cause) => write!(f, "{}", cause),
9709        }
9710    }
9711}
9712impl Error for CreateStackSetError {}
9713/// Errors returned by DeleteChangeSet
9714#[derive(Debug, PartialEq)]
9715pub enum DeleteChangeSetError {
9716    /// <p>The specified change set can't be used to update the stack. For example, the change set status might be <code>CREATE_IN_PROGRESS</code>, or the stack status might be <code>UPDATE_IN_PROGRESS</code>.</p>
9717    InvalidChangeSetStatus(String),
9718}
9719
9720impl DeleteChangeSetError {
9721    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<DeleteChangeSetError> {
9722        {
9723            let reader = EventReader::new(res.body.as_ref());
9724            let mut stack = XmlResponse::new(reader.into_iter().peekable());
9725            find_start_element(&mut stack);
9726            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
9727                match &parsed_error.code[..] {
9728                    "InvalidChangeSetStatus" => {
9729                        return RusotoError::Service(DeleteChangeSetError::InvalidChangeSetStatus(
9730                            parsed_error.message,
9731                        ))
9732                    }
9733                    _ => {}
9734                }
9735            }
9736        }
9737        RusotoError::Unknown(res)
9738    }
9739
9740    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
9741    where
9742        T: Peek + Next,
9743    {
9744        xml_util::start_element("ErrorResponse", stack)?;
9745        XmlErrorDeserializer::deserialize("Error", stack)
9746    }
9747}
9748impl fmt::Display for DeleteChangeSetError {
9749    #[allow(unused_variables)]
9750    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
9751        match *self {
9752            DeleteChangeSetError::InvalidChangeSetStatus(ref cause) => write!(f, "{}", cause),
9753        }
9754    }
9755}
9756impl Error for DeleteChangeSetError {}
9757/// Errors returned by DeleteStack
9758#[derive(Debug, PartialEq)]
9759pub enum DeleteStackError {
9760    /// <p>A client request token already exists.</p>
9761    TokenAlreadyExists(String),
9762}
9763
9764impl DeleteStackError {
9765    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<DeleteStackError> {
9766        {
9767            let reader = EventReader::new(res.body.as_ref());
9768            let mut stack = XmlResponse::new(reader.into_iter().peekable());
9769            find_start_element(&mut stack);
9770            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
9771                match &parsed_error.code[..] {
9772                    "TokenAlreadyExistsException" => {
9773                        return RusotoError::Service(DeleteStackError::TokenAlreadyExists(
9774                            parsed_error.message,
9775                        ))
9776                    }
9777                    _ => {}
9778                }
9779            }
9780        }
9781        RusotoError::Unknown(res)
9782    }
9783
9784    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
9785    where
9786        T: Peek + Next,
9787    {
9788        xml_util::start_element("ErrorResponse", stack)?;
9789        XmlErrorDeserializer::deserialize("Error", stack)
9790    }
9791}
9792impl fmt::Display for DeleteStackError {
9793    #[allow(unused_variables)]
9794    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
9795        match *self {
9796            DeleteStackError::TokenAlreadyExists(ref cause) => write!(f, "{}", cause),
9797        }
9798    }
9799}
9800impl Error for DeleteStackError {}
9801/// Errors returned by DeleteStackInstances
9802#[derive(Debug, PartialEq)]
9803pub enum DeleteStackInstancesError {
9804    /// <p>The specified operation isn't valid.</p>
9805    InvalidOperation(String),
9806    /// <p>The specified operation ID already exists.</p>
9807    OperationIdAlreadyExists(String),
9808    /// <p>Another operation is currently in progress for this stack set. Only one operation can be performed for a stack set at a given time.</p>
9809    OperationInProgress(String),
9810    /// <p>The specified stack set doesn't exist.</p>
9811    StackSetNotFound(String),
9812    /// <p>Another operation has been performed on this stack set since the specified operation was performed. </p>
9813    StaleRequest(String),
9814}
9815
9816impl DeleteStackInstancesError {
9817    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<DeleteStackInstancesError> {
9818        {
9819            let reader = EventReader::new(res.body.as_ref());
9820            let mut stack = XmlResponse::new(reader.into_iter().peekable());
9821            find_start_element(&mut stack);
9822            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
9823                match &parsed_error.code[..] {
9824                    "InvalidOperationException" => {
9825                        return RusotoError::Service(DeleteStackInstancesError::InvalidOperation(
9826                            parsed_error.message,
9827                        ))
9828                    }
9829                    "OperationIdAlreadyExistsException" => {
9830                        return RusotoError::Service(
9831                            DeleteStackInstancesError::OperationIdAlreadyExists(
9832                                parsed_error.message,
9833                            ),
9834                        )
9835                    }
9836                    "OperationInProgressException" => {
9837                        return RusotoError::Service(
9838                            DeleteStackInstancesError::OperationInProgress(parsed_error.message),
9839                        )
9840                    }
9841                    "StackSetNotFoundException" => {
9842                        return RusotoError::Service(DeleteStackInstancesError::StackSetNotFound(
9843                            parsed_error.message,
9844                        ))
9845                    }
9846                    "StaleRequestException" => {
9847                        return RusotoError::Service(DeleteStackInstancesError::StaleRequest(
9848                            parsed_error.message,
9849                        ))
9850                    }
9851                    _ => {}
9852                }
9853            }
9854        }
9855        RusotoError::Unknown(res)
9856    }
9857
9858    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
9859    where
9860        T: Peek + Next,
9861    {
9862        xml_util::start_element("ErrorResponse", stack)?;
9863        XmlErrorDeserializer::deserialize("Error", stack)
9864    }
9865}
9866impl fmt::Display for DeleteStackInstancesError {
9867    #[allow(unused_variables)]
9868    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
9869        match *self {
9870            DeleteStackInstancesError::InvalidOperation(ref cause) => write!(f, "{}", cause),
9871            DeleteStackInstancesError::OperationIdAlreadyExists(ref cause) => {
9872                write!(f, "{}", cause)
9873            }
9874            DeleteStackInstancesError::OperationInProgress(ref cause) => write!(f, "{}", cause),
9875            DeleteStackInstancesError::StackSetNotFound(ref cause) => write!(f, "{}", cause),
9876            DeleteStackInstancesError::StaleRequest(ref cause) => write!(f, "{}", cause),
9877        }
9878    }
9879}
9880impl Error for DeleteStackInstancesError {}
9881/// Errors returned by DeleteStackSet
9882#[derive(Debug, PartialEq)]
9883pub enum DeleteStackSetError {
9884    /// <p>Another operation is currently in progress for this stack set. Only one operation can be performed for a stack set at a given time.</p>
9885    OperationInProgress(String),
9886    /// <p>You can't yet delete this stack set, because it still contains one or more stack instances. Delete all stack instances from the stack set before deleting the stack set.</p>
9887    StackSetNotEmpty(String),
9888}
9889
9890impl DeleteStackSetError {
9891    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<DeleteStackSetError> {
9892        {
9893            let reader = EventReader::new(res.body.as_ref());
9894            let mut stack = XmlResponse::new(reader.into_iter().peekable());
9895            find_start_element(&mut stack);
9896            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
9897                match &parsed_error.code[..] {
9898                    "OperationInProgressException" => {
9899                        return RusotoError::Service(DeleteStackSetError::OperationInProgress(
9900                            parsed_error.message,
9901                        ))
9902                    }
9903                    "StackSetNotEmptyException" => {
9904                        return RusotoError::Service(DeleteStackSetError::StackSetNotEmpty(
9905                            parsed_error.message,
9906                        ))
9907                    }
9908                    _ => {}
9909                }
9910            }
9911        }
9912        RusotoError::Unknown(res)
9913    }
9914
9915    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
9916    where
9917        T: Peek + Next,
9918    {
9919        xml_util::start_element("ErrorResponse", stack)?;
9920        XmlErrorDeserializer::deserialize("Error", stack)
9921    }
9922}
9923impl fmt::Display for DeleteStackSetError {
9924    #[allow(unused_variables)]
9925    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
9926        match *self {
9927            DeleteStackSetError::OperationInProgress(ref cause) => write!(f, "{}", cause),
9928            DeleteStackSetError::StackSetNotEmpty(ref cause) => write!(f, "{}", cause),
9929        }
9930    }
9931}
9932impl Error for DeleteStackSetError {}
9933/// Errors returned by DeregisterType
9934#[derive(Debug, PartialEq)]
9935pub enum DeregisterTypeError {
9936    /// <p>An error occurred during a CloudFormation registry operation.</p>
9937    CFNRegistry(String),
9938    /// <p>The specified type does not exist in the CloudFormation registry.</p>
9939    TypeNotFound(String),
9940}
9941
9942impl DeregisterTypeError {
9943    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<DeregisterTypeError> {
9944        {
9945            let reader = EventReader::new(res.body.as_ref());
9946            let mut stack = XmlResponse::new(reader.into_iter().peekable());
9947            find_start_element(&mut stack);
9948            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
9949                match &parsed_error.code[..] {
9950                    "CFNRegistryException" => {
9951                        return RusotoError::Service(DeregisterTypeError::CFNRegistry(
9952                            parsed_error.message,
9953                        ))
9954                    }
9955                    "TypeNotFoundException" => {
9956                        return RusotoError::Service(DeregisterTypeError::TypeNotFound(
9957                            parsed_error.message,
9958                        ))
9959                    }
9960                    _ => {}
9961                }
9962            }
9963        }
9964        RusotoError::Unknown(res)
9965    }
9966
9967    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
9968    where
9969        T: Peek + Next,
9970    {
9971        xml_util::start_element("ErrorResponse", stack)?;
9972        XmlErrorDeserializer::deserialize("Error", stack)
9973    }
9974}
9975impl fmt::Display for DeregisterTypeError {
9976    #[allow(unused_variables)]
9977    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
9978        match *self {
9979            DeregisterTypeError::CFNRegistry(ref cause) => write!(f, "{}", cause),
9980            DeregisterTypeError::TypeNotFound(ref cause) => write!(f, "{}", cause),
9981        }
9982    }
9983}
9984impl Error for DeregisterTypeError {}
9985/// Errors returned by DescribeAccountLimits
9986#[derive(Debug, PartialEq)]
9987pub enum DescribeAccountLimitsError {}
9988
9989impl DescribeAccountLimitsError {
9990    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<DescribeAccountLimitsError> {
9991        {
9992            let reader = EventReader::new(res.body.as_ref());
9993            let mut stack = XmlResponse::new(reader.into_iter().peekable());
9994            find_start_element(&mut stack);
9995            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
9996                match &parsed_error.code[..] {
9997                    _ => {}
9998                }
9999            }
10000        }
10001        RusotoError::Unknown(res)
10002    }
10003
10004    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10005    where
10006        T: Peek + Next,
10007    {
10008        xml_util::start_element("ErrorResponse", stack)?;
10009        XmlErrorDeserializer::deserialize("Error", stack)
10010    }
10011}
10012impl fmt::Display for DescribeAccountLimitsError {
10013    #[allow(unused_variables)]
10014    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10015        match *self {}
10016    }
10017}
10018impl Error for DescribeAccountLimitsError {}
10019/// Errors returned by DescribeChangeSet
10020#[derive(Debug, PartialEq)]
10021pub enum DescribeChangeSetError {
10022    /// <p>The specified change set name or ID doesn't exit. To view valid change sets for a stack, use the <code>ListChangeSets</code> action.</p>
10023    ChangeSetNotFound(String),
10024}
10025
10026impl DescribeChangeSetError {
10027    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<DescribeChangeSetError> {
10028        {
10029            let reader = EventReader::new(res.body.as_ref());
10030            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10031            find_start_element(&mut stack);
10032            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10033                match &parsed_error.code[..] {
10034                    "ChangeSetNotFound" => {
10035                        return RusotoError::Service(DescribeChangeSetError::ChangeSetNotFound(
10036                            parsed_error.message,
10037                        ))
10038                    }
10039                    _ => {}
10040                }
10041            }
10042        }
10043        RusotoError::Unknown(res)
10044    }
10045
10046    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10047    where
10048        T: Peek + Next,
10049    {
10050        xml_util::start_element("ErrorResponse", stack)?;
10051        XmlErrorDeserializer::deserialize("Error", stack)
10052    }
10053}
10054impl fmt::Display for DescribeChangeSetError {
10055    #[allow(unused_variables)]
10056    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10057        match *self {
10058            DescribeChangeSetError::ChangeSetNotFound(ref cause) => write!(f, "{}", cause),
10059        }
10060    }
10061}
10062impl Error for DescribeChangeSetError {}
10063/// Errors returned by DescribeStackDriftDetectionStatus
10064#[derive(Debug, PartialEq)]
10065pub enum DescribeStackDriftDetectionStatusError {}
10066
10067impl DescribeStackDriftDetectionStatusError {
10068    pub fn from_response(
10069        res: BufferedHttpResponse,
10070    ) -> RusotoError<DescribeStackDriftDetectionStatusError> {
10071        {
10072            let reader = EventReader::new(res.body.as_ref());
10073            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10074            find_start_element(&mut stack);
10075            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10076                match &parsed_error.code[..] {
10077                    _ => {}
10078                }
10079            }
10080        }
10081        RusotoError::Unknown(res)
10082    }
10083
10084    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10085    where
10086        T: Peek + Next,
10087    {
10088        xml_util::start_element("ErrorResponse", stack)?;
10089        XmlErrorDeserializer::deserialize("Error", stack)
10090    }
10091}
10092impl fmt::Display for DescribeStackDriftDetectionStatusError {
10093    #[allow(unused_variables)]
10094    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10095        match *self {}
10096    }
10097}
10098impl Error for DescribeStackDriftDetectionStatusError {}
10099/// Errors returned by DescribeStackEvents
10100#[derive(Debug, PartialEq)]
10101pub enum DescribeStackEventsError {}
10102
10103impl DescribeStackEventsError {
10104    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<DescribeStackEventsError> {
10105        {
10106            let reader = EventReader::new(res.body.as_ref());
10107            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10108            find_start_element(&mut stack);
10109            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10110                match &parsed_error.code[..] {
10111                    _ => {}
10112                }
10113            }
10114        }
10115        RusotoError::Unknown(res)
10116    }
10117
10118    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10119    where
10120        T: Peek + Next,
10121    {
10122        xml_util::start_element("ErrorResponse", stack)?;
10123        XmlErrorDeserializer::deserialize("Error", stack)
10124    }
10125}
10126impl fmt::Display for DescribeStackEventsError {
10127    #[allow(unused_variables)]
10128    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10129        match *self {}
10130    }
10131}
10132impl Error for DescribeStackEventsError {}
10133/// Errors returned by DescribeStackInstance
10134#[derive(Debug, PartialEq)]
10135pub enum DescribeStackInstanceError {
10136    /// <p>The specified stack instance doesn't exist.</p>
10137    StackInstanceNotFound(String),
10138    /// <p>The specified stack set doesn't exist.</p>
10139    StackSetNotFound(String),
10140}
10141
10142impl DescribeStackInstanceError {
10143    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<DescribeStackInstanceError> {
10144        {
10145            let reader = EventReader::new(res.body.as_ref());
10146            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10147            find_start_element(&mut stack);
10148            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10149                match &parsed_error.code[..] {
10150                    "StackInstanceNotFoundException" => {
10151                        return RusotoError::Service(
10152                            DescribeStackInstanceError::StackInstanceNotFound(parsed_error.message),
10153                        )
10154                    }
10155                    "StackSetNotFoundException" => {
10156                        return RusotoError::Service(DescribeStackInstanceError::StackSetNotFound(
10157                            parsed_error.message,
10158                        ))
10159                    }
10160                    _ => {}
10161                }
10162            }
10163        }
10164        RusotoError::Unknown(res)
10165    }
10166
10167    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10168    where
10169        T: Peek + Next,
10170    {
10171        xml_util::start_element("ErrorResponse", stack)?;
10172        XmlErrorDeserializer::deserialize("Error", stack)
10173    }
10174}
10175impl fmt::Display for DescribeStackInstanceError {
10176    #[allow(unused_variables)]
10177    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10178        match *self {
10179            DescribeStackInstanceError::StackInstanceNotFound(ref cause) => write!(f, "{}", cause),
10180            DescribeStackInstanceError::StackSetNotFound(ref cause) => write!(f, "{}", cause),
10181        }
10182    }
10183}
10184impl Error for DescribeStackInstanceError {}
10185/// Errors returned by DescribeStackResource
10186#[derive(Debug, PartialEq)]
10187pub enum DescribeStackResourceError {}
10188
10189impl DescribeStackResourceError {
10190    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<DescribeStackResourceError> {
10191        {
10192            let reader = EventReader::new(res.body.as_ref());
10193            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10194            find_start_element(&mut stack);
10195            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10196                match &parsed_error.code[..] {
10197                    _ => {}
10198                }
10199            }
10200        }
10201        RusotoError::Unknown(res)
10202    }
10203
10204    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10205    where
10206        T: Peek + Next,
10207    {
10208        xml_util::start_element("ErrorResponse", stack)?;
10209        XmlErrorDeserializer::deserialize("Error", stack)
10210    }
10211}
10212impl fmt::Display for DescribeStackResourceError {
10213    #[allow(unused_variables)]
10214    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10215        match *self {}
10216    }
10217}
10218impl Error for DescribeStackResourceError {}
10219/// Errors returned by DescribeStackResourceDrifts
10220#[derive(Debug, PartialEq)]
10221pub enum DescribeStackResourceDriftsError {}
10222
10223impl DescribeStackResourceDriftsError {
10224    pub fn from_response(
10225        res: BufferedHttpResponse,
10226    ) -> RusotoError<DescribeStackResourceDriftsError> {
10227        {
10228            let reader = EventReader::new(res.body.as_ref());
10229            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10230            find_start_element(&mut stack);
10231            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10232                match &parsed_error.code[..] {
10233                    _ => {}
10234                }
10235            }
10236        }
10237        RusotoError::Unknown(res)
10238    }
10239
10240    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10241    where
10242        T: Peek + Next,
10243    {
10244        xml_util::start_element("ErrorResponse", stack)?;
10245        XmlErrorDeserializer::deserialize("Error", stack)
10246    }
10247}
10248impl fmt::Display for DescribeStackResourceDriftsError {
10249    #[allow(unused_variables)]
10250    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10251        match *self {}
10252    }
10253}
10254impl Error for DescribeStackResourceDriftsError {}
10255/// Errors returned by DescribeStackResources
10256#[derive(Debug, PartialEq)]
10257pub enum DescribeStackResourcesError {}
10258
10259impl DescribeStackResourcesError {
10260    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<DescribeStackResourcesError> {
10261        {
10262            let reader = EventReader::new(res.body.as_ref());
10263            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10264            find_start_element(&mut stack);
10265            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10266                match &parsed_error.code[..] {
10267                    _ => {}
10268                }
10269            }
10270        }
10271        RusotoError::Unknown(res)
10272    }
10273
10274    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10275    where
10276        T: Peek + Next,
10277    {
10278        xml_util::start_element("ErrorResponse", stack)?;
10279        XmlErrorDeserializer::deserialize("Error", stack)
10280    }
10281}
10282impl fmt::Display for DescribeStackResourcesError {
10283    #[allow(unused_variables)]
10284    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10285        match *self {}
10286    }
10287}
10288impl Error for DescribeStackResourcesError {}
10289/// Errors returned by DescribeStackSet
10290#[derive(Debug, PartialEq)]
10291pub enum DescribeStackSetError {
10292    /// <p>The specified stack set doesn't exist.</p>
10293    StackSetNotFound(String),
10294}
10295
10296impl DescribeStackSetError {
10297    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<DescribeStackSetError> {
10298        {
10299            let reader = EventReader::new(res.body.as_ref());
10300            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10301            find_start_element(&mut stack);
10302            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10303                match &parsed_error.code[..] {
10304                    "StackSetNotFoundException" => {
10305                        return RusotoError::Service(DescribeStackSetError::StackSetNotFound(
10306                            parsed_error.message,
10307                        ))
10308                    }
10309                    _ => {}
10310                }
10311            }
10312        }
10313        RusotoError::Unknown(res)
10314    }
10315
10316    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10317    where
10318        T: Peek + Next,
10319    {
10320        xml_util::start_element("ErrorResponse", stack)?;
10321        XmlErrorDeserializer::deserialize("Error", stack)
10322    }
10323}
10324impl fmt::Display for DescribeStackSetError {
10325    #[allow(unused_variables)]
10326    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10327        match *self {
10328            DescribeStackSetError::StackSetNotFound(ref cause) => write!(f, "{}", cause),
10329        }
10330    }
10331}
10332impl Error for DescribeStackSetError {}
10333/// Errors returned by DescribeStackSetOperation
10334#[derive(Debug, PartialEq)]
10335pub enum DescribeStackSetOperationError {
10336    /// <p>The specified ID refers to an operation that doesn't exist.</p>
10337    OperationNotFound(String),
10338    /// <p>The specified stack set doesn't exist.</p>
10339    StackSetNotFound(String),
10340}
10341
10342impl DescribeStackSetOperationError {
10343    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<DescribeStackSetOperationError> {
10344        {
10345            let reader = EventReader::new(res.body.as_ref());
10346            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10347            find_start_element(&mut stack);
10348            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10349                match &parsed_error.code[..] {
10350                    "OperationNotFoundException" => {
10351                        return RusotoError::Service(
10352                            DescribeStackSetOperationError::OperationNotFound(parsed_error.message),
10353                        )
10354                    }
10355                    "StackSetNotFoundException" => {
10356                        return RusotoError::Service(
10357                            DescribeStackSetOperationError::StackSetNotFound(parsed_error.message),
10358                        )
10359                    }
10360                    _ => {}
10361                }
10362            }
10363        }
10364        RusotoError::Unknown(res)
10365    }
10366
10367    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10368    where
10369        T: Peek + Next,
10370    {
10371        xml_util::start_element("ErrorResponse", stack)?;
10372        XmlErrorDeserializer::deserialize("Error", stack)
10373    }
10374}
10375impl fmt::Display for DescribeStackSetOperationError {
10376    #[allow(unused_variables)]
10377    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10378        match *self {
10379            DescribeStackSetOperationError::OperationNotFound(ref cause) => write!(f, "{}", cause),
10380            DescribeStackSetOperationError::StackSetNotFound(ref cause) => write!(f, "{}", cause),
10381        }
10382    }
10383}
10384impl Error for DescribeStackSetOperationError {}
10385/// Errors returned by DescribeStacks
10386#[derive(Debug, PartialEq)]
10387pub enum DescribeStacksError {}
10388
10389impl DescribeStacksError {
10390    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<DescribeStacksError> {
10391        {
10392            let reader = EventReader::new(res.body.as_ref());
10393            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10394            find_start_element(&mut stack);
10395            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10396                match &parsed_error.code[..] {
10397                    _ => {}
10398                }
10399            }
10400        }
10401        RusotoError::Unknown(res)
10402    }
10403
10404    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10405    where
10406        T: Peek + Next,
10407    {
10408        xml_util::start_element("ErrorResponse", stack)?;
10409        XmlErrorDeserializer::deserialize("Error", stack)
10410    }
10411}
10412impl fmt::Display for DescribeStacksError {
10413    #[allow(unused_variables)]
10414    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10415        match *self {}
10416    }
10417}
10418impl Error for DescribeStacksError {}
10419/// Errors returned by DescribeType
10420#[derive(Debug, PartialEq)]
10421pub enum DescribeTypeError {
10422    /// <p>An error occurred during a CloudFormation registry operation.</p>
10423    CFNRegistry(String),
10424    /// <p>The specified type does not exist in the CloudFormation registry.</p>
10425    TypeNotFound(String),
10426}
10427
10428impl DescribeTypeError {
10429    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<DescribeTypeError> {
10430        {
10431            let reader = EventReader::new(res.body.as_ref());
10432            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10433            find_start_element(&mut stack);
10434            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10435                match &parsed_error.code[..] {
10436                    "CFNRegistryException" => {
10437                        return RusotoError::Service(DescribeTypeError::CFNRegistry(
10438                            parsed_error.message,
10439                        ))
10440                    }
10441                    "TypeNotFoundException" => {
10442                        return RusotoError::Service(DescribeTypeError::TypeNotFound(
10443                            parsed_error.message,
10444                        ))
10445                    }
10446                    _ => {}
10447                }
10448            }
10449        }
10450        RusotoError::Unknown(res)
10451    }
10452
10453    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10454    where
10455        T: Peek + Next,
10456    {
10457        xml_util::start_element("ErrorResponse", stack)?;
10458        XmlErrorDeserializer::deserialize("Error", stack)
10459    }
10460}
10461impl fmt::Display for DescribeTypeError {
10462    #[allow(unused_variables)]
10463    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10464        match *self {
10465            DescribeTypeError::CFNRegistry(ref cause) => write!(f, "{}", cause),
10466            DescribeTypeError::TypeNotFound(ref cause) => write!(f, "{}", cause),
10467        }
10468    }
10469}
10470impl Error for DescribeTypeError {}
10471/// Errors returned by DescribeTypeRegistration
10472#[derive(Debug, PartialEq)]
10473pub enum DescribeTypeRegistrationError {
10474    /// <p>An error occurred during a CloudFormation registry operation.</p>
10475    CFNRegistry(String),
10476}
10477
10478impl DescribeTypeRegistrationError {
10479    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<DescribeTypeRegistrationError> {
10480        {
10481            let reader = EventReader::new(res.body.as_ref());
10482            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10483            find_start_element(&mut stack);
10484            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10485                match &parsed_error.code[..] {
10486                    "CFNRegistryException" => {
10487                        return RusotoError::Service(DescribeTypeRegistrationError::CFNRegistry(
10488                            parsed_error.message,
10489                        ))
10490                    }
10491                    _ => {}
10492                }
10493            }
10494        }
10495        RusotoError::Unknown(res)
10496    }
10497
10498    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10499    where
10500        T: Peek + Next,
10501    {
10502        xml_util::start_element("ErrorResponse", stack)?;
10503        XmlErrorDeserializer::deserialize("Error", stack)
10504    }
10505}
10506impl fmt::Display for DescribeTypeRegistrationError {
10507    #[allow(unused_variables)]
10508    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10509        match *self {
10510            DescribeTypeRegistrationError::CFNRegistry(ref cause) => write!(f, "{}", cause),
10511        }
10512    }
10513}
10514impl Error for DescribeTypeRegistrationError {}
10515/// Errors returned by DetectStackDrift
10516#[derive(Debug, PartialEq)]
10517pub enum DetectStackDriftError {}
10518
10519impl DetectStackDriftError {
10520    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<DetectStackDriftError> {
10521        {
10522            let reader = EventReader::new(res.body.as_ref());
10523            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10524            find_start_element(&mut stack);
10525            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10526                match &parsed_error.code[..] {
10527                    _ => {}
10528                }
10529            }
10530        }
10531        RusotoError::Unknown(res)
10532    }
10533
10534    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10535    where
10536        T: Peek + Next,
10537    {
10538        xml_util::start_element("ErrorResponse", stack)?;
10539        XmlErrorDeserializer::deserialize("Error", stack)
10540    }
10541}
10542impl fmt::Display for DetectStackDriftError {
10543    #[allow(unused_variables)]
10544    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10545        match *self {}
10546    }
10547}
10548impl Error for DetectStackDriftError {}
10549/// Errors returned by DetectStackResourceDrift
10550#[derive(Debug, PartialEq)]
10551pub enum DetectStackResourceDriftError {}
10552
10553impl DetectStackResourceDriftError {
10554    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<DetectStackResourceDriftError> {
10555        {
10556            let reader = EventReader::new(res.body.as_ref());
10557            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10558            find_start_element(&mut stack);
10559            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10560                match &parsed_error.code[..] {
10561                    _ => {}
10562                }
10563            }
10564        }
10565        RusotoError::Unknown(res)
10566    }
10567
10568    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10569    where
10570        T: Peek + Next,
10571    {
10572        xml_util::start_element("ErrorResponse", stack)?;
10573        XmlErrorDeserializer::deserialize("Error", stack)
10574    }
10575}
10576impl fmt::Display for DetectStackResourceDriftError {
10577    #[allow(unused_variables)]
10578    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10579        match *self {}
10580    }
10581}
10582impl Error for DetectStackResourceDriftError {}
10583/// Errors returned by DetectStackSetDrift
10584#[derive(Debug, PartialEq)]
10585pub enum DetectStackSetDriftError {
10586    /// <p>The specified operation isn't valid.</p>
10587    InvalidOperation(String),
10588    /// <p>Another operation is currently in progress for this stack set. Only one operation can be performed for a stack set at a given time.</p>
10589    OperationInProgress(String),
10590    /// <p>The specified stack set doesn't exist.</p>
10591    StackSetNotFound(String),
10592}
10593
10594impl DetectStackSetDriftError {
10595    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<DetectStackSetDriftError> {
10596        {
10597            let reader = EventReader::new(res.body.as_ref());
10598            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10599            find_start_element(&mut stack);
10600            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10601                match &parsed_error.code[..] {
10602                    "InvalidOperationException" => {
10603                        return RusotoError::Service(DetectStackSetDriftError::InvalidOperation(
10604                            parsed_error.message,
10605                        ))
10606                    }
10607                    "OperationInProgressException" => {
10608                        return RusotoError::Service(DetectStackSetDriftError::OperationInProgress(
10609                            parsed_error.message,
10610                        ))
10611                    }
10612                    "StackSetNotFoundException" => {
10613                        return RusotoError::Service(DetectStackSetDriftError::StackSetNotFound(
10614                            parsed_error.message,
10615                        ))
10616                    }
10617                    _ => {}
10618                }
10619            }
10620        }
10621        RusotoError::Unknown(res)
10622    }
10623
10624    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10625    where
10626        T: Peek + Next,
10627    {
10628        xml_util::start_element("ErrorResponse", stack)?;
10629        XmlErrorDeserializer::deserialize("Error", stack)
10630    }
10631}
10632impl fmt::Display for DetectStackSetDriftError {
10633    #[allow(unused_variables)]
10634    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10635        match *self {
10636            DetectStackSetDriftError::InvalidOperation(ref cause) => write!(f, "{}", cause),
10637            DetectStackSetDriftError::OperationInProgress(ref cause) => write!(f, "{}", cause),
10638            DetectStackSetDriftError::StackSetNotFound(ref cause) => write!(f, "{}", cause),
10639        }
10640    }
10641}
10642impl Error for DetectStackSetDriftError {}
10643/// Errors returned by EstimateTemplateCost
10644#[derive(Debug, PartialEq)]
10645pub enum EstimateTemplateCostError {}
10646
10647impl EstimateTemplateCostError {
10648    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<EstimateTemplateCostError> {
10649        {
10650            let reader = EventReader::new(res.body.as_ref());
10651            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10652            find_start_element(&mut stack);
10653            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10654                match &parsed_error.code[..] {
10655                    _ => {}
10656                }
10657            }
10658        }
10659        RusotoError::Unknown(res)
10660    }
10661
10662    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10663    where
10664        T: Peek + Next,
10665    {
10666        xml_util::start_element("ErrorResponse", stack)?;
10667        XmlErrorDeserializer::deserialize("Error", stack)
10668    }
10669}
10670impl fmt::Display for EstimateTemplateCostError {
10671    #[allow(unused_variables)]
10672    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10673        match *self {}
10674    }
10675}
10676impl Error for EstimateTemplateCostError {}
10677/// Errors returned by ExecuteChangeSet
10678#[derive(Debug, PartialEq)]
10679pub enum ExecuteChangeSetError {
10680    /// <p>The specified change set name or ID doesn't exit. To view valid change sets for a stack, use the <code>ListChangeSets</code> action.</p>
10681    ChangeSetNotFound(String),
10682    /// <p>The template contains resources with capabilities that weren't specified in the Capabilities parameter.</p>
10683    InsufficientCapabilities(String),
10684    /// <p>The specified change set can't be used to update the stack. For example, the change set status might be <code>CREATE_IN_PROGRESS</code>, or the stack status might be <code>UPDATE_IN_PROGRESS</code>.</p>
10685    InvalidChangeSetStatus(String),
10686    /// <p>A client request token already exists.</p>
10687    TokenAlreadyExists(String),
10688}
10689
10690impl ExecuteChangeSetError {
10691    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<ExecuteChangeSetError> {
10692        {
10693            let reader = EventReader::new(res.body.as_ref());
10694            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10695            find_start_element(&mut stack);
10696            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10697                match &parsed_error.code[..] {
10698                    "ChangeSetNotFound" => {
10699                        return RusotoError::Service(ExecuteChangeSetError::ChangeSetNotFound(
10700                            parsed_error.message,
10701                        ))
10702                    }
10703                    "InsufficientCapabilitiesException" => {
10704                        return RusotoError::Service(
10705                            ExecuteChangeSetError::InsufficientCapabilities(parsed_error.message),
10706                        )
10707                    }
10708                    "InvalidChangeSetStatus" => {
10709                        return RusotoError::Service(ExecuteChangeSetError::InvalidChangeSetStatus(
10710                            parsed_error.message,
10711                        ))
10712                    }
10713                    "TokenAlreadyExistsException" => {
10714                        return RusotoError::Service(ExecuteChangeSetError::TokenAlreadyExists(
10715                            parsed_error.message,
10716                        ))
10717                    }
10718                    _ => {}
10719                }
10720            }
10721        }
10722        RusotoError::Unknown(res)
10723    }
10724
10725    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10726    where
10727        T: Peek + Next,
10728    {
10729        xml_util::start_element("ErrorResponse", stack)?;
10730        XmlErrorDeserializer::deserialize("Error", stack)
10731    }
10732}
10733impl fmt::Display for ExecuteChangeSetError {
10734    #[allow(unused_variables)]
10735    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10736        match *self {
10737            ExecuteChangeSetError::ChangeSetNotFound(ref cause) => write!(f, "{}", cause),
10738            ExecuteChangeSetError::InsufficientCapabilities(ref cause) => write!(f, "{}", cause),
10739            ExecuteChangeSetError::InvalidChangeSetStatus(ref cause) => write!(f, "{}", cause),
10740            ExecuteChangeSetError::TokenAlreadyExists(ref cause) => write!(f, "{}", cause),
10741        }
10742    }
10743}
10744impl Error for ExecuteChangeSetError {}
10745/// Errors returned by GetStackPolicy
10746#[derive(Debug, PartialEq)]
10747pub enum GetStackPolicyError {}
10748
10749impl GetStackPolicyError {
10750    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<GetStackPolicyError> {
10751        {
10752            let reader = EventReader::new(res.body.as_ref());
10753            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10754            find_start_element(&mut stack);
10755            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10756                match &parsed_error.code[..] {
10757                    _ => {}
10758                }
10759            }
10760        }
10761        RusotoError::Unknown(res)
10762    }
10763
10764    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10765    where
10766        T: Peek + Next,
10767    {
10768        xml_util::start_element("ErrorResponse", stack)?;
10769        XmlErrorDeserializer::deserialize("Error", stack)
10770    }
10771}
10772impl fmt::Display for GetStackPolicyError {
10773    #[allow(unused_variables)]
10774    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10775        match *self {}
10776    }
10777}
10778impl Error for GetStackPolicyError {}
10779/// Errors returned by GetTemplate
10780#[derive(Debug, PartialEq)]
10781pub enum GetTemplateError {
10782    /// <p>The specified change set name or ID doesn't exit. To view valid change sets for a stack, use the <code>ListChangeSets</code> action.</p>
10783    ChangeSetNotFound(String),
10784}
10785
10786impl GetTemplateError {
10787    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<GetTemplateError> {
10788        {
10789            let reader = EventReader::new(res.body.as_ref());
10790            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10791            find_start_element(&mut stack);
10792            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10793                match &parsed_error.code[..] {
10794                    "ChangeSetNotFound" => {
10795                        return RusotoError::Service(GetTemplateError::ChangeSetNotFound(
10796                            parsed_error.message,
10797                        ))
10798                    }
10799                    _ => {}
10800                }
10801            }
10802        }
10803        RusotoError::Unknown(res)
10804    }
10805
10806    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10807    where
10808        T: Peek + Next,
10809    {
10810        xml_util::start_element("ErrorResponse", stack)?;
10811        XmlErrorDeserializer::deserialize("Error", stack)
10812    }
10813}
10814impl fmt::Display for GetTemplateError {
10815    #[allow(unused_variables)]
10816    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10817        match *self {
10818            GetTemplateError::ChangeSetNotFound(ref cause) => write!(f, "{}", cause),
10819        }
10820    }
10821}
10822impl Error for GetTemplateError {}
10823/// Errors returned by GetTemplateSummary
10824#[derive(Debug, PartialEq)]
10825pub enum GetTemplateSummaryError {
10826    /// <p>The specified stack set doesn't exist.</p>
10827    StackSetNotFound(String),
10828}
10829
10830impl GetTemplateSummaryError {
10831    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<GetTemplateSummaryError> {
10832        {
10833            let reader = EventReader::new(res.body.as_ref());
10834            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10835            find_start_element(&mut stack);
10836            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10837                match &parsed_error.code[..] {
10838                    "StackSetNotFoundException" => {
10839                        return RusotoError::Service(GetTemplateSummaryError::StackSetNotFound(
10840                            parsed_error.message,
10841                        ))
10842                    }
10843                    _ => {}
10844                }
10845            }
10846        }
10847        RusotoError::Unknown(res)
10848    }
10849
10850    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10851    where
10852        T: Peek + Next,
10853    {
10854        xml_util::start_element("ErrorResponse", stack)?;
10855        XmlErrorDeserializer::deserialize("Error", stack)
10856    }
10857}
10858impl fmt::Display for GetTemplateSummaryError {
10859    #[allow(unused_variables)]
10860    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10861        match *self {
10862            GetTemplateSummaryError::StackSetNotFound(ref cause) => write!(f, "{}", cause),
10863        }
10864    }
10865}
10866impl Error for GetTemplateSummaryError {}
10867/// Errors returned by ListChangeSets
10868#[derive(Debug, PartialEq)]
10869pub enum ListChangeSetsError {}
10870
10871impl ListChangeSetsError {
10872    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<ListChangeSetsError> {
10873        {
10874            let reader = EventReader::new(res.body.as_ref());
10875            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10876            find_start_element(&mut stack);
10877            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10878                match &parsed_error.code[..] {
10879                    _ => {}
10880                }
10881            }
10882        }
10883        RusotoError::Unknown(res)
10884    }
10885
10886    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10887    where
10888        T: Peek + Next,
10889    {
10890        xml_util::start_element("ErrorResponse", stack)?;
10891        XmlErrorDeserializer::deserialize("Error", stack)
10892    }
10893}
10894impl fmt::Display for ListChangeSetsError {
10895    #[allow(unused_variables)]
10896    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10897        match *self {}
10898    }
10899}
10900impl Error for ListChangeSetsError {}
10901/// Errors returned by ListExports
10902#[derive(Debug, PartialEq)]
10903pub enum ListExportsError {}
10904
10905impl ListExportsError {
10906    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<ListExportsError> {
10907        {
10908            let reader = EventReader::new(res.body.as_ref());
10909            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10910            find_start_element(&mut stack);
10911            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10912                match &parsed_error.code[..] {
10913                    _ => {}
10914                }
10915            }
10916        }
10917        RusotoError::Unknown(res)
10918    }
10919
10920    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10921    where
10922        T: Peek + Next,
10923    {
10924        xml_util::start_element("ErrorResponse", stack)?;
10925        XmlErrorDeserializer::deserialize("Error", stack)
10926    }
10927}
10928impl fmt::Display for ListExportsError {
10929    #[allow(unused_variables)]
10930    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10931        match *self {}
10932    }
10933}
10934impl Error for ListExportsError {}
10935/// Errors returned by ListImports
10936#[derive(Debug, PartialEq)]
10937pub enum ListImportsError {}
10938
10939impl ListImportsError {
10940    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<ListImportsError> {
10941        {
10942            let reader = EventReader::new(res.body.as_ref());
10943            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10944            find_start_element(&mut stack);
10945            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10946                match &parsed_error.code[..] {
10947                    _ => {}
10948                }
10949            }
10950        }
10951        RusotoError::Unknown(res)
10952    }
10953
10954    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10955    where
10956        T: Peek + Next,
10957    {
10958        xml_util::start_element("ErrorResponse", stack)?;
10959        XmlErrorDeserializer::deserialize("Error", stack)
10960    }
10961}
10962impl fmt::Display for ListImportsError {
10963    #[allow(unused_variables)]
10964    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
10965        match *self {}
10966    }
10967}
10968impl Error for ListImportsError {}
10969/// Errors returned by ListStackInstances
10970#[derive(Debug, PartialEq)]
10971pub enum ListStackInstancesError {
10972    /// <p>The specified stack set doesn't exist.</p>
10973    StackSetNotFound(String),
10974}
10975
10976impl ListStackInstancesError {
10977    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<ListStackInstancesError> {
10978        {
10979            let reader = EventReader::new(res.body.as_ref());
10980            let mut stack = XmlResponse::new(reader.into_iter().peekable());
10981            find_start_element(&mut stack);
10982            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
10983                match &parsed_error.code[..] {
10984                    "StackSetNotFoundException" => {
10985                        return RusotoError::Service(ListStackInstancesError::StackSetNotFound(
10986                            parsed_error.message,
10987                        ))
10988                    }
10989                    _ => {}
10990                }
10991            }
10992        }
10993        RusotoError::Unknown(res)
10994    }
10995
10996    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
10997    where
10998        T: Peek + Next,
10999    {
11000        xml_util::start_element("ErrorResponse", stack)?;
11001        XmlErrorDeserializer::deserialize("Error", stack)
11002    }
11003}
11004impl fmt::Display for ListStackInstancesError {
11005    #[allow(unused_variables)]
11006    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
11007        match *self {
11008            ListStackInstancesError::StackSetNotFound(ref cause) => write!(f, "{}", cause),
11009        }
11010    }
11011}
11012impl Error for ListStackInstancesError {}
11013/// Errors returned by ListStackResources
11014#[derive(Debug, PartialEq)]
11015pub enum ListStackResourcesError {}
11016
11017impl ListStackResourcesError {
11018    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<ListStackResourcesError> {
11019        {
11020            let reader = EventReader::new(res.body.as_ref());
11021            let mut stack = XmlResponse::new(reader.into_iter().peekable());
11022            find_start_element(&mut stack);
11023            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
11024                match &parsed_error.code[..] {
11025                    _ => {}
11026                }
11027            }
11028        }
11029        RusotoError::Unknown(res)
11030    }
11031
11032    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
11033    where
11034        T: Peek + Next,
11035    {
11036        xml_util::start_element("ErrorResponse", stack)?;
11037        XmlErrorDeserializer::deserialize("Error", stack)
11038    }
11039}
11040impl fmt::Display for ListStackResourcesError {
11041    #[allow(unused_variables)]
11042    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
11043        match *self {}
11044    }
11045}
11046impl Error for ListStackResourcesError {}
11047/// Errors returned by ListStackSetOperationResults
11048#[derive(Debug, PartialEq)]
11049pub enum ListStackSetOperationResultsError {
11050    /// <p>The specified ID refers to an operation that doesn't exist.</p>
11051    OperationNotFound(String),
11052    /// <p>The specified stack set doesn't exist.</p>
11053    StackSetNotFound(String),
11054}
11055
11056impl ListStackSetOperationResultsError {
11057    pub fn from_response(
11058        res: BufferedHttpResponse,
11059    ) -> RusotoError<ListStackSetOperationResultsError> {
11060        {
11061            let reader = EventReader::new(res.body.as_ref());
11062            let mut stack = XmlResponse::new(reader.into_iter().peekable());
11063            find_start_element(&mut stack);
11064            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
11065                match &parsed_error.code[..] {
11066                    "OperationNotFoundException" => {
11067                        return RusotoError::Service(
11068                            ListStackSetOperationResultsError::OperationNotFound(
11069                                parsed_error.message,
11070                            ),
11071                        )
11072                    }
11073                    "StackSetNotFoundException" => {
11074                        return RusotoError::Service(
11075                            ListStackSetOperationResultsError::StackSetNotFound(
11076                                parsed_error.message,
11077                            ),
11078                        )
11079                    }
11080                    _ => {}
11081                }
11082            }
11083        }
11084        RusotoError::Unknown(res)
11085    }
11086
11087    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
11088    where
11089        T: Peek + Next,
11090    {
11091        xml_util::start_element("ErrorResponse", stack)?;
11092        XmlErrorDeserializer::deserialize("Error", stack)
11093    }
11094}
11095impl fmt::Display for ListStackSetOperationResultsError {
11096    #[allow(unused_variables)]
11097    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
11098        match *self {
11099            ListStackSetOperationResultsError::OperationNotFound(ref cause) => {
11100                write!(f, "{}", cause)
11101            }
11102            ListStackSetOperationResultsError::StackSetNotFound(ref cause) => {
11103                write!(f, "{}", cause)
11104            }
11105        }
11106    }
11107}
11108impl Error for ListStackSetOperationResultsError {}
11109/// Errors returned by ListStackSetOperations
11110#[derive(Debug, PartialEq)]
11111pub enum ListStackSetOperationsError {
11112    /// <p>The specified stack set doesn't exist.</p>
11113    StackSetNotFound(String),
11114}
11115
11116impl ListStackSetOperationsError {
11117    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<ListStackSetOperationsError> {
11118        {
11119            let reader = EventReader::new(res.body.as_ref());
11120            let mut stack = XmlResponse::new(reader.into_iter().peekable());
11121            find_start_element(&mut stack);
11122            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
11123                match &parsed_error.code[..] {
11124                    "StackSetNotFoundException" => {
11125                        return RusotoError::Service(ListStackSetOperationsError::StackSetNotFound(
11126                            parsed_error.message,
11127                        ))
11128                    }
11129                    _ => {}
11130                }
11131            }
11132        }
11133        RusotoError::Unknown(res)
11134    }
11135
11136    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
11137    where
11138        T: Peek + Next,
11139    {
11140        xml_util::start_element("ErrorResponse", stack)?;
11141        XmlErrorDeserializer::deserialize("Error", stack)
11142    }
11143}
11144impl fmt::Display for ListStackSetOperationsError {
11145    #[allow(unused_variables)]
11146    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
11147        match *self {
11148            ListStackSetOperationsError::StackSetNotFound(ref cause) => write!(f, "{}", cause),
11149        }
11150    }
11151}
11152impl Error for ListStackSetOperationsError {}
11153/// Errors returned by ListStackSets
11154#[derive(Debug, PartialEq)]
11155pub enum ListStackSetsError {}
11156
11157impl ListStackSetsError {
11158    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<ListStackSetsError> {
11159        {
11160            let reader = EventReader::new(res.body.as_ref());
11161            let mut stack = XmlResponse::new(reader.into_iter().peekable());
11162            find_start_element(&mut stack);
11163            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
11164                match &parsed_error.code[..] {
11165                    _ => {}
11166                }
11167            }
11168        }
11169        RusotoError::Unknown(res)
11170    }
11171
11172    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
11173    where
11174        T: Peek + Next,
11175    {
11176        xml_util::start_element("ErrorResponse", stack)?;
11177        XmlErrorDeserializer::deserialize("Error", stack)
11178    }
11179}
11180impl fmt::Display for ListStackSetsError {
11181    #[allow(unused_variables)]
11182    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
11183        match *self {}
11184    }
11185}
11186impl Error for ListStackSetsError {}
11187/// Errors returned by ListStacks
11188#[derive(Debug, PartialEq)]
11189pub enum ListStacksError {}
11190
11191impl ListStacksError {
11192    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<ListStacksError> {
11193        {
11194            let reader = EventReader::new(res.body.as_ref());
11195            let mut stack = XmlResponse::new(reader.into_iter().peekable());
11196            find_start_element(&mut stack);
11197            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
11198                match &parsed_error.code[..] {
11199                    _ => {}
11200                }
11201            }
11202        }
11203        RusotoError::Unknown(res)
11204    }
11205
11206    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
11207    where
11208        T: Peek + Next,
11209    {
11210        xml_util::start_element("ErrorResponse", stack)?;
11211        XmlErrorDeserializer::deserialize("Error", stack)
11212    }
11213}
11214impl fmt::Display for ListStacksError {
11215    #[allow(unused_variables)]
11216    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
11217        match *self {}
11218    }
11219}
11220impl Error for ListStacksError {}
11221/// Errors returned by ListTypeRegistrations
11222#[derive(Debug, PartialEq)]
11223pub enum ListTypeRegistrationsError {
11224    /// <p>An error occurred during a CloudFormation registry operation.</p>
11225    CFNRegistry(String),
11226}
11227
11228impl ListTypeRegistrationsError {
11229    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<ListTypeRegistrationsError> {
11230        {
11231            let reader = EventReader::new(res.body.as_ref());
11232            let mut stack = XmlResponse::new(reader.into_iter().peekable());
11233            find_start_element(&mut stack);
11234            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
11235                match &parsed_error.code[..] {
11236                    "CFNRegistryException" => {
11237                        return RusotoError::Service(ListTypeRegistrationsError::CFNRegistry(
11238                            parsed_error.message,
11239                        ))
11240                    }
11241                    _ => {}
11242                }
11243            }
11244        }
11245        RusotoError::Unknown(res)
11246    }
11247
11248    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
11249    where
11250        T: Peek + Next,
11251    {
11252        xml_util::start_element("ErrorResponse", stack)?;
11253        XmlErrorDeserializer::deserialize("Error", stack)
11254    }
11255}
11256impl fmt::Display for ListTypeRegistrationsError {
11257    #[allow(unused_variables)]
11258    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
11259        match *self {
11260            ListTypeRegistrationsError::CFNRegistry(ref cause) => write!(f, "{}", cause),
11261        }
11262    }
11263}
11264impl Error for ListTypeRegistrationsError {}
11265/// Errors returned by ListTypeVersions
11266#[derive(Debug, PartialEq)]
11267pub enum ListTypeVersionsError {
11268    /// <p>An error occurred during a CloudFormation registry operation.</p>
11269    CFNRegistry(String),
11270}
11271
11272impl ListTypeVersionsError {
11273    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<ListTypeVersionsError> {
11274        {
11275            let reader = EventReader::new(res.body.as_ref());
11276            let mut stack = XmlResponse::new(reader.into_iter().peekable());
11277            find_start_element(&mut stack);
11278            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
11279                match &parsed_error.code[..] {
11280                    "CFNRegistryException" => {
11281                        return RusotoError::Service(ListTypeVersionsError::CFNRegistry(
11282                            parsed_error.message,
11283                        ))
11284                    }
11285                    _ => {}
11286                }
11287            }
11288        }
11289        RusotoError::Unknown(res)
11290    }
11291
11292    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
11293    where
11294        T: Peek + Next,
11295    {
11296        xml_util::start_element("ErrorResponse", stack)?;
11297        XmlErrorDeserializer::deserialize("Error", stack)
11298    }
11299}
11300impl fmt::Display for ListTypeVersionsError {
11301    #[allow(unused_variables)]
11302    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
11303        match *self {
11304            ListTypeVersionsError::CFNRegistry(ref cause) => write!(f, "{}", cause),
11305        }
11306    }
11307}
11308impl Error for ListTypeVersionsError {}
11309/// Errors returned by ListTypes
11310#[derive(Debug, PartialEq)]
11311pub enum ListTypesError {
11312    /// <p>An error occurred during a CloudFormation registry operation.</p>
11313    CFNRegistry(String),
11314}
11315
11316impl ListTypesError {
11317    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<ListTypesError> {
11318        {
11319            let reader = EventReader::new(res.body.as_ref());
11320            let mut stack = XmlResponse::new(reader.into_iter().peekable());
11321            find_start_element(&mut stack);
11322            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
11323                match &parsed_error.code[..] {
11324                    "CFNRegistryException" => {
11325                        return RusotoError::Service(ListTypesError::CFNRegistry(
11326                            parsed_error.message,
11327                        ))
11328                    }
11329                    _ => {}
11330                }
11331            }
11332        }
11333        RusotoError::Unknown(res)
11334    }
11335
11336    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
11337    where
11338        T: Peek + Next,
11339    {
11340        xml_util::start_element("ErrorResponse", stack)?;
11341        XmlErrorDeserializer::deserialize("Error", stack)
11342    }
11343}
11344impl fmt::Display for ListTypesError {
11345    #[allow(unused_variables)]
11346    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
11347        match *self {
11348            ListTypesError::CFNRegistry(ref cause) => write!(f, "{}", cause),
11349        }
11350    }
11351}
11352impl Error for ListTypesError {}
11353/// Errors returned by RecordHandlerProgress
11354#[derive(Debug, PartialEq)]
11355pub enum RecordHandlerProgressError {
11356    /// <p>Error reserved for use by the <a href="https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/what-is-cloudformation-cli.html">CloudFormation CLI</a>. CloudFormation does not return this error to users.</p>
11357    InvalidStateTransition(String),
11358    /// <p>Error reserved for use by the <a href="https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/what-is-cloudformation-cli.html">CloudFormation CLI</a>. CloudFormation does not return this error to users.</p>
11359    OperationStatusCheckFailed(String),
11360}
11361
11362impl RecordHandlerProgressError {
11363    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<RecordHandlerProgressError> {
11364        {
11365            let reader = EventReader::new(res.body.as_ref());
11366            let mut stack = XmlResponse::new(reader.into_iter().peekable());
11367            find_start_element(&mut stack);
11368            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
11369                match &parsed_error.code[..] {
11370                    "InvalidStateTransition" => {
11371                        return RusotoError::Service(
11372                            RecordHandlerProgressError::InvalidStateTransition(
11373                                parsed_error.message,
11374                            ),
11375                        )
11376                    }
11377                    "ConditionalCheckFailed" => {
11378                        return RusotoError::Service(
11379                            RecordHandlerProgressError::OperationStatusCheckFailed(
11380                                parsed_error.message,
11381                            ),
11382                        )
11383                    }
11384                    _ => {}
11385                }
11386            }
11387        }
11388        RusotoError::Unknown(res)
11389    }
11390
11391    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
11392    where
11393        T: Peek + Next,
11394    {
11395        xml_util::start_element("ErrorResponse", stack)?;
11396        XmlErrorDeserializer::deserialize("Error", stack)
11397    }
11398}
11399impl fmt::Display for RecordHandlerProgressError {
11400    #[allow(unused_variables)]
11401    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
11402        match *self {
11403            RecordHandlerProgressError::InvalidStateTransition(ref cause) => write!(f, "{}", cause),
11404            RecordHandlerProgressError::OperationStatusCheckFailed(ref cause) => {
11405                write!(f, "{}", cause)
11406            }
11407        }
11408    }
11409}
11410impl Error for RecordHandlerProgressError {}
11411/// Errors returned by RegisterType
11412#[derive(Debug, PartialEq)]
11413pub enum RegisterTypeError {
11414    /// <p>An error occurred during a CloudFormation registry operation.</p>
11415    CFNRegistry(String),
11416}
11417
11418impl RegisterTypeError {
11419    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<RegisterTypeError> {
11420        {
11421            let reader = EventReader::new(res.body.as_ref());
11422            let mut stack = XmlResponse::new(reader.into_iter().peekable());
11423            find_start_element(&mut stack);
11424            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
11425                match &parsed_error.code[..] {
11426                    "CFNRegistryException" => {
11427                        return RusotoError::Service(RegisterTypeError::CFNRegistry(
11428                            parsed_error.message,
11429                        ))
11430                    }
11431                    _ => {}
11432                }
11433            }
11434        }
11435        RusotoError::Unknown(res)
11436    }
11437
11438    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
11439    where
11440        T: Peek + Next,
11441    {
11442        xml_util::start_element("ErrorResponse", stack)?;
11443        XmlErrorDeserializer::deserialize("Error", stack)
11444    }
11445}
11446impl fmt::Display for RegisterTypeError {
11447    #[allow(unused_variables)]
11448    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
11449        match *self {
11450            RegisterTypeError::CFNRegistry(ref cause) => write!(f, "{}", cause),
11451        }
11452    }
11453}
11454impl Error for RegisterTypeError {}
11455/// Errors returned by SetStackPolicy
11456#[derive(Debug, PartialEq)]
11457pub enum SetStackPolicyError {}
11458
11459impl SetStackPolicyError {
11460    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<SetStackPolicyError> {
11461        {
11462            let reader = EventReader::new(res.body.as_ref());
11463            let mut stack = XmlResponse::new(reader.into_iter().peekable());
11464            find_start_element(&mut stack);
11465            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
11466                match &parsed_error.code[..] {
11467                    _ => {}
11468                }
11469            }
11470        }
11471        RusotoError::Unknown(res)
11472    }
11473
11474    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
11475    where
11476        T: Peek + Next,
11477    {
11478        xml_util::start_element("ErrorResponse", stack)?;
11479        XmlErrorDeserializer::deserialize("Error", stack)
11480    }
11481}
11482impl fmt::Display for SetStackPolicyError {
11483    #[allow(unused_variables)]
11484    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
11485        match *self {}
11486    }
11487}
11488impl Error for SetStackPolicyError {}
11489/// Errors returned by SetTypeDefaultVersion
11490#[derive(Debug, PartialEq)]
11491pub enum SetTypeDefaultVersionError {
11492    /// <p>An error occurred during a CloudFormation registry operation.</p>
11493    CFNRegistry(String),
11494    /// <p>The specified type does not exist in the CloudFormation registry.</p>
11495    TypeNotFound(String),
11496}
11497
11498impl SetTypeDefaultVersionError {
11499    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<SetTypeDefaultVersionError> {
11500        {
11501            let reader = EventReader::new(res.body.as_ref());
11502            let mut stack = XmlResponse::new(reader.into_iter().peekable());
11503            find_start_element(&mut stack);
11504            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
11505                match &parsed_error.code[..] {
11506                    "CFNRegistryException" => {
11507                        return RusotoError::Service(SetTypeDefaultVersionError::CFNRegistry(
11508                            parsed_error.message,
11509                        ))
11510                    }
11511                    "TypeNotFoundException" => {
11512                        return RusotoError::Service(SetTypeDefaultVersionError::TypeNotFound(
11513                            parsed_error.message,
11514                        ))
11515                    }
11516                    _ => {}
11517                }
11518            }
11519        }
11520        RusotoError::Unknown(res)
11521    }
11522
11523    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
11524    where
11525        T: Peek + Next,
11526    {
11527        xml_util::start_element("ErrorResponse", stack)?;
11528        XmlErrorDeserializer::deserialize("Error", stack)
11529    }
11530}
11531impl fmt::Display for SetTypeDefaultVersionError {
11532    #[allow(unused_variables)]
11533    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
11534        match *self {
11535            SetTypeDefaultVersionError::CFNRegistry(ref cause) => write!(f, "{}", cause),
11536            SetTypeDefaultVersionError::TypeNotFound(ref cause) => write!(f, "{}", cause),
11537        }
11538    }
11539}
11540impl Error for SetTypeDefaultVersionError {}
11541/// Errors returned by SignalResource
11542#[derive(Debug, PartialEq)]
11543pub enum SignalResourceError {}
11544
11545impl SignalResourceError {
11546    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<SignalResourceError> {
11547        {
11548            let reader = EventReader::new(res.body.as_ref());
11549            let mut stack = XmlResponse::new(reader.into_iter().peekable());
11550            find_start_element(&mut stack);
11551            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
11552                match &parsed_error.code[..] {
11553                    _ => {}
11554                }
11555            }
11556        }
11557        RusotoError::Unknown(res)
11558    }
11559
11560    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
11561    where
11562        T: Peek + Next,
11563    {
11564        xml_util::start_element("ErrorResponse", stack)?;
11565        XmlErrorDeserializer::deserialize("Error", stack)
11566    }
11567}
11568impl fmt::Display for SignalResourceError {
11569    #[allow(unused_variables)]
11570    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
11571        match *self {}
11572    }
11573}
11574impl Error for SignalResourceError {}
11575/// Errors returned by StopStackSetOperation
11576#[derive(Debug, PartialEq)]
11577pub enum StopStackSetOperationError {
11578    /// <p>The specified operation isn't valid.</p>
11579    InvalidOperation(String),
11580    /// <p>The specified ID refers to an operation that doesn't exist.</p>
11581    OperationNotFound(String),
11582    /// <p>The specified stack set doesn't exist.</p>
11583    StackSetNotFound(String),
11584}
11585
11586impl StopStackSetOperationError {
11587    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<StopStackSetOperationError> {
11588        {
11589            let reader = EventReader::new(res.body.as_ref());
11590            let mut stack = XmlResponse::new(reader.into_iter().peekable());
11591            find_start_element(&mut stack);
11592            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
11593                match &parsed_error.code[..] {
11594                    "InvalidOperationException" => {
11595                        return RusotoError::Service(StopStackSetOperationError::InvalidOperation(
11596                            parsed_error.message,
11597                        ))
11598                    }
11599                    "OperationNotFoundException" => {
11600                        return RusotoError::Service(StopStackSetOperationError::OperationNotFound(
11601                            parsed_error.message,
11602                        ))
11603                    }
11604                    "StackSetNotFoundException" => {
11605                        return RusotoError::Service(StopStackSetOperationError::StackSetNotFound(
11606                            parsed_error.message,
11607                        ))
11608                    }
11609                    _ => {}
11610                }
11611            }
11612        }
11613        RusotoError::Unknown(res)
11614    }
11615
11616    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
11617    where
11618        T: Peek + Next,
11619    {
11620        xml_util::start_element("ErrorResponse", stack)?;
11621        XmlErrorDeserializer::deserialize("Error", stack)
11622    }
11623}
11624impl fmt::Display for StopStackSetOperationError {
11625    #[allow(unused_variables)]
11626    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
11627        match *self {
11628            StopStackSetOperationError::InvalidOperation(ref cause) => write!(f, "{}", cause),
11629            StopStackSetOperationError::OperationNotFound(ref cause) => write!(f, "{}", cause),
11630            StopStackSetOperationError::StackSetNotFound(ref cause) => write!(f, "{}", cause),
11631        }
11632    }
11633}
11634impl Error for StopStackSetOperationError {}
11635/// Errors returned by UpdateStack
11636#[derive(Debug, PartialEq)]
11637pub enum UpdateStackError {
11638    /// <p>The template contains resources with capabilities that weren't specified in the Capabilities parameter.</p>
11639    InsufficientCapabilities(String),
11640    /// <p>A client request token already exists.</p>
11641    TokenAlreadyExists(String),
11642}
11643
11644impl UpdateStackError {
11645    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<UpdateStackError> {
11646        {
11647            let reader = EventReader::new(res.body.as_ref());
11648            let mut stack = XmlResponse::new(reader.into_iter().peekable());
11649            find_start_element(&mut stack);
11650            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
11651                match &parsed_error.code[..] {
11652                    "InsufficientCapabilitiesException" => {
11653                        return RusotoError::Service(UpdateStackError::InsufficientCapabilities(
11654                            parsed_error.message,
11655                        ))
11656                    }
11657                    "TokenAlreadyExistsException" => {
11658                        return RusotoError::Service(UpdateStackError::TokenAlreadyExists(
11659                            parsed_error.message,
11660                        ))
11661                    }
11662                    _ => {}
11663                }
11664            }
11665        }
11666        RusotoError::Unknown(res)
11667    }
11668
11669    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
11670    where
11671        T: Peek + Next,
11672    {
11673        xml_util::start_element("ErrorResponse", stack)?;
11674        XmlErrorDeserializer::deserialize("Error", stack)
11675    }
11676}
11677impl fmt::Display for UpdateStackError {
11678    #[allow(unused_variables)]
11679    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
11680        match *self {
11681            UpdateStackError::InsufficientCapabilities(ref cause) => write!(f, "{}", cause),
11682            UpdateStackError::TokenAlreadyExists(ref cause) => write!(f, "{}", cause),
11683        }
11684    }
11685}
11686impl Error for UpdateStackError {}
11687/// Errors returned by UpdateStackInstances
11688#[derive(Debug, PartialEq)]
11689pub enum UpdateStackInstancesError {
11690    /// <p>The specified operation isn't valid.</p>
11691    InvalidOperation(String),
11692    /// <p>The specified operation ID already exists.</p>
11693    OperationIdAlreadyExists(String),
11694    /// <p>Another operation is currently in progress for this stack set. Only one operation can be performed for a stack set at a given time.</p>
11695    OperationInProgress(String),
11696    /// <p>The specified stack instance doesn't exist.</p>
11697    StackInstanceNotFound(String),
11698    /// <p>The specified stack set doesn't exist.</p>
11699    StackSetNotFound(String),
11700    /// <p>Another operation has been performed on this stack set since the specified operation was performed. </p>
11701    StaleRequest(String),
11702}
11703
11704impl UpdateStackInstancesError {
11705    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<UpdateStackInstancesError> {
11706        {
11707            let reader = EventReader::new(res.body.as_ref());
11708            let mut stack = XmlResponse::new(reader.into_iter().peekable());
11709            find_start_element(&mut stack);
11710            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
11711                match &parsed_error.code[..] {
11712                    "InvalidOperationException" => {
11713                        return RusotoError::Service(UpdateStackInstancesError::InvalidOperation(
11714                            parsed_error.message,
11715                        ))
11716                    }
11717                    "OperationIdAlreadyExistsException" => {
11718                        return RusotoError::Service(
11719                            UpdateStackInstancesError::OperationIdAlreadyExists(
11720                                parsed_error.message,
11721                            ),
11722                        )
11723                    }
11724                    "OperationInProgressException" => {
11725                        return RusotoError::Service(
11726                            UpdateStackInstancesError::OperationInProgress(parsed_error.message),
11727                        )
11728                    }
11729                    "StackInstanceNotFoundException" => {
11730                        return RusotoError::Service(
11731                            UpdateStackInstancesError::StackInstanceNotFound(parsed_error.message),
11732                        )
11733                    }
11734                    "StackSetNotFoundException" => {
11735                        return RusotoError::Service(UpdateStackInstancesError::StackSetNotFound(
11736                            parsed_error.message,
11737                        ))
11738                    }
11739                    "StaleRequestException" => {
11740                        return RusotoError::Service(UpdateStackInstancesError::StaleRequest(
11741                            parsed_error.message,
11742                        ))
11743                    }
11744                    _ => {}
11745                }
11746            }
11747        }
11748        RusotoError::Unknown(res)
11749    }
11750
11751    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
11752    where
11753        T: Peek + Next,
11754    {
11755        xml_util::start_element("ErrorResponse", stack)?;
11756        XmlErrorDeserializer::deserialize("Error", stack)
11757    }
11758}
11759impl fmt::Display for UpdateStackInstancesError {
11760    #[allow(unused_variables)]
11761    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
11762        match *self {
11763            UpdateStackInstancesError::InvalidOperation(ref cause) => write!(f, "{}", cause),
11764            UpdateStackInstancesError::OperationIdAlreadyExists(ref cause) => {
11765                write!(f, "{}", cause)
11766            }
11767            UpdateStackInstancesError::OperationInProgress(ref cause) => write!(f, "{}", cause),
11768            UpdateStackInstancesError::StackInstanceNotFound(ref cause) => write!(f, "{}", cause),
11769            UpdateStackInstancesError::StackSetNotFound(ref cause) => write!(f, "{}", cause),
11770            UpdateStackInstancesError::StaleRequest(ref cause) => write!(f, "{}", cause),
11771        }
11772    }
11773}
11774impl Error for UpdateStackInstancesError {}
11775/// Errors returned by UpdateStackSet
11776#[derive(Debug, PartialEq)]
11777pub enum UpdateStackSetError {
11778    /// <p>The specified operation isn't valid.</p>
11779    InvalidOperation(String),
11780    /// <p>The specified operation ID already exists.</p>
11781    OperationIdAlreadyExists(String),
11782    /// <p>Another operation is currently in progress for this stack set. Only one operation can be performed for a stack set at a given time.</p>
11783    OperationInProgress(String),
11784    /// <p>The specified stack instance doesn't exist.</p>
11785    StackInstanceNotFound(String),
11786    /// <p>The specified stack set doesn't exist.</p>
11787    StackSetNotFound(String),
11788    /// <p>Another operation has been performed on this stack set since the specified operation was performed. </p>
11789    StaleRequest(String),
11790}
11791
11792impl UpdateStackSetError {
11793    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<UpdateStackSetError> {
11794        {
11795            let reader = EventReader::new(res.body.as_ref());
11796            let mut stack = XmlResponse::new(reader.into_iter().peekable());
11797            find_start_element(&mut stack);
11798            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
11799                match &parsed_error.code[..] {
11800                    "InvalidOperationException" => {
11801                        return RusotoError::Service(UpdateStackSetError::InvalidOperation(
11802                            parsed_error.message,
11803                        ))
11804                    }
11805                    "OperationIdAlreadyExistsException" => {
11806                        return RusotoError::Service(UpdateStackSetError::OperationIdAlreadyExists(
11807                            parsed_error.message,
11808                        ))
11809                    }
11810                    "OperationInProgressException" => {
11811                        return RusotoError::Service(UpdateStackSetError::OperationInProgress(
11812                            parsed_error.message,
11813                        ))
11814                    }
11815                    "StackInstanceNotFoundException" => {
11816                        return RusotoError::Service(UpdateStackSetError::StackInstanceNotFound(
11817                            parsed_error.message,
11818                        ))
11819                    }
11820                    "StackSetNotFoundException" => {
11821                        return RusotoError::Service(UpdateStackSetError::StackSetNotFound(
11822                            parsed_error.message,
11823                        ))
11824                    }
11825                    "StaleRequestException" => {
11826                        return RusotoError::Service(UpdateStackSetError::StaleRequest(
11827                            parsed_error.message,
11828                        ))
11829                    }
11830                    _ => {}
11831                }
11832            }
11833        }
11834        RusotoError::Unknown(res)
11835    }
11836
11837    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
11838    where
11839        T: Peek + Next,
11840    {
11841        xml_util::start_element("ErrorResponse", stack)?;
11842        XmlErrorDeserializer::deserialize("Error", stack)
11843    }
11844}
11845impl fmt::Display for UpdateStackSetError {
11846    #[allow(unused_variables)]
11847    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
11848        match *self {
11849            UpdateStackSetError::InvalidOperation(ref cause) => write!(f, "{}", cause),
11850            UpdateStackSetError::OperationIdAlreadyExists(ref cause) => write!(f, "{}", cause),
11851            UpdateStackSetError::OperationInProgress(ref cause) => write!(f, "{}", cause),
11852            UpdateStackSetError::StackInstanceNotFound(ref cause) => write!(f, "{}", cause),
11853            UpdateStackSetError::StackSetNotFound(ref cause) => write!(f, "{}", cause),
11854            UpdateStackSetError::StaleRequest(ref cause) => write!(f, "{}", cause),
11855        }
11856    }
11857}
11858impl Error for UpdateStackSetError {}
11859/// Errors returned by UpdateTerminationProtection
11860#[derive(Debug, PartialEq)]
11861pub enum UpdateTerminationProtectionError {}
11862
11863impl UpdateTerminationProtectionError {
11864    pub fn from_response(
11865        res: BufferedHttpResponse,
11866    ) -> RusotoError<UpdateTerminationProtectionError> {
11867        {
11868            let reader = EventReader::new(res.body.as_ref());
11869            let mut stack = XmlResponse::new(reader.into_iter().peekable());
11870            find_start_element(&mut stack);
11871            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
11872                match &parsed_error.code[..] {
11873                    _ => {}
11874                }
11875            }
11876        }
11877        RusotoError::Unknown(res)
11878    }
11879
11880    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
11881    where
11882        T: Peek + Next,
11883    {
11884        xml_util::start_element("ErrorResponse", stack)?;
11885        XmlErrorDeserializer::deserialize("Error", stack)
11886    }
11887}
11888impl fmt::Display for UpdateTerminationProtectionError {
11889    #[allow(unused_variables)]
11890    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
11891        match *self {}
11892    }
11893}
11894impl Error for UpdateTerminationProtectionError {}
11895/// Errors returned by ValidateTemplate
11896#[derive(Debug, PartialEq)]
11897pub enum ValidateTemplateError {}
11898
11899impl ValidateTemplateError {
11900    pub fn from_response(res: BufferedHttpResponse) -> RusotoError<ValidateTemplateError> {
11901        {
11902            let reader = EventReader::new(res.body.as_ref());
11903            let mut stack = XmlResponse::new(reader.into_iter().peekable());
11904            find_start_element(&mut stack);
11905            if let Ok(parsed_error) = Self::deserialize(&mut stack) {
11906                match &parsed_error.code[..] {
11907                    _ => {}
11908                }
11909            }
11910        }
11911        RusotoError::Unknown(res)
11912    }
11913
11914    fn deserialize<T>(stack: &mut T) -> Result<XmlError, XmlParseError>
11915    where
11916        T: Peek + Next,
11917    {
11918        xml_util::start_element("ErrorResponse", stack)?;
11919        XmlErrorDeserializer::deserialize("Error", stack)
11920    }
11921}
11922impl fmt::Display for ValidateTemplateError {
11923    #[allow(unused_variables)]
11924    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
11925        match *self {}
11926    }
11927}
11928impl Error for ValidateTemplateError {}
11929/// Trait representing the capabilities of the AWS CloudFormation API. AWS CloudFormation clients implement this trait.
11930#[async_trait]
11931pub trait CloudFormation {
11932    /// <p><p>Cancels an update on the specified stack. If the call completes successfully, the stack rolls back the update and reverts to the previous stack configuration.</p> <note> <p>You can cancel only stacks that are in the UPDATE<em>IN</em>PROGRESS state.</p> </note></p>
11933    async fn cancel_update_stack(
11934        &self,
11935        input: CancelUpdateStackInput,
11936    ) -> Result<(), RusotoError<CancelUpdateStackError>>;
11937
11938    /// <p>For a specified stack that is in the <code>UPDATE_ROLLBACK_FAILED</code> state, continues rolling it back to the <code>UPDATE_ROLLBACK_COMPLETE</code> state. Depending on the cause of the failure, you can manually <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/troubleshooting.html#troubleshooting-errors-update-rollback-failed"> fix the error</a> and continue the rollback. By continuing the rollback, you can return your stack to a working state (the <code>UPDATE_ROLLBACK_COMPLETE</code> state), and then try to update the stack again.</p> <p>A stack goes into the <code>UPDATE_ROLLBACK_FAILED</code> state when AWS CloudFormation cannot roll back all changes after a failed stack update. For example, you might have a stack that is rolling back to an old database instance that was deleted outside of AWS CloudFormation. Because AWS CloudFormation doesn't know the database was deleted, it assumes that the database instance still exists and attempts to roll back to it, causing the update rollback to fail.</p>
11939    async fn continue_update_rollback(
11940        &self,
11941        input: ContinueUpdateRollbackInput,
11942    ) -> Result<ContinueUpdateRollbackOutput, RusotoError<ContinueUpdateRollbackError>>;
11943
11944    /// <p>Creates a list of changes that will be applied to a stack so that you can review the changes before executing them. You can create a change set for a stack that doesn't exist or an existing stack. If you create a change set for a stack that doesn't exist, the change set shows all of the resources that AWS CloudFormation will create. If you create a change set for an existing stack, AWS CloudFormation compares the stack's information with the information that you submit in the change set and lists the differences. Use change sets to understand which resources AWS CloudFormation will create or change, and how it will change resources in an existing stack, before you create or update a stack.</p> <p>To create a change set for a stack that doesn't exist, for the <code>ChangeSetType</code> parameter, specify <code>CREATE</code>. To create a change set for an existing stack, specify <code>UPDATE</code> for the <code>ChangeSetType</code> parameter. To create a change set for an import operation, specify <code>IMPORT</code> for the <code>ChangeSetType</code> parameter. After the <code>CreateChangeSet</code> call successfully completes, AWS CloudFormation starts creating the change set. To check the status of the change set or to review it, use the <a>DescribeChangeSet</a> action.</p> <p>When you are satisfied with the changes the change set will make, execute the change set by using the <a>ExecuteChangeSet</a> action. AWS CloudFormation doesn't make changes until you execute the change set.</p>
11945    async fn create_change_set(
11946        &self,
11947        input: CreateChangeSetInput,
11948    ) -> Result<CreateChangeSetOutput, RusotoError<CreateChangeSetError>>;
11949
11950    /// <p>Creates a stack as specified in the template. After the call completes successfully, the stack creation starts. You can check the status of the stack via the <a>DescribeStacks</a> API.</p>
11951    async fn create_stack(
11952        &self,
11953        input: CreateStackInput,
11954    ) -> Result<CreateStackOutput, RusotoError<CreateStackError>>;
11955
11956    /// <p>Creates stack instances for the specified accounts, within the specified Regions. A stack instance refers to a stack in a specific account and Region. You must specify at least one value for either <code>Accounts</code> or <code>DeploymentTargets</code>, and you must specify at least one value for <code>Regions</code>.</p>
11957    async fn create_stack_instances(
11958        &self,
11959        input: CreateStackInstancesInput,
11960    ) -> Result<CreateStackInstancesOutput, RusotoError<CreateStackInstancesError>>;
11961
11962    /// <p>Creates a stack set.</p>
11963    async fn create_stack_set(
11964        &self,
11965        input: CreateStackSetInput,
11966    ) -> Result<CreateStackSetOutput, RusotoError<CreateStackSetError>>;
11967
11968    /// <p>Deletes the specified change set. Deleting change sets ensures that no one executes the wrong change set.</p> <p>If the call successfully completes, AWS CloudFormation successfully deleted the change set.</p>
11969    async fn delete_change_set(
11970        &self,
11971        input: DeleteChangeSetInput,
11972    ) -> Result<DeleteChangeSetOutput, RusotoError<DeleteChangeSetError>>;
11973
11974    /// <p>Deletes a specified stack. Once the call completes successfully, stack deletion starts. Deleted stacks do not show up in the <a>DescribeStacks</a> API if the deletion has been completed successfully.</p>
11975    async fn delete_stack(
11976        &self,
11977        input: DeleteStackInput,
11978    ) -> Result<(), RusotoError<DeleteStackError>>;
11979
11980    /// <p>Deletes stack instances for the specified accounts, in the specified Regions. </p>
11981    async fn delete_stack_instances(
11982        &self,
11983        input: DeleteStackInstancesInput,
11984    ) -> Result<DeleteStackInstancesOutput, RusotoError<DeleteStackInstancesError>>;
11985
11986    /// <p>Deletes a stack set. Before you can delete a stack set, all of its member stack instances must be deleted. For more information about how to do this, see <a>DeleteStackInstances</a>. </p>
11987    async fn delete_stack_set(
11988        &self,
11989        input: DeleteStackSetInput,
11990    ) -> Result<DeleteStackSetOutput, RusotoError<DeleteStackSetError>>;
11991
11992    /// <p>Removes a type or type version from active use in the CloudFormation registry. If a type or type version is deregistered, it cannot be used in CloudFormation operations.</p> <p>To deregister a type, you must individually deregister all registered versions of that type. If a type has only a single registered version, deregistering that version results in the type itself being deregistered. </p> <p>You cannot deregister the default version of a type, unless it is the only registered version of that type, in which case the type itself is deregistered as well. </p>
11993    async fn deregister_type(
11994        &self,
11995        input: DeregisterTypeInput,
11996    ) -> Result<DeregisterTypeOutput, RusotoError<DeregisterTypeError>>;
11997
11998    /// <p>Retrieves your account's AWS CloudFormation limits, such as the maximum number of stacks that you can create in your account. For more information about account limits, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html">AWS CloudFormation Limits</a> in the <i>AWS CloudFormation User Guide</i>.</p>
11999    async fn describe_account_limits(
12000        &self,
12001        input: DescribeAccountLimitsInput,
12002    ) -> Result<DescribeAccountLimitsOutput, RusotoError<DescribeAccountLimitsError>>;
12003
12004    /// <p>Returns the inputs for the change set and a list of changes that AWS CloudFormation will make if you execute the change set. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-changesets.html">Updating Stacks Using Change Sets</a> in the AWS CloudFormation User Guide.</p>
12005    async fn describe_change_set(
12006        &self,
12007        input: DescribeChangeSetInput,
12008    ) -> Result<DescribeChangeSetOutput, RusotoError<DescribeChangeSetError>>;
12009
12010    /// <p>Returns information about a stack drift detection operation. A stack drift detection operation detects whether a stack's actual configuration differs, or has <i>drifted</i>, from it's expected configuration, as defined in the stack template and any values specified as template parameters. A stack is considered to have drifted if one or more of its resources have drifted. For more information on stack and resource drift, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html">Detecting Unregulated Configuration Changes to Stacks and Resources</a>.</p> <p>Use <a>DetectStackDrift</a> to initiate a stack drift detection operation. <code>DetectStackDrift</code> returns a <code>StackDriftDetectionId</code> you can use to monitor the progress of the operation using <code>DescribeStackDriftDetectionStatus</code>. Once the drift detection operation has completed, use <a>DescribeStackResourceDrifts</a> to return drift information about the stack and its resources.</p>
12011    async fn describe_stack_drift_detection_status(
12012        &self,
12013        input: DescribeStackDriftDetectionStatusInput,
12014    ) -> Result<
12015        DescribeStackDriftDetectionStatusOutput,
12016        RusotoError<DescribeStackDriftDetectionStatusError>,
12017    >;
12018
12019    /// <p><p>Returns all stack related events for a specified stack in reverse chronological order. For more information about a stack&#39;s event history, go to <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/concept-stack.html">Stacks</a> in the AWS CloudFormation User Guide.</p> <note> <p>You can list events for stacks that have failed to create or have been deleted by specifying the unique stack identifier (stack ID).</p> </note></p>
12020    async fn describe_stack_events(
12021        &self,
12022        input: DescribeStackEventsInput,
12023    ) -> Result<DescribeStackEventsOutput, RusotoError<DescribeStackEventsError>>;
12024
12025    /// <p>Returns the stack instance that's associated with the specified stack set, AWS account, and Region.</p> <p>For a list of stack instances that are associated with a specific stack set, use <a>ListStackInstances</a>.</p>
12026    async fn describe_stack_instance(
12027        &self,
12028        input: DescribeStackInstanceInput,
12029    ) -> Result<DescribeStackInstanceOutput, RusotoError<DescribeStackInstanceError>>;
12030
12031    /// <p>Returns a description of the specified resource in the specified stack.</p> <p>For deleted stacks, DescribeStackResource returns resource information for up to 90 days after the stack has been deleted.</p>
12032    async fn describe_stack_resource(
12033        &self,
12034        input: DescribeStackResourceInput,
12035    ) -> Result<DescribeStackResourceOutput, RusotoError<DescribeStackResourceError>>;
12036
12037    /// <p>Returns drift information for the resources that have been checked for drift in the specified stack. This includes actual and expected configuration values for resources where AWS CloudFormation detects configuration drift.</p> <p>For a given stack, there will be one <code>StackResourceDrift</code> for each stack resource that has been checked for drift. Resources that have not yet been checked for drift are not included. Resources that do not currently support drift detection are not checked, and so not included. For a list of resources that support drift detection, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift-resource-list.html">Resources that Support Drift Detection</a>.</p> <p>Use <a>DetectStackResourceDrift</a> to detect drift on individual resources, or <a>DetectStackDrift</a> to detect drift on all supported resources for a given stack.</p>
12038    async fn describe_stack_resource_drifts(
12039        &self,
12040        input: DescribeStackResourceDriftsInput,
12041    ) -> Result<DescribeStackResourceDriftsOutput, RusotoError<DescribeStackResourceDriftsError>>;
12042
12043    /// <p><p>Returns AWS resource descriptions for running and deleted stacks. If <code>StackName</code> is specified, all the associated resources that are part of the stack are returned. If <code>PhysicalResourceId</code> is specified, the associated resources of the stack that the resource belongs to are returned.</p> <note> <p>Only the first 100 resources will be returned. If your stack has more resources than this, you should use <code>ListStackResources</code> instead.</p> </note> <p>For deleted stacks, <code>DescribeStackResources</code> returns resource information for up to 90 days after the stack has been deleted.</p> <p>You must specify either <code>StackName</code> or <code>PhysicalResourceId</code>, but not both. In addition, you can specify <code>LogicalResourceId</code> to filter the returned result. For more information about resources, the <code>LogicalResourceId</code> and <code>PhysicalResourceId</code>, go to the <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/">AWS CloudFormation User Guide</a>.</p> <note> <p>A <code>ValidationError</code> is returned if you specify both <code>StackName</code> and <code>PhysicalResourceId</code> in the same request.</p> </note></p>
12044    async fn describe_stack_resources(
12045        &self,
12046        input: DescribeStackResourcesInput,
12047    ) -> Result<DescribeStackResourcesOutput, RusotoError<DescribeStackResourcesError>>;
12048
12049    /// <p>Returns the description of the specified stack set. </p>
12050    async fn describe_stack_set(
12051        &self,
12052        input: DescribeStackSetInput,
12053    ) -> Result<DescribeStackSetOutput, RusotoError<DescribeStackSetError>>;
12054
12055    /// <p>Returns the description of the specified stack set operation. </p>
12056    async fn describe_stack_set_operation(
12057        &self,
12058        input: DescribeStackSetOperationInput,
12059    ) -> Result<DescribeStackSetOperationOutput, RusotoError<DescribeStackSetOperationError>>;
12060
12061    /// <p><p>Returns the description for the specified stack; if no stack name was specified, then it returns the description for all the stacks created.</p> <note> <p>If the stack does not exist, an <code>AmazonCloudFormationException</code> is returned.</p> </note></p>
12062    async fn describe_stacks(
12063        &self,
12064        input: DescribeStacksInput,
12065    ) -> Result<DescribeStacksOutput, RusotoError<DescribeStacksError>>;
12066
12067    /// <p>Returns detailed information about a type that has been registered.</p> <p>If you specify a <code>VersionId</code>, <code>DescribeType</code> returns information about that specific type version. Otherwise, it returns information about the default type version.</p>
12068    async fn describe_type(
12069        &self,
12070        input: DescribeTypeInput,
12071    ) -> Result<DescribeTypeOutput, RusotoError<DescribeTypeError>>;
12072
12073    /// <p>Returns information about a type's registration, including its current status and type and version identifiers.</p> <p>When you initiate a registration request using <code> <a>RegisterType</a> </code>, you can then use <code> <a>DescribeTypeRegistration</a> </code> to monitor the progress of that registration request.</p> <p>Once the registration request has completed, use <code> <a>DescribeType</a> </code> to return detailed informaiton about a type.</p>
12074    async fn describe_type_registration(
12075        &self,
12076        input: DescribeTypeRegistrationInput,
12077    ) -> Result<DescribeTypeRegistrationOutput, RusotoError<DescribeTypeRegistrationError>>;
12078
12079    /// <p>Detects whether a stack's actual configuration differs, or has <i>drifted</i>, from it's expected configuration, as defined in the stack template and any values specified as template parameters. For each resource in the stack that supports drift detection, AWS CloudFormation compares the actual configuration of the resource with its expected template configuration. Only resource properties explicitly defined in the stack template are checked for drift. A stack is considered to have drifted if one or more of its resources differ from their expected template configurations. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html">Detecting Unregulated Configuration Changes to Stacks and Resources</a>.</p> <p>Use <code>DetectStackDrift</code> to detect drift on all supported resources for a given stack, or <a>DetectStackResourceDrift</a> to detect drift on individual resources.</p> <p>For a list of stack resources that currently support drift detection, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift-resource-list.html">Resources that Support Drift Detection</a>.</p> <p> <code>DetectStackDrift</code> can take up to several minutes, depending on the number of resources contained within the stack. Use <a>DescribeStackDriftDetectionStatus</a> to monitor the progress of a detect stack drift operation. Once the drift detection operation has completed, use <a>DescribeStackResourceDrifts</a> to return drift information about the stack and its resources.</p> <p>When detecting drift on a stack, AWS CloudFormation does not detect drift on any nested stacks belonging to that stack. Perform <code>DetectStackDrift</code> directly on the nested stack itself.</p>
12080    async fn detect_stack_drift(
12081        &self,
12082        input: DetectStackDriftInput,
12083    ) -> Result<DetectStackDriftOutput, RusotoError<DetectStackDriftError>>;
12084
12085    /// <p>Returns information about whether a resource's actual configuration differs, or has <i>drifted</i>, from it's expected configuration, as defined in the stack template and any values specified as template parameters. This information includes actual and expected property values for resources in which AWS CloudFormation detects drift. Only resource properties explicitly defined in the stack template are checked for drift. For more information about stack and resource drift, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html">Detecting Unregulated Configuration Changes to Stacks and Resources</a>.</p> <p>Use <code>DetectStackResourceDrift</code> to detect drift on individual resources, or <a>DetectStackDrift</a> to detect drift on all resources in a given stack that support drift detection.</p> <p>Resources that do not currently support drift detection cannot be checked. For a list of resources that support drift detection, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift-resource-list.html">Resources that Support Drift Detection</a>.</p>
12086    async fn detect_stack_resource_drift(
12087        &self,
12088        input: DetectStackResourceDriftInput,
12089    ) -> Result<DetectStackResourceDriftOutput, RusotoError<DetectStackResourceDriftError>>;
12090
12091    /// <p>Detect drift on a stack set. When CloudFormation performs drift detection on a stack set, it performs drift detection on the stack associated with each stack instance in the stack set. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-drift.html">How CloudFormation Performs Drift Detection on a Stack Set</a>.</p> <p> <code>DetectStackSetDrift</code> returns the <code>OperationId</code> of the stack set drift detection operation. Use this operation id with <code> <a>DescribeStackSetOperation</a> </code> to monitor the progress of the drift detection operation. The drift detection operation may take some time, depending on the number of stack instances included in the stack set, as well as the number of resources included in each stack.</p> <p>Once the operation has completed, use the following actions to return drift information:</p> <ul> <li> <p>Use <code> <a>DescribeStackSet</a> </code> to return detailed informaiton about the stack set, including detailed information about the last <i>completed</i> drift operation performed on the stack set. (Information about drift operations that are in progress is not included.)</p> </li> <li> <p>Use <code> <a>ListStackInstances</a> </code> to return a list of stack instances belonging to the stack set, including the drift status and last drift time checked of each instance.</p> </li> <li> <p>Use <code> <a>DescribeStackInstance</a> </code> to return detailed information about a specific stack instance, including its drift status and last drift time checked.</p> </li> </ul> <p>For more information on performing a drift detection operation on a stack set, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-drift.html">Detecting Unmanaged Changes in Stack Sets</a>. </p> <p>You can only run a single drift detection operation on a given stack set at one time. </p> <p>To stop a drift detection stack set operation, use <code> <a>StopStackSetOperation</a> </code>.</p>
12092    async fn detect_stack_set_drift(
12093        &self,
12094        input: DetectStackSetDriftInput,
12095    ) -> Result<DetectStackSetDriftOutput, RusotoError<DetectStackSetDriftError>>;
12096
12097    /// <p>Returns the estimated monthly cost of a template. The return value is an AWS Simple Monthly Calculator URL with a query string that describes the resources required to run the template.</p>
12098    async fn estimate_template_cost(
12099        &self,
12100        input: EstimateTemplateCostInput,
12101    ) -> Result<EstimateTemplateCostOutput, RusotoError<EstimateTemplateCostError>>;
12102
12103    /// <p>Updates a stack using the input information that was provided when the specified change set was created. After the call successfully completes, AWS CloudFormation starts updating the stack. Use the <a>DescribeStacks</a> action to view the status of the update.</p> <p>When you execute a change set, AWS CloudFormation deletes all other change sets associated with the stack because they aren't valid for the updated stack.</p> <p>If a stack policy is associated with the stack, AWS CloudFormation enforces the policy during the update. You can't specify a temporary stack policy that overrides the current policy.</p>
12104    async fn execute_change_set(
12105        &self,
12106        input: ExecuteChangeSetInput,
12107    ) -> Result<ExecuteChangeSetOutput, RusotoError<ExecuteChangeSetError>>;
12108
12109    /// <p>Returns the stack policy for a specified stack. If a stack doesn't have a policy, a null value is returned.</p>
12110    async fn get_stack_policy(
12111        &self,
12112        input: GetStackPolicyInput,
12113    ) -> Result<GetStackPolicyOutput, RusotoError<GetStackPolicyError>>;
12114
12115    /// <p><p>Returns the template body for a specified stack. You can get the template for running or deleted stacks.</p> <p>For deleted stacks, GetTemplate returns the template for up to 90 days after the stack has been deleted.</p> <note> <p> If the template does not exist, a <code>ValidationError</code> is returned. </p> </note></p>
12116    async fn get_template(
12117        &self,
12118        input: GetTemplateInput,
12119    ) -> Result<GetTemplateOutput, RusotoError<GetTemplateError>>;
12120
12121    /// <p>Returns information about a new or existing template. The <code>GetTemplateSummary</code> action is useful for viewing parameter information, such as default parameter values and parameter types, before you create or update a stack or stack set.</p> <p>You can use the <code>GetTemplateSummary</code> action when you submit a template, or you can get template information for a stack set, or a running or deleted stack.</p> <p>For deleted stacks, <code>GetTemplateSummary</code> returns the template information for up to 90 days after the stack has been deleted. If the template does not exist, a <code>ValidationError</code> is returned.</p>
12122    async fn get_template_summary(
12123        &self,
12124        input: GetTemplateSummaryInput,
12125    ) -> Result<GetTemplateSummaryOutput, RusotoError<GetTemplateSummaryError>>;
12126
12127    /// <p>Returns the ID and status of each active change set for a stack. For example, AWS CloudFormation lists change sets that are in the <code>CREATE_IN_PROGRESS</code> or <code>CREATE_PENDING</code> state.</p>
12128    async fn list_change_sets(
12129        &self,
12130        input: ListChangeSetsInput,
12131    ) -> Result<ListChangeSetsOutput, RusotoError<ListChangeSetsError>>;
12132
12133    /// <p>Lists all exported output values in the account and Region in which you call this action. Use this action to see the exported output values that you can import into other stacks. To import values, use the <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html"> <code>Fn::ImportValue</code> </a> function. </p> <p>For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-exports.html"> AWS CloudFormation Export Stack Output Values</a>.</p>
12134    async fn list_exports(
12135        &self,
12136        input: ListExportsInput,
12137    ) -> Result<ListExportsOutput, RusotoError<ListExportsError>>;
12138
12139    /// <p>Lists all stacks that are importing an exported output value. To modify or remove an exported output value, first use this action to see which stacks are using it. To see the exported output values in your account, see <a>ListExports</a>. </p> <p>For more information about importing an exported output value, see the <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html"> <code>Fn::ImportValue</code> </a> function. </p>
12140    async fn list_imports(
12141        &self,
12142        input: ListImportsInput,
12143    ) -> Result<ListImportsOutput, RusotoError<ListImportsError>>;
12144
12145    /// <p>Returns summary information about stack instances that are associated with the specified stack set. You can filter for stack instances that are associated with a specific AWS account name or Region, or that have a specific status.</p>
12146    async fn list_stack_instances(
12147        &self,
12148        input: ListStackInstancesInput,
12149    ) -> Result<ListStackInstancesOutput, RusotoError<ListStackInstancesError>>;
12150
12151    /// <p>Returns descriptions of all resources of the specified stack.</p> <p>For deleted stacks, ListStackResources returns resource information for up to 90 days after the stack has been deleted.</p>
12152    async fn list_stack_resources(
12153        &self,
12154        input: ListStackResourcesInput,
12155    ) -> Result<ListStackResourcesOutput, RusotoError<ListStackResourcesError>>;
12156
12157    /// <p>Returns summary information about the results of a stack set operation. </p>
12158    async fn list_stack_set_operation_results(
12159        &self,
12160        input: ListStackSetOperationResultsInput,
12161    ) -> Result<ListStackSetOperationResultsOutput, RusotoError<ListStackSetOperationResultsError>>;
12162
12163    /// <p>Returns summary information about operations performed on a stack set. </p>
12164    async fn list_stack_set_operations(
12165        &self,
12166        input: ListStackSetOperationsInput,
12167    ) -> Result<ListStackSetOperationsOutput, RusotoError<ListStackSetOperationsError>>;
12168
12169    /// <p>Returns summary information about stack sets that are associated with the user.</p>
12170    async fn list_stack_sets(
12171        &self,
12172        input: ListStackSetsInput,
12173    ) -> Result<ListStackSetsOutput, RusotoError<ListStackSetsError>>;
12174
12175    /// <p>Returns the summary information for stacks whose status matches the specified StackStatusFilter. Summary information for stacks that have been deleted is kept for 90 days after the stack is deleted. If no StackStatusFilter is specified, summary information for all stacks is returned (including existing stacks and stacks that have been deleted).</p>
12176    async fn list_stacks(
12177        &self,
12178        input: ListStacksInput,
12179    ) -> Result<ListStacksOutput, RusotoError<ListStacksError>>;
12180
12181    /// <p>Returns a list of registration tokens for the specified type(s).</p>
12182    async fn list_type_registrations(
12183        &self,
12184        input: ListTypeRegistrationsInput,
12185    ) -> Result<ListTypeRegistrationsOutput, RusotoError<ListTypeRegistrationsError>>;
12186
12187    /// <p>Returns summary information about the versions of a type.</p>
12188    async fn list_type_versions(
12189        &self,
12190        input: ListTypeVersionsInput,
12191    ) -> Result<ListTypeVersionsOutput, RusotoError<ListTypeVersionsError>>;
12192
12193    /// <p>Returns summary information about types that have been registered with CloudFormation.</p>
12194    async fn list_types(
12195        &self,
12196        input: ListTypesInput,
12197    ) -> Result<ListTypesOutput, RusotoError<ListTypesError>>;
12198
12199    /// <p>Reports progress of a resource handler to CloudFormation.</p> <p>Reserved for use by the <a href="https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/what-is-cloudformation-cli.html">CloudFormation CLI</a>. Do not use this API in your code.</p>
12200    async fn record_handler_progress(
12201        &self,
12202        input: RecordHandlerProgressInput,
12203    ) -> Result<RecordHandlerProgressOutput, RusotoError<RecordHandlerProgressError>>;
12204
12205    /// <p>Registers a type with the CloudFormation service. Registering a type makes it available for use in CloudFormation templates in your AWS account, and includes:</p> <ul> <li> <p>Validating the resource schema</p> </li> <li> <p>Determining which handlers have been specified for the resource</p> </li> <li> <p>Making the resource type available for use in your account</p> </li> </ul> <p>For more information on how to develop types and ready them for registeration, see <a href="https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/resource-types.html">Creating Resource Providers</a> in the <i>CloudFormation CLI User Guide</i>.</p> <p>You can have a maximum of 50 resource type versions registered at a time. This maximum is per account and per region. Use <a href="AWSCloudFormation/latest/APIReference/API_DeregisterType.html">DeregisterType</a> to deregister specific resource type versions if necessary.</p> <p>Once you have initiated a registration request using <code> <a>RegisterType</a> </code>, you can use <code> <a>DescribeTypeRegistration</a> </code> to monitor the progress of the registration request.</p>
12206    async fn register_type(
12207        &self,
12208        input: RegisterTypeInput,
12209    ) -> Result<RegisterTypeOutput, RusotoError<RegisterTypeError>>;
12210
12211    /// <p>Sets a stack policy for a specified stack.</p>
12212    async fn set_stack_policy(
12213        &self,
12214        input: SetStackPolicyInput,
12215    ) -> Result<(), RusotoError<SetStackPolicyError>>;
12216
12217    /// <p>Specify the default version of a type. The default version of a type will be used in CloudFormation operations.</p>
12218    async fn set_type_default_version(
12219        &self,
12220        input: SetTypeDefaultVersionInput,
12221    ) -> Result<SetTypeDefaultVersionOutput, RusotoError<SetTypeDefaultVersionError>>;
12222
12223    /// <p>Sends a signal to the specified resource with a success or failure status. You can use the SignalResource API in conjunction with a creation policy or update policy. AWS CloudFormation doesn't proceed with a stack creation or update until resources receive the required number of signals or the timeout period is exceeded. The SignalResource API is useful in cases where you want to send signals from anywhere other than an Amazon EC2 instance.</p>
12224    async fn signal_resource(
12225        &self,
12226        input: SignalResourceInput,
12227    ) -> Result<(), RusotoError<SignalResourceError>>;
12228
12229    /// <p>Stops an in-progress operation on a stack set and its associated stack instances. </p>
12230    async fn stop_stack_set_operation(
12231        &self,
12232        input: StopStackSetOperationInput,
12233    ) -> Result<StopStackSetOperationOutput, RusotoError<StopStackSetOperationError>>;
12234
12235    /// <p>Updates a stack as specified in the template. After the call completes successfully, the stack update starts. You can check the status of the stack via the <a>DescribeStacks</a> action.</p> <p>To get a copy of the template for an existing stack, you can use the <a>GetTemplate</a> action.</p> <p>For more information about creating an update template, updating a stack, and monitoring the progress of the update, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks.html">Updating a Stack</a>.</p>
12236    async fn update_stack(
12237        &self,
12238        input: UpdateStackInput,
12239    ) -> Result<UpdateStackOutput, RusotoError<UpdateStackError>>;
12240
12241    /// <p>Updates the parameter values for stack instances for the specified accounts, within the specified Regions. A stack instance refers to a stack in a specific account and Region. </p> <p>You can only update stack instances in Regions and accounts where they already exist; to create additional stack instances, use <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStackInstances.html">CreateStackInstances</a>. </p> <p>During stack set updates, any parameters overridden for a stack instance are not updated, but retain their overridden value.</p> <p>You can only update the parameter <i>values</i> that are specified in the stack set; to add or delete a parameter itself, use <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStackSet.html">UpdateStackSet</a> to update the stack set template. If you add a parameter to a template, before you can override the parameter value specified in the stack set you must first use <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStackSet.html">UpdateStackSet</a> to update all stack instances with the updated template and parameter value specified in the stack set. Once a stack instance has been updated with the new parameter, you can then override the parameter value using <code>UpdateStackInstances</code>.</p>
12242    async fn update_stack_instances(
12243        &self,
12244        input: UpdateStackInstancesInput,
12245    ) -> Result<UpdateStackInstancesOutput, RusotoError<UpdateStackInstancesError>>;
12246
12247    /// <p>Updates the stack set, and associated stack instances in the specified accounts and Regions.</p> <p>Even if the stack set operation created by updating the stack set fails (completely or partially, below or above a specified failure tolerance), the stack set is updated with your changes. Subsequent <a>CreateStackInstances</a> calls on the specified stack set use the updated stack set.</p>
12248    async fn update_stack_set(
12249        &self,
12250        input: UpdateStackSetInput,
12251    ) -> Result<UpdateStackSetOutput, RusotoError<UpdateStackSetError>>;
12252
12253    /// <p>Updates termination protection for the specified stack. If a user attempts to delete a stack with termination protection enabled, the operation fails and the stack remains unchanged. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-protect-stacks.html">Protecting a Stack From Being Deleted</a> in the <i>AWS CloudFormation User Guide</i>.</p> <p> For <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-nested-stacks.html">nested stacks</a>, termination protection is set on the root stack and cannot be changed directly on the nested stack.</p>
12254    async fn update_termination_protection(
12255        &self,
12256        input: UpdateTerminationProtectionInput,
12257    ) -> Result<UpdateTerminationProtectionOutput, RusotoError<UpdateTerminationProtectionError>>;
12258
12259    /// <p>Validates a specified template. AWS CloudFormation first checks if the template is valid JSON. If it isn't, AWS CloudFormation checks if the template is valid YAML. If both these checks fail, AWS CloudFormation returns a template validation error.</p>
12260    async fn validate_template(
12261        &self,
12262        input: ValidateTemplateInput,
12263    ) -> Result<ValidateTemplateOutput, RusotoError<ValidateTemplateError>>;
12264}
12265/// A client for the AWS CloudFormation API.
12266#[derive(Clone)]
12267pub struct CloudFormationClient {
12268    client: Client,
12269    region: region::Region,
12270}
12271
12272impl CloudFormationClient {
12273    /// Creates a client backed by the default tokio event loop.
12274    ///
12275    /// The client will use the default credentials provider and tls client.
12276    pub fn new(region: region::Region) -> CloudFormationClient {
12277        CloudFormationClient {
12278            client: Client::shared(),
12279            region,
12280        }
12281    }
12282
12283    pub fn new_with<P, D>(
12284        request_dispatcher: D,
12285        credentials_provider: P,
12286        region: region::Region,
12287    ) -> CloudFormationClient
12288    where
12289        P: ProvideAwsCredentials + Send + Sync + 'static,
12290        D: DispatchSignedRequest + Send + Sync + 'static,
12291    {
12292        CloudFormationClient {
12293            client: Client::new_with(credentials_provider, request_dispatcher),
12294            region,
12295        }
12296    }
12297
12298    pub fn new_with_client(client: Client, region: region::Region) -> CloudFormationClient {
12299        CloudFormationClient { client, region }
12300    }
12301}
12302
12303#[async_trait]
12304impl CloudFormation for CloudFormationClient {
12305    /// <p><p>Cancels an update on the specified stack. If the call completes successfully, the stack rolls back the update and reverts to the previous stack configuration.</p> <note> <p>You can cancel only stacks that are in the UPDATE<em>IN</em>PROGRESS state.</p> </note></p>
12306    async fn cancel_update_stack(
12307        &self,
12308        input: CancelUpdateStackInput,
12309    ) -> Result<(), RusotoError<CancelUpdateStackError>> {
12310        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12311        let params = self.new_params("CancelUpdateStack");
12312        let mut params = params;
12313        CancelUpdateStackInputSerializer::serialize(&mut params, "", &input);
12314        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12315        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12316
12317        let response = self
12318            .sign_and_dispatch(request, CancelUpdateStackError::from_response)
12319            .await?;
12320
12321        std::mem::drop(response);
12322        Ok(())
12323    }
12324
12325    /// <p>For a specified stack that is in the <code>UPDATE_ROLLBACK_FAILED</code> state, continues rolling it back to the <code>UPDATE_ROLLBACK_COMPLETE</code> state. Depending on the cause of the failure, you can manually <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/troubleshooting.html#troubleshooting-errors-update-rollback-failed"> fix the error</a> and continue the rollback. By continuing the rollback, you can return your stack to a working state (the <code>UPDATE_ROLLBACK_COMPLETE</code> state), and then try to update the stack again.</p> <p>A stack goes into the <code>UPDATE_ROLLBACK_FAILED</code> state when AWS CloudFormation cannot roll back all changes after a failed stack update. For example, you might have a stack that is rolling back to an old database instance that was deleted outside of AWS CloudFormation. Because AWS CloudFormation doesn't know the database was deleted, it assumes that the database instance still exists and attempts to roll back to it, causing the update rollback to fail.</p>
12326    async fn continue_update_rollback(
12327        &self,
12328        input: ContinueUpdateRollbackInput,
12329    ) -> Result<ContinueUpdateRollbackOutput, RusotoError<ContinueUpdateRollbackError>> {
12330        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12331        let params = self.new_params("ContinueUpdateRollback");
12332        let mut params = params;
12333        ContinueUpdateRollbackInputSerializer::serialize(&mut params, "", &input);
12334        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12335        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12336
12337        let response = self
12338            .sign_and_dispatch(request, ContinueUpdateRollbackError::from_response)
12339            .await?;
12340
12341        let result = ContinueUpdateRollbackOutput::default();
12342
12343        drop(response); // parse non-payload
12344        Ok(result)
12345    }
12346
12347    /// <p>Creates a list of changes that will be applied to a stack so that you can review the changes before executing them. You can create a change set for a stack that doesn't exist or an existing stack. If you create a change set for a stack that doesn't exist, the change set shows all of the resources that AWS CloudFormation will create. If you create a change set for an existing stack, AWS CloudFormation compares the stack's information with the information that you submit in the change set and lists the differences. Use change sets to understand which resources AWS CloudFormation will create or change, and how it will change resources in an existing stack, before you create or update a stack.</p> <p>To create a change set for a stack that doesn't exist, for the <code>ChangeSetType</code> parameter, specify <code>CREATE</code>. To create a change set for an existing stack, specify <code>UPDATE</code> for the <code>ChangeSetType</code> parameter. To create a change set for an import operation, specify <code>IMPORT</code> for the <code>ChangeSetType</code> parameter. After the <code>CreateChangeSet</code> call successfully completes, AWS CloudFormation starts creating the change set. To check the status of the change set or to review it, use the <a>DescribeChangeSet</a> action.</p> <p>When you are satisfied with the changes the change set will make, execute the change set by using the <a>ExecuteChangeSet</a> action. AWS CloudFormation doesn't make changes until you execute the change set.</p>
12348    async fn create_change_set(
12349        &self,
12350        input: CreateChangeSetInput,
12351    ) -> Result<CreateChangeSetOutput, RusotoError<CreateChangeSetError>> {
12352        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12353        let params = self.new_params("CreateChangeSet");
12354        let mut params = params;
12355        CreateChangeSetInputSerializer::serialize(&mut params, "", &input);
12356        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12357        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12358
12359        let response = self
12360            .sign_and_dispatch(request, CreateChangeSetError::from_response)
12361            .await?;
12362
12363        let mut response = response;
12364        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
12365            xml_util::start_element(actual_tag_name, stack)?;
12366            let result =
12367                CreateChangeSetOutputDeserializer::deserialize("CreateChangeSetResult", stack)?;
12368            skip_tree(stack);
12369            xml_util::end_element(actual_tag_name, stack)?;
12370            Ok(result)
12371        })
12372        .await?;
12373
12374        drop(response); // parse non-payload
12375        Ok(result)
12376    }
12377
12378    /// <p>Creates a stack as specified in the template. After the call completes successfully, the stack creation starts. You can check the status of the stack via the <a>DescribeStacks</a> API.</p>
12379    async fn create_stack(
12380        &self,
12381        input: CreateStackInput,
12382    ) -> Result<CreateStackOutput, RusotoError<CreateStackError>> {
12383        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12384        let params = self.new_params("CreateStack");
12385        let mut params = params;
12386        CreateStackInputSerializer::serialize(&mut params, "", &input);
12387        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12388        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12389
12390        let response = self
12391            .sign_and_dispatch(request, CreateStackError::from_response)
12392            .await?;
12393
12394        let mut response = response;
12395        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
12396            xml_util::start_element(actual_tag_name, stack)?;
12397            let result = CreateStackOutputDeserializer::deserialize("CreateStackResult", stack)?;
12398            skip_tree(stack);
12399            xml_util::end_element(actual_tag_name, stack)?;
12400            Ok(result)
12401        })
12402        .await?;
12403
12404        drop(response); // parse non-payload
12405        Ok(result)
12406    }
12407
12408    /// <p>Creates stack instances for the specified accounts, within the specified Regions. A stack instance refers to a stack in a specific account and Region. You must specify at least one value for either <code>Accounts</code> or <code>DeploymentTargets</code>, and you must specify at least one value for <code>Regions</code>.</p>
12409    async fn create_stack_instances(
12410        &self,
12411        input: CreateStackInstancesInput,
12412    ) -> Result<CreateStackInstancesOutput, RusotoError<CreateStackInstancesError>> {
12413        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12414        let params = self.new_params("CreateStackInstances");
12415        let mut params = params;
12416        CreateStackInstancesInputSerializer::serialize(&mut params, "", &input);
12417        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12418        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12419
12420        let response = self
12421            .sign_and_dispatch(request, CreateStackInstancesError::from_response)
12422            .await?;
12423
12424        let mut response = response;
12425        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
12426            xml_util::start_element(actual_tag_name, stack)?;
12427            let result = CreateStackInstancesOutputDeserializer::deserialize(
12428                "CreateStackInstancesResult",
12429                stack,
12430            )?;
12431            skip_tree(stack);
12432            xml_util::end_element(actual_tag_name, stack)?;
12433            Ok(result)
12434        })
12435        .await?;
12436
12437        drop(response); // parse non-payload
12438        Ok(result)
12439    }
12440
12441    /// <p>Creates a stack set.</p>
12442    async fn create_stack_set(
12443        &self,
12444        input: CreateStackSetInput,
12445    ) -> Result<CreateStackSetOutput, RusotoError<CreateStackSetError>> {
12446        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12447        let params = self.new_params("CreateStackSet");
12448        let mut params = params;
12449        CreateStackSetInputSerializer::serialize(&mut params, "", &input);
12450        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12451        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12452
12453        let response = self
12454            .sign_and_dispatch(request, CreateStackSetError::from_response)
12455            .await?;
12456
12457        let mut response = response;
12458        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
12459            xml_util::start_element(actual_tag_name, stack)?;
12460            let result =
12461                CreateStackSetOutputDeserializer::deserialize("CreateStackSetResult", stack)?;
12462            skip_tree(stack);
12463            xml_util::end_element(actual_tag_name, stack)?;
12464            Ok(result)
12465        })
12466        .await?;
12467
12468        drop(response); // parse non-payload
12469        Ok(result)
12470    }
12471
12472    /// <p>Deletes the specified change set. Deleting change sets ensures that no one executes the wrong change set.</p> <p>If the call successfully completes, AWS CloudFormation successfully deleted the change set.</p>
12473    async fn delete_change_set(
12474        &self,
12475        input: DeleteChangeSetInput,
12476    ) -> Result<DeleteChangeSetOutput, RusotoError<DeleteChangeSetError>> {
12477        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12478        let params = self.new_params("DeleteChangeSet");
12479        let mut params = params;
12480        DeleteChangeSetInputSerializer::serialize(&mut params, "", &input);
12481        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12482        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12483
12484        let response = self
12485            .sign_and_dispatch(request, DeleteChangeSetError::from_response)
12486            .await?;
12487
12488        let result = DeleteChangeSetOutput::default();
12489
12490        drop(response); // parse non-payload
12491        Ok(result)
12492    }
12493
12494    /// <p>Deletes a specified stack. Once the call completes successfully, stack deletion starts. Deleted stacks do not show up in the <a>DescribeStacks</a> API if the deletion has been completed successfully.</p>
12495    async fn delete_stack(
12496        &self,
12497        input: DeleteStackInput,
12498    ) -> Result<(), RusotoError<DeleteStackError>> {
12499        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12500        let params = self.new_params("DeleteStack");
12501        let mut params = params;
12502        DeleteStackInputSerializer::serialize(&mut params, "", &input);
12503        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12504        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12505
12506        let response = self
12507            .sign_and_dispatch(request, DeleteStackError::from_response)
12508            .await?;
12509
12510        std::mem::drop(response);
12511        Ok(())
12512    }
12513
12514    /// <p>Deletes stack instances for the specified accounts, in the specified Regions. </p>
12515    async fn delete_stack_instances(
12516        &self,
12517        input: DeleteStackInstancesInput,
12518    ) -> Result<DeleteStackInstancesOutput, RusotoError<DeleteStackInstancesError>> {
12519        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12520        let params = self.new_params("DeleteStackInstances");
12521        let mut params = params;
12522        DeleteStackInstancesInputSerializer::serialize(&mut params, "", &input);
12523        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12524        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12525
12526        let response = self
12527            .sign_and_dispatch(request, DeleteStackInstancesError::from_response)
12528            .await?;
12529
12530        let mut response = response;
12531        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
12532            xml_util::start_element(actual_tag_name, stack)?;
12533            let result = DeleteStackInstancesOutputDeserializer::deserialize(
12534                "DeleteStackInstancesResult",
12535                stack,
12536            )?;
12537            skip_tree(stack);
12538            xml_util::end_element(actual_tag_name, stack)?;
12539            Ok(result)
12540        })
12541        .await?;
12542
12543        drop(response); // parse non-payload
12544        Ok(result)
12545    }
12546
12547    /// <p>Deletes a stack set. Before you can delete a stack set, all of its member stack instances must be deleted. For more information about how to do this, see <a>DeleteStackInstances</a>. </p>
12548    async fn delete_stack_set(
12549        &self,
12550        input: DeleteStackSetInput,
12551    ) -> Result<DeleteStackSetOutput, RusotoError<DeleteStackSetError>> {
12552        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12553        let params = self.new_params("DeleteStackSet");
12554        let mut params = params;
12555        DeleteStackSetInputSerializer::serialize(&mut params, "", &input);
12556        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12557        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12558
12559        let response = self
12560            .sign_and_dispatch(request, DeleteStackSetError::from_response)
12561            .await?;
12562
12563        let result = DeleteStackSetOutput::default();
12564
12565        drop(response); // parse non-payload
12566        Ok(result)
12567    }
12568
12569    /// <p>Removes a type or type version from active use in the CloudFormation registry. If a type or type version is deregistered, it cannot be used in CloudFormation operations.</p> <p>To deregister a type, you must individually deregister all registered versions of that type. If a type has only a single registered version, deregistering that version results in the type itself being deregistered. </p> <p>You cannot deregister the default version of a type, unless it is the only registered version of that type, in which case the type itself is deregistered as well. </p>
12570    async fn deregister_type(
12571        &self,
12572        input: DeregisterTypeInput,
12573    ) -> Result<DeregisterTypeOutput, RusotoError<DeregisterTypeError>> {
12574        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12575        let params = self.new_params("DeregisterType");
12576        let mut params = params;
12577        DeregisterTypeInputSerializer::serialize(&mut params, "", &input);
12578        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12579        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12580
12581        let response = self
12582            .sign_and_dispatch(request, DeregisterTypeError::from_response)
12583            .await?;
12584
12585        let result = DeregisterTypeOutput::default();
12586
12587        drop(response); // parse non-payload
12588        Ok(result)
12589    }
12590
12591    /// <p>Retrieves your account's AWS CloudFormation limits, such as the maximum number of stacks that you can create in your account. For more information about account limits, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html">AWS CloudFormation Limits</a> in the <i>AWS CloudFormation User Guide</i>.</p>
12592    async fn describe_account_limits(
12593        &self,
12594        input: DescribeAccountLimitsInput,
12595    ) -> Result<DescribeAccountLimitsOutput, RusotoError<DescribeAccountLimitsError>> {
12596        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12597        let params = self.new_params("DescribeAccountLimits");
12598        let mut params = params;
12599        DescribeAccountLimitsInputSerializer::serialize(&mut params, "", &input);
12600        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12601        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12602
12603        let response = self
12604            .sign_and_dispatch(request, DescribeAccountLimitsError::from_response)
12605            .await?;
12606
12607        let mut response = response;
12608        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
12609            xml_util::start_element(actual_tag_name, stack)?;
12610            let result = DescribeAccountLimitsOutputDeserializer::deserialize(
12611                "DescribeAccountLimitsResult",
12612                stack,
12613            )?;
12614            skip_tree(stack);
12615            xml_util::end_element(actual_tag_name, stack)?;
12616            Ok(result)
12617        })
12618        .await?;
12619
12620        drop(response); // parse non-payload
12621        Ok(result)
12622    }
12623
12624    /// <p>Returns the inputs for the change set and a list of changes that AWS CloudFormation will make if you execute the change set. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-changesets.html">Updating Stacks Using Change Sets</a> in the AWS CloudFormation User Guide.</p>
12625    async fn describe_change_set(
12626        &self,
12627        input: DescribeChangeSetInput,
12628    ) -> Result<DescribeChangeSetOutput, RusotoError<DescribeChangeSetError>> {
12629        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12630        let params = self.new_params("DescribeChangeSet");
12631        let mut params = params;
12632        DescribeChangeSetInputSerializer::serialize(&mut params, "", &input);
12633        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12634        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12635
12636        let response = self
12637            .sign_and_dispatch(request, DescribeChangeSetError::from_response)
12638            .await?;
12639
12640        let mut response = response;
12641        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
12642            xml_util::start_element(actual_tag_name, stack)?;
12643            let result =
12644                DescribeChangeSetOutputDeserializer::deserialize("DescribeChangeSetResult", stack)?;
12645            skip_tree(stack);
12646            xml_util::end_element(actual_tag_name, stack)?;
12647            Ok(result)
12648        })
12649        .await?;
12650
12651        drop(response); // parse non-payload
12652        Ok(result)
12653    }
12654
12655    /// <p>Returns information about a stack drift detection operation. A stack drift detection operation detects whether a stack's actual configuration differs, or has <i>drifted</i>, from it's expected configuration, as defined in the stack template and any values specified as template parameters. A stack is considered to have drifted if one or more of its resources have drifted. For more information on stack and resource drift, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html">Detecting Unregulated Configuration Changes to Stacks and Resources</a>.</p> <p>Use <a>DetectStackDrift</a> to initiate a stack drift detection operation. <code>DetectStackDrift</code> returns a <code>StackDriftDetectionId</code> you can use to monitor the progress of the operation using <code>DescribeStackDriftDetectionStatus</code>. Once the drift detection operation has completed, use <a>DescribeStackResourceDrifts</a> to return drift information about the stack and its resources.</p>
12656    async fn describe_stack_drift_detection_status(
12657        &self,
12658        input: DescribeStackDriftDetectionStatusInput,
12659    ) -> Result<
12660        DescribeStackDriftDetectionStatusOutput,
12661        RusotoError<DescribeStackDriftDetectionStatusError>,
12662    > {
12663        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12664        let params = self.new_params("DescribeStackDriftDetectionStatus");
12665        let mut params = params;
12666        DescribeStackDriftDetectionStatusInputSerializer::serialize(&mut params, "", &input);
12667        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12668        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12669
12670        let response = self
12671            .sign_and_dispatch(
12672                request,
12673                DescribeStackDriftDetectionStatusError::from_response,
12674            )
12675            .await?;
12676
12677        let mut response = response;
12678        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
12679            xml_util::start_element(actual_tag_name, stack)?;
12680            let result = DescribeStackDriftDetectionStatusOutputDeserializer::deserialize(
12681                "DescribeStackDriftDetectionStatusResult",
12682                stack,
12683            )?;
12684            skip_tree(stack);
12685            xml_util::end_element(actual_tag_name, stack)?;
12686            Ok(result)
12687        })
12688        .await?;
12689
12690        drop(response); // parse non-payload
12691        Ok(result)
12692    }
12693
12694    /// <p><p>Returns all stack related events for a specified stack in reverse chronological order. For more information about a stack&#39;s event history, go to <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/concept-stack.html">Stacks</a> in the AWS CloudFormation User Guide.</p> <note> <p>You can list events for stacks that have failed to create or have been deleted by specifying the unique stack identifier (stack ID).</p> </note></p>
12695    async fn describe_stack_events(
12696        &self,
12697        input: DescribeStackEventsInput,
12698    ) -> Result<DescribeStackEventsOutput, RusotoError<DescribeStackEventsError>> {
12699        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12700        let params = self.new_params("DescribeStackEvents");
12701        let mut params = params;
12702        DescribeStackEventsInputSerializer::serialize(&mut params, "", &input);
12703        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12704        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12705
12706        let response = self
12707            .sign_and_dispatch(request, DescribeStackEventsError::from_response)
12708            .await?;
12709
12710        let mut response = response;
12711        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
12712            xml_util::start_element(actual_tag_name, stack)?;
12713            let result = DescribeStackEventsOutputDeserializer::deserialize(
12714                "DescribeStackEventsResult",
12715                stack,
12716            )?;
12717            skip_tree(stack);
12718            xml_util::end_element(actual_tag_name, stack)?;
12719            Ok(result)
12720        })
12721        .await?;
12722
12723        drop(response); // parse non-payload
12724        Ok(result)
12725    }
12726
12727    /// <p>Returns the stack instance that's associated with the specified stack set, AWS account, and Region.</p> <p>For a list of stack instances that are associated with a specific stack set, use <a>ListStackInstances</a>.</p>
12728    async fn describe_stack_instance(
12729        &self,
12730        input: DescribeStackInstanceInput,
12731    ) -> Result<DescribeStackInstanceOutput, RusotoError<DescribeStackInstanceError>> {
12732        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12733        let params = self.new_params("DescribeStackInstance");
12734        let mut params = params;
12735        DescribeStackInstanceInputSerializer::serialize(&mut params, "", &input);
12736        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12737        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12738
12739        let response = self
12740            .sign_and_dispatch(request, DescribeStackInstanceError::from_response)
12741            .await?;
12742
12743        let mut response = response;
12744        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
12745            xml_util::start_element(actual_tag_name, stack)?;
12746            let result = DescribeStackInstanceOutputDeserializer::deserialize(
12747                "DescribeStackInstanceResult",
12748                stack,
12749            )?;
12750            skip_tree(stack);
12751            xml_util::end_element(actual_tag_name, stack)?;
12752            Ok(result)
12753        })
12754        .await?;
12755
12756        drop(response); // parse non-payload
12757        Ok(result)
12758    }
12759
12760    /// <p>Returns a description of the specified resource in the specified stack.</p> <p>For deleted stacks, DescribeStackResource returns resource information for up to 90 days after the stack has been deleted.</p>
12761    async fn describe_stack_resource(
12762        &self,
12763        input: DescribeStackResourceInput,
12764    ) -> Result<DescribeStackResourceOutput, RusotoError<DescribeStackResourceError>> {
12765        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12766        let params = self.new_params("DescribeStackResource");
12767        let mut params = params;
12768        DescribeStackResourceInputSerializer::serialize(&mut params, "", &input);
12769        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12770        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12771
12772        let response = self
12773            .sign_and_dispatch(request, DescribeStackResourceError::from_response)
12774            .await?;
12775
12776        let mut response = response;
12777        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
12778            xml_util::start_element(actual_tag_name, stack)?;
12779            let result = DescribeStackResourceOutputDeserializer::deserialize(
12780                "DescribeStackResourceResult",
12781                stack,
12782            )?;
12783            skip_tree(stack);
12784            xml_util::end_element(actual_tag_name, stack)?;
12785            Ok(result)
12786        })
12787        .await?;
12788
12789        drop(response); // parse non-payload
12790        Ok(result)
12791    }
12792
12793    /// <p>Returns drift information for the resources that have been checked for drift in the specified stack. This includes actual and expected configuration values for resources where AWS CloudFormation detects configuration drift.</p> <p>For a given stack, there will be one <code>StackResourceDrift</code> for each stack resource that has been checked for drift. Resources that have not yet been checked for drift are not included. Resources that do not currently support drift detection are not checked, and so not included. For a list of resources that support drift detection, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift-resource-list.html">Resources that Support Drift Detection</a>.</p> <p>Use <a>DetectStackResourceDrift</a> to detect drift on individual resources, or <a>DetectStackDrift</a> to detect drift on all supported resources for a given stack.</p>
12794    async fn describe_stack_resource_drifts(
12795        &self,
12796        input: DescribeStackResourceDriftsInput,
12797    ) -> Result<DescribeStackResourceDriftsOutput, RusotoError<DescribeStackResourceDriftsError>>
12798    {
12799        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12800        let params = self.new_params("DescribeStackResourceDrifts");
12801        let mut params = params;
12802        DescribeStackResourceDriftsInputSerializer::serialize(&mut params, "", &input);
12803        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12804        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12805
12806        let response = self
12807            .sign_and_dispatch(request, DescribeStackResourceDriftsError::from_response)
12808            .await?;
12809
12810        let mut response = response;
12811        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
12812            xml_util::start_element(actual_tag_name, stack)?;
12813            let result = DescribeStackResourceDriftsOutputDeserializer::deserialize(
12814                "DescribeStackResourceDriftsResult",
12815                stack,
12816            )?;
12817            skip_tree(stack);
12818            xml_util::end_element(actual_tag_name, stack)?;
12819            Ok(result)
12820        })
12821        .await?;
12822
12823        drop(response); // parse non-payload
12824        Ok(result)
12825    }
12826
12827    /// <p><p>Returns AWS resource descriptions for running and deleted stacks. If <code>StackName</code> is specified, all the associated resources that are part of the stack are returned. If <code>PhysicalResourceId</code> is specified, the associated resources of the stack that the resource belongs to are returned.</p> <note> <p>Only the first 100 resources will be returned. If your stack has more resources than this, you should use <code>ListStackResources</code> instead.</p> </note> <p>For deleted stacks, <code>DescribeStackResources</code> returns resource information for up to 90 days after the stack has been deleted.</p> <p>You must specify either <code>StackName</code> or <code>PhysicalResourceId</code>, but not both. In addition, you can specify <code>LogicalResourceId</code> to filter the returned result. For more information about resources, the <code>LogicalResourceId</code> and <code>PhysicalResourceId</code>, go to the <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/">AWS CloudFormation User Guide</a>.</p> <note> <p>A <code>ValidationError</code> is returned if you specify both <code>StackName</code> and <code>PhysicalResourceId</code> in the same request.</p> </note></p>
12828    async fn describe_stack_resources(
12829        &self,
12830        input: DescribeStackResourcesInput,
12831    ) -> Result<DescribeStackResourcesOutput, RusotoError<DescribeStackResourcesError>> {
12832        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12833        let params = self.new_params("DescribeStackResources");
12834        let mut params = params;
12835        DescribeStackResourcesInputSerializer::serialize(&mut params, "", &input);
12836        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12837        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12838
12839        let response = self
12840            .sign_and_dispatch(request, DescribeStackResourcesError::from_response)
12841            .await?;
12842
12843        let mut response = response;
12844        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
12845            xml_util::start_element(actual_tag_name, stack)?;
12846            let result = DescribeStackResourcesOutputDeserializer::deserialize(
12847                "DescribeStackResourcesResult",
12848                stack,
12849            )?;
12850            skip_tree(stack);
12851            xml_util::end_element(actual_tag_name, stack)?;
12852            Ok(result)
12853        })
12854        .await?;
12855
12856        drop(response); // parse non-payload
12857        Ok(result)
12858    }
12859
12860    /// <p>Returns the description of the specified stack set. </p>
12861    async fn describe_stack_set(
12862        &self,
12863        input: DescribeStackSetInput,
12864    ) -> Result<DescribeStackSetOutput, RusotoError<DescribeStackSetError>> {
12865        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12866        let params = self.new_params("DescribeStackSet");
12867        let mut params = params;
12868        DescribeStackSetInputSerializer::serialize(&mut params, "", &input);
12869        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12870        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12871
12872        let response = self
12873            .sign_and_dispatch(request, DescribeStackSetError::from_response)
12874            .await?;
12875
12876        let mut response = response;
12877        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
12878            xml_util::start_element(actual_tag_name, stack)?;
12879            let result =
12880                DescribeStackSetOutputDeserializer::deserialize("DescribeStackSetResult", stack)?;
12881            skip_tree(stack);
12882            xml_util::end_element(actual_tag_name, stack)?;
12883            Ok(result)
12884        })
12885        .await?;
12886
12887        drop(response); // parse non-payload
12888        Ok(result)
12889    }
12890
12891    /// <p>Returns the description of the specified stack set operation. </p>
12892    async fn describe_stack_set_operation(
12893        &self,
12894        input: DescribeStackSetOperationInput,
12895    ) -> Result<DescribeStackSetOperationOutput, RusotoError<DescribeStackSetOperationError>> {
12896        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12897        let params = self.new_params("DescribeStackSetOperation");
12898        let mut params = params;
12899        DescribeStackSetOperationInputSerializer::serialize(&mut params, "", &input);
12900        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12901        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12902
12903        let response = self
12904            .sign_and_dispatch(request, DescribeStackSetOperationError::from_response)
12905            .await?;
12906
12907        let mut response = response;
12908        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
12909            xml_util::start_element(actual_tag_name, stack)?;
12910            let result = DescribeStackSetOperationOutputDeserializer::deserialize(
12911                "DescribeStackSetOperationResult",
12912                stack,
12913            )?;
12914            skip_tree(stack);
12915            xml_util::end_element(actual_tag_name, stack)?;
12916            Ok(result)
12917        })
12918        .await?;
12919
12920        drop(response); // parse non-payload
12921        Ok(result)
12922    }
12923
12924    /// <p><p>Returns the description for the specified stack; if no stack name was specified, then it returns the description for all the stacks created.</p> <note> <p>If the stack does not exist, an <code>AmazonCloudFormationException</code> is returned.</p> </note></p>
12925    async fn describe_stacks(
12926        &self,
12927        input: DescribeStacksInput,
12928    ) -> Result<DescribeStacksOutput, RusotoError<DescribeStacksError>> {
12929        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12930        let params = self.new_params("DescribeStacks");
12931        let mut params = params;
12932        DescribeStacksInputSerializer::serialize(&mut params, "", &input);
12933        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12934        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12935
12936        let response = self
12937            .sign_and_dispatch(request, DescribeStacksError::from_response)
12938            .await?;
12939
12940        let mut response = response;
12941        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
12942            xml_util::start_element(actual_tag_name, stack)?;
12943            let result =
12944                DescribeStacksOutputDeserializer::deserialize("DescribeStacksResult", stack)?;
12945            skip_tree(stack);
12946            xml_util::end_element(actual_tag_name, stack)?;
12947            Ok(result)
12948        })
12949        .await?;
12950
12951        drop(response); // parse non-payload
12952        Ok(result)
12953    }
12954
12955    /// <p>Returns detailed information about a type that has been registered.</p> <p>If you specify a <code>VersionId</code>, <code>DescribeType</code> returns information about that specific type version. Otherwise, it returns information about the default type version.</p>
12956    async fn describe_type(
12957        &self,
12958        input: DescribeTypeInput,
12959    ) -> Result<DescribeTypeOutput, RusotoError<DescribeTypeError>> {
12960        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12961        let params = self.new_params("DescribeType");
12962        let mut params = params;
12963        DescribeTypeInputSerializer::serialize(&mut params, "", &input);
12964        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12965        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12966
12967        let response = self
12968            .sign_and_dispatch(request, DescribeTypeError::from_response)
12969            .await?;
12970
12971        let mut response = response;
12972        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
12973            xml_util::start_element(actual_tag_name, stack)?;
12974            let result = DescribeTypeOutputDeserializer::deserialize("DescribeTypeResult", stack)?;
12975            skip_tree(stack);
12976            xml_util::end_element(actual_tag_name, stack)?;
12977            Ok(result)
12978        })
12979        .await?;
12980
12981        drop(response); // parse non-payload
12982        Ok(result)
12983    }
12984
12985    /// <p>Returns information about a type's registration, including its current status and type and version identifiers.</p> <p>When you initiate a registration request using <code> <a>RegisterType</a> </code>, you can then use <code> <a>DescribeTypeRegistration</a> </code> to monitor the progress of that registration request.</p> <p>Once the registration request has completed, use <code> <a>DescribeType</a> </code> to return detailed informaiton about a type.</p>
12986    async fn describe_type_registration(
12987        &self,
12988        input: DescribeTypeRegistrationInput,
12989    ) -> Result<DescribeTypeRegistrationOutput, RusotoError<DescribeTypeRegistrationError>> {
12990        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
12991        let params = self.new_params("DescribeTypeRegistration");
12992        let mut params = params;
12993        DescribeTypeRegistrationInputSerializer::serialize(&mut params, "", &input);
12994        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
12995        request.set_content_type("application/x-www-form-urlencoded".to_owned());
12996
12997        let response = self
12998            .sign_and_dispatch(request, DescribeTypeRegistrationError::from_response)
12999            .await?;
13000
13001        let mut response = response;
13002        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13003            xml_util::start_element(actual_tag_name, stack)?;
13004            let result = DescribeTypeRegistrationOutputDeserializer::deserialize(
13005                "DescribeTypeRegistrationResult",
13006                stack,
13007            )?;
13008            skip_tree(stack);
13009            xml_util::end_element(actual_tag_name, stack)?;
13010            Ok(result)
13011        })
13012        .await?;
13013
13014        drop(response); // parse non-payload
13015        Ok(result)
13016    }
13017
13018    /// <p>Detects whether a stack's actual configuration differs, or has <i>drifted</i>, from it's expected configuration, as defined in the stack template and any values specified as template parameters. For each resource in the stack that supports drift detection, AWS CloudFormation compares the actual configuration of the resource with its expected template configuration. Only resource properties explicitly defined in the stack template are checked for drift. A stack is considered to have drifted if one or more of its resources differ from their expected template configurations. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html">Detecting Unregulated Configuration Changes to Stacks and Resources</a>.</p> <p>Use <code>DetectStackDrift</code> to detect drift on all supported resources for a given stack, or <a>DetectStackResourceDrift</a> to detect drift on individual resources.</p> <p>For a list of stack resources that currently support drift detection, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift-resource-list.html">Resources that Support Drift Detection</a>.</p> <p> <code>DetectStackDrift</code> can take up to several minutes, depending on the number of resources contained within the stack. Use <a>DescribeStackDriftDetectionStatus</a> to monitor the progress of a detect stack drift operation. Once the drift detection operation has completed, use <a>DescribeStackResourceDrifts</a> to return drift information about the stack and its resources.</p> <p>When detecting drift on a stack, AWS CloudFormation does not detect drift on any nested stacks belonging to that stack. Perform <code>DetectStackDrift</code> directly on the nested stack itself.</p>
13019    async fn detect_stack_drift(
13020        &self,
13021        input: DetectStackDriftInput,
13022    ) -> Result<DetectStackDriftOutput, RusotoError<DetectStackDriftError>> {
13023        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13024        let params = self.new_params("DetectStackDrift");
13025        let mut params = params;
13026        DetectStackDriftInputSerializer::serialize(&mut params, "", &input);
13027        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13028        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13029
13030        let response = self
13031            .sign_and_dispatch(request, DetectStackDriftError::from_response)
13032            .await?;
13033
13034        let mut response = response;
13035        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13036            xml_util::start_element(actual_tag_name, stack)?;
13037            let result =
13038                DetectStackDriftOutputDeserializer::deserialize("DetectStackDriftResult", stack)?;
13039            skip_tree(stack);
13040            xml_util::end_element(actual_tag_name, stack)?;
13041            Ok(result)
13042        })
13043        .await?;
13044
13045        drop(response); // parse non-payload
13046        Ok(result)
13047    }
13048
13049    /// <p>Returns information about whether a resource's actual configuration differs, or has <i>drifted</i>, from it's expected configuration, as defined in the stack template and any values specified as template parameters. This information includes actual and expected property values for resources in which AWS CloudFormation detects drift. Only resource properties explicitly defined in the stack template are checked for drift. For more information about stack and resource drift, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html">Detecting Unregulated Configuration Changes to Stacks and Resources</a>.</p> <p>Use <code>DetectStackResourceDrift</code> to detect drift on individual resources, or <a>DetectStackDrift</a> to detect drift on all resources in a given stack that support drift detection.</p> <p>Resources that do not currently support drift detection cannot be checked. For a list of resources that support drift detection, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift-resource-list.html">Resources that Support Drift Detection</a>.</p>
13050    async fn detect_stack_resource_drift(
13051        &self,
13052        input: DetectStackResourceDriftInput,
13053    ) -> Result<DetectStackResourceDriftOutput, RusotoError<DetectStackResourceDriftError>> {
13054        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13055        let params = self.new_params("DetectStackResourceDrift");
13056        let mut params = params;
13057        DetectStackResourceDriftInputSerializer::serialize(&mut params, "", &input);
13058        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13059        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13060
13061        let response = self
13062            .sign_and_dispatch(request, DetectStackResourceDriftError::from_response)
13063            .await?;
13064
13065        let mut response = response;
13066        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13067            xml_util::start_element(actual_tag_name, stack)?;
13068            let result = DetectStackResourceDriftOutputDeserializer::deserialize(
13069                "DetectStackResourceDriftResult",
13070                stack,
13071            )?;
13072            skip_tree(stack);
13073            xml_util::end_element(actual_tag_name, stack)?;
13074            Ok(result)
13075        })
13076        .await?;
13077
13078        drop(response); // parse non-payload
13079        Ok(result)
13080    }
13081
13082    /// <p>Detect drift on a stack set. When CloudFormation performs drift detection on a stack set, it performs drift detection on the stack associated with each stack instance in the stack set. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-drift.html">How CloudFormation Performs Drift Detection on a Stack Set</a>.</p> <p> <code>DetectStackSetDrift</code> returns the <code>OperationId</code> of the stack set drift detection operation. Use this operation id with <code> <a>DescribeStackSetOperation</a> </code> to monitor the progress of the drift detection operation. The drift detection operation may take some time, depending on the number of stack instances included in the stack set, as well as the number of resources included in each stack.</p> <p>Once the operation has completed, use the following actions to return drift information:</p> <ul> <li> <p>Use <code> <a>DescribeStackSet</a> </code> to return detailed informaiton about the stack set, including detailed information about the last <i>completed</i> drift operation performed on the stack set. (Information about drift operations that are in progress is not included.)</p> </li> <li> <p>Use <code> <a>ListStackInstances</a> </code> to return a list of stack instances belonging to the stack set, including the drift status and last drift time checked of each instance.</p> </li> <li> <p>Use <code> <a>DescribeStackInstance</a> </code> to return detailed information about a specific stack instance, including its drift status and last drift time checked.</p> </li> </ul> <p>For more information on performing a drift detection operation on a stack set, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-drift.html">Detecting Unmanaged Changes in Stack Sets</a>. </p> <p>You can only run a single drift detection operation on a given stack set at one time. </p> <p>To stop a drift detection stack set operation, use <code> <a>StopStackSetOperation</a> </code>.</p>
13083    async fn detect_stack_set_drift(
13084        &self,
13085        input: DetectStackSetDriftInput,
13086    ) -> Result<DetectStackSetDriftOutput, RusotoError<DetectStackSetDriftError>> {
13087        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13088        let params = self.new_params("DetectStackSetDrift");
13089        let mut params = params;
13090        DetectStackSetDriftInputSerializer::serialize(&mut params, "", &input);
13091        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13092        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13093
13094        let response = self
13095            .sign_and_dispatch(request, DetectStackSetDriftError::from_response)
13096            .await?;
13097
13098        let mut response = response;
13099        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13100            xml_util::start_element(actual_tag_name, stack)?;
13101            let result = DetectStackSetDriftOutputDeserializer::deserialize(
13102                "DetectStackSetDriftResult",
13103                stack,
13104            )?;
13105            skip_tree(stack);
13106            xml_util::end_element(actual_tag_name, stack)?;
13107            Ok(result)
13108        })
13109        .await?;
13110
13111        drop(response); // parse non-payload
13112        Ok(result)
13113    }
13114
13115    /// <p>Returns the estimated monthly cost of a template. The return value is an AWS Simple Monthly Calculator URL with a query string that describes the resources required to run the template.</p>
13116    async fn estimate_template_cost(
13117        &self,
13118        input: EstimateTemplateCostInput,
13119    ) -> Result<EstimateTemplateCostOutput, RusotoError<EstimateTemplateCostError>> {
13120        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13121        let params = self.new_params("EstimateTemplateCost");
13122        let mut params = params;
13123        EstimateTemplateCostInputSerializer::serialize(&mut params, "", &input);
13124        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13125        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13126
13127        let response = self
13128            .sign_and_dispatch(request, EstimateTemplateCostError::from_response)
13129            .await?;
13130
13131        let mut response = response;
13132        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13133            xml_util::start_element(actual_tag_name, stack)?;
13134            let result = EstimateTemplateCostOutputDeserializer::deserialize(
13135                "EstimateTemplateCostResult",
13136                stack,
13137            )?;
13138            skip_tree(stack);
13139            xml_util::end_element(actual_tag_name, stack)?;
13140            Ok(result)
13141        })
13142        .await?;
13143
13144        drop(response); // parse non-payload
13145        Ok(result)
13146    }
13147
13148    /// <p>Updates a stack using the input information that was provided when the specified change set was created. After the call successfully completes, AWS CloudFormation starts updating the stack. Use the <a>DescribeStacks</a> action to view the status of the update.</p> <p>When you execute a change set, AWS CloudFormation deletes all other change sets associated with the stack because they aren't valid for the updated stack.</p> <p>If a stack policy is associated with the stack, AWS CloudFormation enforces the policy during the update. You can't specify a temporary stack policy that overrides the current policy.</p>
13149    async fn execute_change_set(
13150        &self,
13151        input: ExecuteChangeSetInput,
13152    ) -> Result<ExecuteChangeSetOutput, RusotoError<ExecuteChangeSetError>> {
13153        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13154        let params = self.new_params("ExecuteChangeSet");
13155        let mut params = params;
13156        ExecuteChangeSetInputSerializer::serialize(&mut params, "", &input);
13157        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13158        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13159
13160        let response = self
13161            .sign_and_dispatch(request, ExecuteChangeSetError::from_response)
13162            .await?;
13163
13164        let result = ExecuteChangeSetOutput::default();
13165
13166        drop(response); // parse non-payload
13167        Ok(result)
13168    }
13169
13170    /// <p>Returns the stack policy for a specified stack. If a stack doesn't have a policy, a null value is returned.</p>
13171    async fn get_stack_policy(
13172        &self,
13173        input: GetStackPolicyInput,
13174    ) -> Result<GetStackPolicyOutput, RusotoError<GetStackPolicyError>> {
13175        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13176        let params = self.new_params("GetStackPolicy");
13177        let mut params = params;
13178        GetStackPolicyInputSerializer::serialize(&mut params, "", &input);
13179        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13180        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13181
13182        let response = self
13183            .sign_and_dispatch(request, GetStackPolicyError::from_response)
13184            .await?;
13185
13186        let mut response = response;
13187        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13188            xml_util::start_element(actual_tag_name, stack)?;
13189            let result =
13190                GetStackPolicyOutputDeserializer::deserialize("GetStackPolicyResult", stack)?;
13191            skip_tree(stack);
13192            xml_util::end_element(actual_tag_name, stack)?;
13193            Ok(result)
13194        })
13195        .await?;
13196
13197        drop(response); // parse non-payload
13198        Ok(result)
13199    }
13200
13201    /// <p><p>Returns the template body for a specified stack. You can get the template for running or deleted stacks.</p> <p>For deleted stacks, GetTemplate returns the template for up to 90 days after the stack has been deleted.</p> <note> <p> If the template does not exist, a <code>ValidationError</code> is returned. </p> </note></p>
13202    async fn get_template(
13203        &self,
13204        input: GetTemplateInput,
13205    ) -> Result<GetTemplateOutput, RusotoError<GetTemplateError>> {
13206        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13207        let params = self.new_params("GetTemplate");
13208        let mut params = params;
13209        GetTemplateInputSerializer::serialize(&mut params, "", &input);
13210        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13211        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13212
13213        let response = self
13214            .sign_and_dispatch(request, GetTemplateError::from_response)
13215            .await?;
13216
13217        let mut response = response;
13218        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13219            xml_util::start_element(actual_tag_name, stack)?;
13220            let result = GetTemplateOutputDeserializer::deserialize("GetTemplateResult", stack)?;
13221            skip_tree(stack);
13222            xml_util::end_element(actual_tag_name, stack)?;
13223            Ok(result)
13224        })
13225        .await?;
13226
13227        drop(response); // parse non-payload
13228        Ok(result)
13229    }
13230
13231    /// <p>Returns information about a new or existing template. The <code>GetTemplateSummary</code> action is useful for viewing parameter information, such as default parameter values and parameter types, before you create or update a stack or stack set.</p> <p>You can use the <code>GetTemplateSummary</code> action when you submit a template, or you can get template information for a stack set, or a running or deleted stack.</p> <p>For deleted stacks, <code>GetTemplateSummary</code> returns the template information for up to 90 days after the stack has been deleted. If the template does not exist, a <code>ValidationError</code> is returned.</p>
13232    async fn get_template_summary(
13233        &self,
13234        input: GetTemplateSummaryInput,
13235    ) -> Result<GetTemplateSummaryOutput, RusotoError<GetTemplateSummaryError>> {
13236        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13237        let params = self.new_params("GetTemplateSummary");
13238        let mut params = params;
13239        GetTemplateSummaryInputSerializer::serialize(&mut params, "", &input);
13240        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13241        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13242
13243        let response = self
13244            .sign_and_dispatch(request, GetTemplateSummaryError::from_response)
13245            .await?;
13246
13247        let mut response = response;
13248        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13249            xml_util::start_element(actual_tag_name, stack)?;
13250            let result = GetTemplateSummaryOutputDeserializer::deserialize(
13251                "GetTemplateSummaryResult",
13252                stack,
13253            )?;
13254            skip_tree(stack);
13255            xml_util::end_element(actual_tag_name, stack)?;
13256            Ok(result)
13257        })
13258        .await?;
13259
13260        drop(response); // parse non-payload
13261        Ok(result)
13262    }
13263
13264    /// <p>Returns the ID and status of each active change set for a stack. For example, AWS CloudFormation lists change sets that are in the <code>CREATE_IN_PROGRESS</code> or <code>CREATE_PENDING</code> state.</p>
13265    async fn list_change_sets(
13266        &self,
13267        input: ListChangeSetsInput,
13268    ) -> Result<ListChangeSetsOutput, RusotoError<ListChangeSetsError>> {
13269        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13270        let params = self.new_params("ListChangeSets");
13271        let mut params = params;
13272        ListChangeSetsInputSerializer::serialize(&mut params, "", &input);
13273        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13274        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13275
13276        let response = self
13277            .sign_and_dispatch(request, ListChangeSetsError::from_response)
13278            .await?;
13279
13280        let mut response = response;
13281        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13282            xml_util::start_element(actual_tag_name, stack)?;
13283            let result =
13284                ListChangeSetsOutputDeserializer::deserialize("ListChangeSetsResult", stack)?;
13285            skip_tree(stack);
13286            xml_util::end_element(actual_tag_name, stack)?;
13287            Ok(result)
13288        })
13289        .await?;
13290
13291        drop(response); // parse non-payload
13292        Ok(result)
13293    }
13294
13295    /// <p>Lists all exported output values in the account and Region in which you call this action. Use this action to see the exported output values that you can import into other stacks. To import values, use the <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html"> <code>Fn::ImportValue</code> </a> function. </p> <p>For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-exports.html"> AWS CloudFormation Export Stack Output Values</a>.</p>
13296    async fn list_exports(
13297        &self,
13298        input: ListExportsInput,
13299    ) -> Result<ListExportsOutput, RusotoError<ListExportsError>> {
13300        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13301        let params = self.new_params("ListExports");
13302        let mut params = params;
13303        ListExportsInputSerializer::serialize(&mut params, "", &input);
13304        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13305        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13306
13307        let response = self
13308            .sign_and_dispatch(request, ListExportsError::from_response)
13309            .await?;
13310
13311        let mut response = response;
13312        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13313            xml_util::start_element(actual_tag_name, stack)?;
13314            let result = ListExportsOutputDeserializer::deserialize("ListExportsResult", stack)?;
13315            skip_tree(stack);
13316            xml_util::end_element(actual_tag_name, stack)?;
13317            Ok(result)
13318        })
13319        .await?;
13320
13321        drop(response); // parse non-payload
13322        Ok(result)
13323    }
13324
13325    /// <p>Lists all stacks that are importing an exported output value. To modify or remove an exported output value, first use this action to see which stacks are using it. To see the exported output values in your account, see <a>ListExports</a>. </p> <p>For more information about importing an exported output value, see the <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html"> <code>Fn::ImportValue</code> </a> function. </p>
13326    async fn list_imports(
13327        &self,
13328        input: ListImportsInput,
13329    ) -> Result<ListImportsOutput, RusotoError<ListImportsError>> {
13330        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13331        let params = self.new_params("ListImports");
13332        let mut params = params;
13333        ListImportsInputSerializer::serialize(&mut params, "", &input);
13334        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13335        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13336
13337        let response = self
13338            .sign_and_dispatch(request, ListImportsError::from_response)
13339            .await?;
13340
13341        let mut response = response;
13342        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13343            xml_util::start_element(actual_tag_name, stack)?;
13344            let result = ListImportsOutputDeserializer::deserialize("ListImportsResult", stack)?;
13345            skip_tree(stack);
13346            xml_util::end_element(actual_tag_name, stack)?;
13347            Ok(result)
13348        })
13349        .await?;
13350
13351        drop(response); // parse non-payload
13352        Ok(result)
13353    }
13354
13355    /// <p>Returns summary information about stack instances that are associated with the specified stack set. You can filter for stack instances that are associated with a specific AWS account name or Region, or that have a specific status.</p>
13356    async fn list_stack_instances(
13357        &self,
13358        input: ListStackInstancesInput,
13359    ) -> Result<ListStackInstancesOutput, RusotoError<ListStackInstancesError>> {
13360        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13361        let params = self.new_params("ListStackInstances");
13362        let mut params = params;
13363        ListStackInstancesInputSerializer::serialize(&mut params, "", &input);
13364        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13365        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13366
13367        let response = self
13368            .sign_and_dispatch(request, ListStackInstancesError::from_response)
13369            .await?;
13370
13371        let mut response = response;
13372        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13373            xml_util::start_element(actual_tag_name, stack)?;
13374            let result = ListStackInstancesOutputDeserializer::deserialize(
13375                "ListStackInstancesResult",
13376                stack,
13377            )?;
13378            skip_tree(stack);
13379            xml_util::end_element(actual_tag_name, stack)?;
13380            Ok(result)
13381        })
13382        .await?;
13383
13384        drop(response); // parse non-payload
13385        Ok(result)
13386    }
13387
13388    /// <p>Returns descriptions of all resources of the specified stack.</p> <p>For deleted stacks, ListStackResources returns resource information for up to 90 days after the stack has been deleted.</p>
13389    async fn list_stack_resources(
13390        &self,
13391        input: ListStackResourcesInput,
13392    ) -> Result<ListStackResourcesOutput, RusotoError<ListStackResourcesError>> {
13393        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13394        let params = self.new_params("ListStackResources");
13395        let mut params = params;
13396        ListStackResourcesInputSerializer::serialize(&mut params, "", &input);
13397        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13398        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13399
13400        let response = self
13401            .sign_and_dispatch(request, ListStackResourcesError::from_response)
13402            .await?;
13403
13404        let mut response = response;
13405        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13406            xml_util::start_element(actual_tag_name, stack)?;
13407            let result = ListStackResourcesOutputDeserializer::deserialize(
13408                "ListStackResourcesResult",
13409                stack,
13410            )?;
13411            skip_tree(stack);
13412            xml_util::end_element(actual_tag_name, stack)?;
13413            Ok(result)
13414        })
13415        .await?;
13416
13417        drop(response); // parse non-payload
13418        Ok(result)
13419    }
13420
13421    /// <p>Returns summary information about the results of a stack set operation. </p>
13422    async fn list_stack_set_operation_results(
13423        &self,
13424        input: ListStackSetOperationResultsInput,
13425    ) -> Result<ListStackSetOperationResultsOutput, RusotoError<ListStackSetOperationResultsError>>
13426    {
13427        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13428        let params = self.new_params("ListStackSetOperationResults");
13429        let mut params = params;
13430        ListStackSetOperationResultsInputSerializer::serialize(&mut params, "", &input);
13431        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13432        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13433
13434        let response = self
13435            .sign_and_dispatch(request, ListStackSetOperationResultsError::from_response)
13436            .await?;
13437
13438        let mut response = response;
13439        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13440            xml_util::start_element(actual_tag_name, stack)?;
13441            let result = ListStackSetOperationResultsOutputDeserializer::deserialize(
13442                "ListStackSetOperationResultsResult",
13443                stack,
13444            )?;
13445            skip_tree(stack);
13446            xml_util::end_element(actual_tag_name, stack)?;
13447            Ok(result)
13448        })
13449        .await?;
13450
13451        drop(response); // parse non-payload
13452        Ok(result)
13453    }
13454
13455    /// <p>Returns summary information about operations performed on a stack set. </p>
13456    async fn list_stack_set_operations(
13457        &self,
13458        input: ListStackSetOperationsInput,
13459    ) -> Result<ListStackSetOperationsOutput, RusotoError<ListStackSetOperationsError>> {
13460        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13461        let params = self.new_params("ListStackSetOperations");
13462        let mut params = params;
13463        ListStackSetOperationsInputSerializer::serialize(&mut params, "", &input);
13464        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13465        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13466
13467        let response = self
13468            .sign_and_dispatch(request, ListStackSetOperationsError::from_response)
13469            .await?;
13470
13471        let mut response = response;
13472        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13473            xml_util::start_element(actual_tag_name, stack)?;
13474            let result = ListStackSetOperationsOutputDeserializer::deserialize(
13475                "ListStackSetOperationsResult",
13476                stack,
13477            )?;
13478            skip_tree(stack);
13479            xml_util::end_element(actual_tag_name, stack)?;
13480            Ok(result)
13481        })
13482        .await?;
13483
13484        drop(response); // parse non-payload
13485        Ok(result)
13486    }
13487
13488    /// <p>Returns summary information about stack sets that are associated with the user.</p>
13489    async fn list_stack_sets(
13490        &self,
13491        input: ListStackSetsInput,
13492    ) -> Result<ListStackSetsOutput, RusotoError<ListStackSetsError>> {
13493        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13494        let params = self.new_params("ListStackSets");
13495        let mut params = params;
13496        ListStackSetsInputSerializer::serialize(&mut params, "", &input);
13497        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13498        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13499
13500        let response = self
13501            .sign_and_dispatch(request, ListStackSetsError::from_response)
13502            .await?;
13503
13504        let mut response = response;
13505        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13506            xml_util::start_element(actual_tag_name, stack)?;
13507            let result =
13508                ListStackSetsOutputDeserializer::deserialize("ListStackSetsResult", stack)?;
13509            skip_tree(stack);
13510            xml_util::end_element(actual_tag_name, stack)?;
13511            Ok(result)
13512        })
13513        .await?;
13514
13515        drop(response); // parse non-payload
13516        Ok(result)
13517    }
13518
13519    /// <p>Returns the summary information for stacks whose status matches the specified StackStatusFilter. Summary information for stacks that have been deleted is kept for 90 days after the stack is deleted. If no StackStatusFilter is specified, summary information for all stacks is returned (including existing stacks and stacks that have been deleted).</p>
13520    async fn list_stacks(
13521        &self,
13522        input: ListStacksInput,
13523    ) -> Result<ListStacksOutput, RusotoError<ListStacksError>> {
13524        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13525        let params = self.new_params("ListStacks");
13526        let mut params = params;
13527        ListStacksInputSerializer::serialize(&mut params, "", &input);
13528        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13529        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13530
13531        let response = self
13532            .sign_and_dispatch(request, ListStacksError::from_response)
13533            .await?;
13534
13535        let mut response = response;
13536        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13537            xml_util::start_element(actual_tag_name, stack)?;
13538            let result = ListStacksOutputDeserializer::deserialize("ListStacksResult", stack)?;
13539            skip_tree(stack);
13540            xml_util::end_element(actual_tag_name, stack)?;
13541            Ok(result)
13542        })
13543        .await?;
13544
13545        drop(response); // parse non-payload
13546        Ok(result)
13547    }
13548
13549    /// <p>Returns a list of registration tokens for the specified type(s).</p>
13550    async fn list_type_registrations(
13551        &self,
13552        input: ListTypeRegistrationsInput,
13553    ) -> Result<ListTypeRegistrationsOutput, RusotoError<ListTypeRegistrationsError>> {
13554        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13555        let params = self.new_params("ListTypeRegistrations");
13556        let mut params = params;
13557        ListTypeRegistrationsInputSerializer::serialize(&mut params, "", &input);
13558        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13559        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13560
13561        let response = self
13562            .sign_and_dispatch(request, ListTypeRegistrationsError::from_response)
13563            .await?;
13564
13565        let mut response = response;
13566        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13567            xml_util::start_element(actual_tag_name, stack)?;
13568            let result = ListTypeRegistrationsOutputDeserializer::deserialize(
13569                "ListTypeRegistrationsResult",
13570                stack,
13571            )?;
13572            skip_tree(stack);
13573            xml_util::end_element(actual_tag_name, stack)?;
13574            Ok(result)
13575        })
13576        .await?;
13577
13578        drop(response); // parse non-payload
13579        Ok(result)
13580    }
13581
13582    /// <p>Returns summary information about the versions of a type.</p>
13583    async fn list_type_versions(
13584        &self,
13585        input: ListTypeVersionsInput,
13586    ) -> Result<ListTypeVersionsOutput, RusotoError<ListTypeVersionsError>> {
13587        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13588        let params = self.new_params("ListTypeVersions");
13589        let mut params = params;
13590        ListTypeVersionsInputSerializer::serialize(&mut params, "", &input);
13591        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13592        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13593
13594        let response = self
13595            .sign_and_dispatch(request, ListTypeVersionsError::from_response)
13596            .await?;
13597
13598        let mut response = response;
13599        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13600            xml_util::start_element(actual_tag_name, stack)?;
13601            let result =
13602                ListTypeVersionsOutputDeserializer::deserialize("ListTypeVersionsResult", stack)?;
13603            skip_tree(stack);
13604            xml_util::end_element(actual_tag_name, stack)?;
13605            Ok(result)
13606        })
13607        .await?;
13608
13609        drop(response); // parse non-payload
13610        Ok(result)
13611    }
13612
13613    /// <p>Returns summary information about types that have been registered with CloudFormation.</p>
13614    async fn list_types(
13615        &self,
13616        input: ListTypesInput,
13617    ) -> Result<ListTypesOutput, RusotoError<ListTypesError>> {
13618        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13619        let params = self.new_params("ListTypes");
13620        let mut params = params;
13621        ListTypesInputSerializer::serialize(&mut params, "", &input);
13622        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13623        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13624
13625        let response = self
13626            .sign_and_dispatch(request, ListTypesError::from_response)
13627            .await?;
13628
13629        let mut response = response;
13630        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13631            xml_util::start_element(actual_tag_name, stack)?;
13632            let result = ListTypesOutputDeserializer::deserialize("ListTypesResult", stack)?;
13633            skip_tree(stack);
13634            xml_util::end_element(actual_tag_name, stack)?;
13635            Ok(result)
13636        })
13637        .await?;
13638
13639        drop(response); // parse non-payload
13640        Ok(result)
13641    }
13642
13643    /// <p>Reports progress of a resource handler to CloudFormation.</p> <p>Reserved for use by the <a href="https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/what-is-cloudformation-cli.html">CloudFormation CLI</a>. Do not use this API in your code.</p>
13644    async fn record_handler_progress(
13645        &self,
13646        input: RecordHandlerProgressInput,
13647    ) -> Result<RecordHandlerProgressOutput, RusotoError<RecordHandlerProgressError>> {
13648        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13649        let params = self.new_params("RecordHandlerProgress");
13650        let mut params = params;
13651        RecordHandlerProgressInputSerializer::serialize(&mut params, "", &input);
13652        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13653        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13654
13655        let response = self
13656            .sign_and_dispatch(request, RecordHandlerProgressError::from_response)
13657            .await?;
13658
13659        let result = RecordHandlerProgressOutput::default();
13660
13661        drop(response); // parse non-payload
13662        Ok(result)
13663    }
13664
13665    /// <p>Registers a type with the CloudFormation service. Registering a type makes it available for use in CloudFormation templates in your AWS account, and includes:</p> <ul> <li> <p>Validating the resource schema</p> </li> <li> <p>Determining which handlers have been specified for the resource</p> </li> <li> <p>Making the resource type available for use in your account</p> </li> </ul> <p>For more information on how to develop types and ready them for registeration, see <a href="https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/resource-types.html">Creating Resource Providers</a> in the <i>CloudFormation CLI User Guide</i>.</p> <p>You can have a maximum of 50 resource type versions registered at a time. This maximum is per account and per region. Use <a href="AWSCloudFormation/latest/APIReference/API_DeregisterType.html">DeregisterType</a> to deregister specific resource type versions if necessary.</p> <p>Once you have initiated a registration request using <code> <a>RegisterType</a> </code>, you can use <code> <a>DescribeTypeRegistration</a> </code> to monitor the progress of the registration request.</p>
13666    async fn register_type(
13667        &self,
13668        input: RegisterTypeInput,
13669    ) -> Result<RegisterTypeOutput, RusotoError<RegisterTypeError>> {
13670        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13671        let params = self.new_params("RegisterType");
13672        let mut params = params;
13673        RegisterTypeInputSerializer::serialize(&mut params, "", &input);
13674        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13675        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13676
13677        let response = self
13678            .sign_and_dispatch(request, RegisterTypeError::from_response)
13679            .await?;
13680
13681        let mut response = response;
13682        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13683            xml_util::start_element(actual_tag_name, stack)?;
13684            let result = RegisterTypeOutputDeserializer::deserialize("RegisterTypeResult", stack)?;
13685            skip_tree(stack);
13686            xml_util::end_element(actual_tag_name, stack)?;
13687            Ok(result)
13688        })
13689        .await?;
13690
13691        drop(response); // parse non-payload
13692        Ok(result)
13693    }
13694
13695    /// <p>Sets a stack policy for a specified stack.</p>
13696    async fn set_stack_policy(
13697        &self,
13698        input: SetStackPolicyInput,
13699    ) -> Result<(), RusotoError<SetStackPolicyError>> {
13700        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13701        let params = self.new_params("SetStackPolicy");
13702        let mut params = params;
13703        SetStackPolicyInputSerializer::serialize(&mut params, "", &input);
13704        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13705        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13706
13707        let response = self
13708            .sign_and_dispatch(request, SetStackPolicyError::from_response)
13709            .await?;
13710
13711        std::mem::drop(response);
13712        Ok(())
13713    }
13714
13715    /// <p>Specify the default version of a type. The default version of a type will be used in CloudFormation operations.</p>
13716    async fn set_type_default_version(
13717        &self,
13718        input: SetTypeDefaultVersionInput,
13719    ) -> Result<SetTypeDefaultVersionOutput, RusotoError<SetTypeDefaultVersionError>> {
13720        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13721        let params = self.new_params("SetTypeDefaultVersion");
13722        let mut params = params;
13723        SetTypeDefaultVersionInputSerializer::serialize(&mut params, "", &input);
13724        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13725        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13726
13727        let response = self
13728            .sign_and_dispatch(request, SetTypeDefaultVersionError::from_response)
13729            .await?;
13730
13731        let result = SetTypeDefaultVersionOutput::default();
13732
13733        drop(response); // parse non-payload
13734        Ok(result)
13735    }
13736
13737    /// <p>Sends a signal to the specified resource with a success or failure status. You can use the SignalResource API in conjunction with a creation policy or update policy. AWS CloudFormation doesn't proceed with a stack creation or update until resources receive the required number of signals or the timeout period is exceeded. The SignalResource API is useful in cases where you want to send signals from anywhere other than an Amazon EC2 instance.</p>
13738    async fn signal_resource(
13739        &self,
13740        input: SignalResourceInput,
13741    ) -> Result<(), RusotoError<SignalResourceError>> {
13742        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13743        let params = self.new_params("SignalResource");
13744        let mut params = params;
13745        SignalResourceInputSerializer::serialize(&mut params, "", &input);
13746        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13747        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13748
13749        let response = self
13750            .sign_and_dispatch(request, SignalResourceError::from_response)
13751            .await?;
13752
13753        std::mem::drop(response);
13754        Ok(())
13755    }
13756
13757    /// <p>Stops an in-progress operation on a stack set and its associated stack instances. </p>
13758    async fn stop_stack_set_operation(
13759        &self,
13760        input: StopStackSetOperationInput,
13761    ) -> Result<StopStackSetOperationOutput, RusotoError<StopStackSetOperationError>> {
13762        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13763        let params = self.new_params("StopStackSetOperation");
13764        let mut params = params;
13765        StopStackSetOperationInputSerializer::serialize(&mut params, "", &input);
13766        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13767        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13768
13769        let response = self
13770            .sign_and_dispatch(request, StopStackSetOperationError::from_response)
13771            .await?;
13772
13773        let result = StopStackSetOperationOutput::default();
13774
13775        drop(response); // parse non-payload
13776        Ok(result)
13777    }
13778
13779    /// <p>Updates a stack as specified in the template. After the call completes successfully, the stack update starts. You can check the status of the stack via the <a>DescribeStacks</a> action.</p> <p>To get a copy of the template for an existing stack, you can use the <a>GetTemplate</a> action.</p> <p>For more information about creating an update template, updating a stack, and monitoring the progress of the update, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks.html">Updating a Stack</a>.</p>
13780    async fn update_stack(
13781        &self,
13782        input: UpdateStackInput,
13783    ) -> Result<UpdateStackOutput, RusotoError<UpdateStackError>> {
13784        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13785        let params = self.new_params("UpdateStack");
13786        let mut params = params;
13787        UpdateStackInputSerializer::serialize(&mut params, "", &input);
13788        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13789        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13790
13791        let response = self
13792            .sign_and_dispatch(request, UpdateStackError::from_response)
13793            .await?;
13794
13795        let mut response = response;
13796        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13797            xml_util::start_element(actual_tag_name, stack)?;
13798            let result = UpdateStackOutputDeserializer::deserialize("UpdateStackResult", stack)?;
13799            skip_tree(stack);
13800            xml_util::end_element(actual_tag_name, stack)?;
13801            Ok(result)
13802        })
13803        .await?;
13804
13805        drop(response); // parse non-payload
13806        Ok(result)
13807    }
13808
13809    /// <p>Updates the parameter values for stack instances for the specified accounts, within the specified Regions. A stack instance refers to a stack in a specific account and Region. </p> <p>You can only update stack instances in Regions and accounts where they already exist; to create additional stack instances, use <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStackInstances.html">CreateStackInstances</a>. </p> <p>During stack set updates, any parameters overridden for a stack instance are not updated, but retain their overridden value.</p> <p>You can only update the parameter <i>values</i> that are specified in the stack set; to add or delete a parameter itself, use <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStackSet.html">UpdateStackSet</a> to update the stack set template. If you add a parameter to a template, before you can override the parameter value specified in the stack set you must first use <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStackSet.html">UpdateStackSet</a> to update all stack instances with the updated template and parameter value specified in the stack set. Once a stack instance has been updated with the new parameter, you can then override the parameter value using <code>UpdateStackInstances</code>.</p>
13810    async fn update_stack_instances(
13811        &self,
13812        input: UpdateStackInstancesInput,
13813    ) -> Result<UpdateStackInstancesOutput, RusotoError<UpdateStackInstancesError>> {
13814        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13815        let params = self.new_params("UpdateStackInstances");
13816        let mut params = params;
13817        UpdateStackInstancesInputSerializer::serialize(&mut params, "", &input);
13818        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13819        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13820
13821        let response = self
13822            .sign_and_dispatch(request, UpdateStackInstancesError::from_response)
13823            .await?;
13824
13825        let mut response = response;
13826        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13827            xml_util::start_element(actual_tag_name, stack)?;
13828            let result = UpdateStackInstancesOutputDeserializer::deserialize(
13829                "UpdateStackInstancesResult",
13830                stack,
13831            )?;
13832            skip_tree(stack);
13833            xml_util::end_element(actual_tag_name, stack)?;
13834            Ok(result)
13835        })
13836        .await?;
13837
13838        drop(response); // parse non-payload
13839        Ok(result)
13840    }
13841
13842    /// <p>Updates the stack set, and associated stack instances in the specified accounts and Regions.</p> <p>Even if the stack set operation created by updating the stack set fails (completely or partially, below or above a specified failure tolerance), the stack set is updated with your changes. Subsequent <a>CreateStackInstances</a> calls on the specified stack set use the updated stack set.</p>
13843    async fn update_stack_set(
13844        &self,
13845        input: UpdateStackSetInput,
13846    ) -> Result<UpdateStackSetOutput, RusotoError<UpdateStackSetError>> {
13847        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13848        let params = self.new_params("UpdateStackSet");
13849        let mut params = params;
13850        UpdateStackSetInputSerializer::serialize(&mut params, "", &input);
13851        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13852        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13853
13854        let response = self
13855            .sign_and_dispatch(request, UpdateStackSetError::from_response)
13856            .await?;
13857
13858        let mut response = response;
13859        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13860            xml_util::start_element(actual_tag_name, stack)?;
13861            let result =
13862                UpdateStackSetOutputDeserializer::deserialize("UpdateStackSetResult", stack)?;
13863            skip_tree(stack);
13864            xml_util::end_element(actual_tag_name, stack)?;
13865            Ok(result)
13866        })
13867        .await?;
13868
13869        drop(response); // parse non-payload
13870        Ok(result)
13871    }
13872
13873    /// <p>Updates termination protection for the specified stack. If a user attempts to delete a stack with termination protection enabled, the operation fails and the stack remains unchanged. For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-protect-stacks.html">Protecting a Stack From Being Deleted</a> in the <i>AWS CloudFormation User Guide</i>.</p> <p> For <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-nested-stacks.html">nested stacks</a>, termination protection is set on the root stack and cannot be changed directly on the nested stack.</p>
13874    async fn update_termination_protection(
13875        &self,
13876        input: UpdateTerminationProtectionInput,
13877    ) -> Result<UpdateTerminationProtectionOutput, RusotoError<UpdateTerminationProtectionError>>
13878    {
13879        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13880        let params = self.new_params("UpdateTerminationProtection");
13881        let mut params = params;
13882        UpdateTerminationProtectionInputSerializer::serialize(&mut params, "", &input);
13883        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13884        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13885
13886        let response = self
13887            .sign_and_dispatch(request, UpdateTerminationProtectionError::from_response)
13888            .await?;
13889
13890        let mut response = response;
13891        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13892            xml_util::start_element(actual_tag_name, stack)?;
13893            let result = UpdateTerminationProtectionOutputDeserializer::deserialize(
13894                "UpdateTerminationProtectionResult",
13895                stack,
13896            )?;
13897            skip_tree(stack);
13898            xml_util::end_element(actual_tag_name, stack)?;
13899            Ok(result)
13900        })
13901        .await?;
13902
13903        drop(response); // parse non-payload
13904        Ok(result)
13905    }
13906
13907    /// <p>Validates a specified template. AWS CloudFormation first checks if the template is valid JSON. If it isn't, AWS CloudFormation checks if the template is valid YAML. If both these checks fail, AWS CloudFormation returns a template validation error.</p>
13908    async fn validate_template(
13909        &self,
13910        input: ValidateTemplateInput,
13911    ) -> Result<ValidateTemplateOutput, RusotoError<ValidateTemplateError>> {
13912        let mut request = SignedRequest::new("POST", "cloudformation", &self.region, "/");
13913        let params = self.new_params("ValidateTemplate");
13914        let mut params = params;
13915        ValidateTemplateInputSerializer::serialize(&mut params, "", &input);
13916        request.set_payload(Some(serde_urlencoded::to_string(&params).unwrap()));
13917        request.set_content_type("application/x-www-form-urlencoded".to_owned());
13918
13919        let response = self
13920            .sign_and_dispatch(request, ValidateTemplateError::from_response)
13921            .await?;
13922
13923        let mut response = response;
13924        let result = xml_util::parse_response(&mut response, |actual_tag_name, stack| {
13925            xml_util::start_element(actual_tag_name, stack)?;
13926            let result =
13927                ValidateTemplateOutputDeserializer::deserialize("ValidateTemplateResult", stack)?;
13928            skip_tree(stack);
13929            xml_util::end_element(actual_tag_name, stack)?;
13930            Ok(result)
13931        })
13932        .await?;
13933
13934        drop(response); // parse non-payload
13935        Ok(result)
13936    }
13937}
13938
13939#[cfg(test)]
13940mod protocol_tests {
13941
13942    extern crate rusoto_mock;
13943
13944    use self::rusoto_mock::*;
13945    use super::*;
13946    use rusoto_core::Region as rusoto_region;
13947
13948    #[tokio::test]
13949    async fn test_parse_error_cloudformation_cancel_update_stack() {
13950        let mock_response = MockResponseReader::read_response(
13951            "test_resources/generated/error",
13952            "cloudformation-cancel-update-stack.xml",
13953        );
13954        let mock = MockRequestDispatcher::with_status(400).with_body(&mock_response);
13955        let client =
13956            CloudFormationClient::new_with(mock, MockCredentialsProvider, rusoto_region::UsEast1);
13957        let request = CancelUpdateStackInput::default();
13958        let result = client.cancel_update_stack(request).await;
13959        assert!(!result.is_ok(), "parse error: {:?}", result);
13960    }
13961
13962    #[tokio::test]
13963    async fn test_parse_valid_cloudformation_describe_stacks() {
13964        let mock_response = MockResponseReader::read_response(
13965            "test_resources/generated/valid",
13966            "cloudformation-describe-stacks.xml",
13967        );
13968        let mock = MockRequestDispatcher::with_status(200).with_body(&mock_response);
13969        let client =
13970            CloudFormationClient::new_with(mock, MockCredentialsProvider, rusoto_region::UsEast1);
13971        let request = DescribeStacksInput::default();
13972        let result = client.describe_stacks(request).await;
13973        assert!(result.is_ok(), "parse error: {:?}", result);
13974    }
13975
13976    #[tokio::test]
13977    async fn test_parse_valid_cloudformation_get_template() {
13978        let mock_response = MockResponseReader::read_response(
13979            "test_resources/generated/valid",
13980            "cloudformation-get-template.xml",
13981        );
13982        let mock = MockRequestDispatcher::with_status(200).with_body(&mock_response);
13983        let client =
13984            CloudFormationClient::new_with(mock, MockCredentialsProvider, rusoto_region::UsEast1);
13985        let request = GetTemplateInput::default();
13986        let result = client.get_template(request).await;
13987        assert!(result.is_ok(), "parse error: {:?}", result);
13988    }
13989
13990    #[tokio::test]
13991    async fn test_parse_valid_cloudformation_list_stacks() {
13992        let mock_response = MockResponseReader::read_response(
13993            "test_resources/generated/valid",
13994            "cloudformation-list-stacks.xml",
13995        );
13996        let mock = MockRequestDispatcher::with_status(200).with_body(&mock_response);
13997        let client =
13998            CloudFormationClient::new_with(mock, MockCredentialsProvider, rusoto_region::UsEast1);
13999        let request = ListStacksInput::default();
14000        let result = client.list_stacks(request).await;
14001        assert!(result.is_ok(), "parse error: {:?}", result);
14002    }
14003}