1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
use aws::common::xmlutil::{XmlParseError, Peek, Next};
use aws::common::xmlutil::{characters, start_element, end_element, string_field, peek_at_name};
use aws::common::params::{Params, ServiceParams};
#[derive(Default, Debug)]
pub struct XmlError {
pub error_type: String,
pub code: String,
pub message: String,
pub detail: Option<String>
}
pub struct XmlErrorDeserializer;
impl XmlErrorDeserializer {
pub fn deserialize<'a, T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<XmlError, XmlParseError> {
try!(start_element(tag_name, stack));
let mut obj = XmlError::default();
loop {
match &try!(peek_at_name(stack))[..] {
"Type" => {
obj.error_type = try!(string_field("Type", stack));
continue;
},
"Code" => {
obj.code = try!(string_field("Code", stack));
continue;
},
"Message" => {
obj.message = try!(string_field("Message", stack));
continue;
},
"Detail" => {
try!(start_element("Detail", stack));
if let Ok(characters) = characters(stack){
obj.detail = Some(characters.to_string());
try!(end_element("Detail", stack));
}
continue;
},
_ => break
}
}
try!(end_element(tag_name, stack));
Ok(obj)
}
}
pub type Errors = Vec<String>;
#[allow(dead_code)]
struct ErrorsParser;
impl ErrorsParser {
#[allow(dead_code)]
#[allow(unused_variables)]
fn parse_xml<T: Peek + Next>(tag_name: &str, stack: &mut T) -> Result<Errors, XmlParseError> {
let mut obj : Vec<String> = Vec::new();
while try!(peek_at_name(stack)) == "Error" {
obj.push(try!(ErrorsParser::parse_single_error(stack)));
}
Ok(obj)
}
fn parse_single_error<T: Peek + Next>(stack: &mut T) -> Result<String, XmlParseError> {
match characters(stack) {
Err(why) => Err(why),
Ok(val) => Ok(val),
}
}
}
#[allow(dead_code)]
struct ErrorsWriter;
impl ErrorsWriter {
#[allow(dead_code)]
fn write_params(params: &mut Params, name: &str, obj: &Errors) {
let mut index = 1;
for element in obj.iter() {
let key = &format!("{}.{}", name, index);
ErrorsWriter::write_param(params, key, element);
index += 1;
}
}
#[allow(dead_code)]
fn write_param(params: &mut Params, key: &str, value: &str) {
params.put(key, value);
}
}