aws_sdk_s3/
rest_xml_unwrapped_errors.rs
1use aws_smithy_types::error::metadata::{Builder as ErrorMetadataBuilder, ErrorMetadata};
11use aws_smithy_xml::decode::{try_data, Document, ScopedDecoder, XmlDecodeError};
12use std::convert::TryFrom;
13
14#[allow(unused)]
15pub fn body_is_error(body: &[u8]) -> Result<bool, XmlDecodeError> {
16 let mut doc = Document::try_from(body)?;
17 let scoped = doc.root_element()?;
18 Ok(scoped.start_el().matches("Error"))
19}
20
21pub fn error_scope<'a, 'b>(doc: &'a mut Document<'b>) -> Result<ScopedDecoder<'b, 'a>, XmlDecodeError> {
22 let scoped = doc.root_element()?;
23 if !scoped.start_el().matches("Error") {
24 return Err(XmlDecodeError::custom("expected error as root"));
25 }
26 Ok(scoped)
27}
28
29pub fn parse_error_metadata(body: &[u8]) -> Result<ErrorMetadataBuilder, XmlDecodeError> {
30 let mut doc = Document::try_from(body)?;
31 let mut root = doc.root_element()?;
32 let mut builder = ErrorMetadata::builder();
33 while let Some(mut tag) = root.next_tag() {
34 match tag.start_el().local() {
35 "Code" => {
36 builder = builder.code(try_data(&mut tag)?);
37 }
38 "Message" => {
39 builder = builder.message(try_data(&mut tag)?);
40 }
41 _ => {}
42 }
43 }
44 Ok(builder)
45}
46
47#[cfg(test)]
48mod test {
49 use super::{body_is_error, parse_error_metadata};
50
51 #[test]
52 fn parse_unwrapped_error() {
53 let xml = br#"<Error>
54 <Type>Sender</Type>
55 <Code>InvalidGreeting</Code>
56 <Message>Hi</Message>
57 <AnotherSetting>setting</AnotherSetting>
58 <RequestId>foo-id</RequestId>
59</Error>"#;
60 assert!(body_is_error(xml).unwrap());
61 let parsed = parse_error_metadata(xml).expect("valid xml").build();
62 assert_eq!(parsed.message(), Some("Hi"));
63 assert_eq!(parsed.code(), Some("InvalidGreeting"));
64 }
65}