1use std::io::Read;
2
3use serde::de;
4use xml::reader::{EventReader, ParserConfig, XmlEvent};
5use xml::name::OwnedName;
6
7use error::{Error, ErrorKind, Result};
8use self::map::MapAccess;
9use self::seq::SeqAccess;
10use self::var::EnumAccess;
11
12mod map;
13mod seq;
14mod var;
15
16pub fn from_str<'de, T: de::Deserialize<'de>>(s: &str) -> Result<T> {
36 from_reader(s.as_bytes())
37}
38
39
40pub fn from_reader<'de, R: Read, T: de::Deserialize<'de>>(reader: R) -> Result<T> {
60 T::deserialize(&mut Deserializer::new_from_reader(reader))
61}
62
63pub struct Deserializer<R: Read> {
64 depth: usize,
65 reader: EventReader<R>,
66 peeked: Option<XmlEvent>,
67 is_map_value: bool,
68}
69
70impl<'de, R: Read> Deserializer<R> {
71 pub fn new(reader: EventReader<R>) -> Self {
72 Deserializer {
73 depth: 0,
74 reader: reader,
75 peeked: None,
76 is_map_value: false,
77 }
78 }
79
80 pub fn new_from_reader(reader: R) -> Self {
81 let config = ParserConfig::new()
82 .trim_whitespace(true)
83 .whitespace_to_characters(true)
84 .cdata_to_characters(true)
85 .ignore_comments(true)
86 .coalesce_characters(true);
87
88 Self::new(EventReader::new_with_config(reader, config))
89 }
90
91 fn peek(&mut self) -> Result<&XmlEvent> {
92 if self.peeked.is_none() {
93 self.peeked = Some(self.inner_next()?);
94 }
95 debug_expect!(self.peeked.as_ref(), Some(peeked) => {
96 debug!("Peeked {:?}", peeked);
97 Ok(peeked)
98 })
99 }
100
101 fn inner_next(&mut self) -> Result<XmlEvent> {
102 loop {
103 match self.reader.next().map_err(ErrorKind::Syntax)? {
104 XmlEvent::StartDocument { .. } |
105 XmlEvent::ProcessingInstruction { .. } |
106 XmlEvent::Comment(_) => { },
107 other => return Ok(other),
108 }
109 }
110 }
111
112 fn next(&mut self) -> Result<XmlEvent> {
113 let next = if let Some(peeked) = self.peeked.take() {
114 peeked
115 } else {
116 self.inner_next()?
117 };
118 match next {
119 XmlEvent::StartElement { .. } => {
120 self.depth += 1;
121 },
122 XmlEvent::EndElement { .. } => {
123 self.depth -= 1;
124 },
125 _ => {},
126 }
127 debug!("Fetched {:?}", next);
128 Ok(next)
129 }
130
131 fn set_map_value(&mut self) {
132 self.is_map_value = true;
133 }
134
135 pub fn unset_map_value(&mut self) -> bool {
136 ::std::mem::replace(&mut self.is_map_value, false)
137 }
138
139 fn read_inner_value<V: de::Visitor<'de>, T, F: FnOnce(&mut Self) -> Result<T>>(
140 &mut self,
141 f: F,
142 ) -> Result<T> {
143 if self.unset_map_value() {
144 debug_expect!(self.next(), Ok(XmlEvent::StartElement { name, .. }) => {
145 let result = f(self)?;
146 self.expect_end_element(name)?;
147 Ok(result)
148 })
149 } else {
150 f(self)
151 }
152 }
153
154 fn expect_end_element(&mut self, start_name: OwnedName) -> Result<()> {
155 expect!(self.next()?, XmlEvent::EndElement { name, .. } => {
156 if name == start_name {
157 Ok(())
158 } else {
159 Err(ErrorKind::Custom(format!(
160 "End tag </{}> didn't match the start tag <{}>",
161 name.local_name,
162 start_name.local_name
163 )).into())
164 }
165 })
166 }
167
168 fn prepare_parse_type<V: de::Visitor<'de>>(&mut self) -> Result<String> {
169 if let XmlEvent::StartElement { .. } = *self.peek()? {
170 self.set_map_value()
171 }
172 self.read_inner_value::<V, String, _>(|this| {
173 if let XmlEvent::EndElement { .. } = *this.peek()? {
174 return Err(
175 ErrorKind::UnexpectedToken("EndElement".into(), "Characters".into()).into(),
176 );
177 }
178
179 expect!(this.next()?, XmlEvent::Characters(s) => {
180 return Ok(s)
181 })
182 })
183 }
184}
185
186macro_rules! deserialize_type {
187 ($deserialize:ident => $visit:ident) => {
188 fn $deserialize<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
189 let value = self.prepare_parse_type::<V>()?.parse()?;
190 visitor.$visit(value)
191 }
192 }
193}
194
195impl<'de, 'a, R: Read> de::Deserializer<'de> for &'a mut Deserializer<R> {
196 type Error = Error;
197
198 forward_to_deserialize_any! {
199 identifier
200 }
201
202 fn deserialize_struct<V: de::Visitor<'de>>(
203 self,
204 _name: &'static str,
205 fields: &'static [&'static str],
206 visitor: V,
207 ) -> Result<V::Value> {
208 self.unset_map_value();
209 expect!(self.next()?, XmlEvent::StartElement { name, attributes, .. } => {
210 let map_value = visitor.visit_map(MapAccess::new(
211 self,
212 attributes,
213 fields.contains(&"$value")
214 ))?;
215 self.expect_end_element(name)?;
216 Ok(map_value)
217 })
218 }
219
220 fn deserialize_newtype_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
221 where
222 V: de::Visitor<'de>,
223 {
224 visitor.visit_newtype_struct(self)
225 }
226
227 deserialize_type!(deserialize_i8 => visit_i8);
228 deserialize_type!(deserialize_i16 => visit_i16);
229 deserialize_type!(deserialize_i32 => visit_i32);
230 deserialize_type!(deserialize_i64 => visit_i64);
231 deserialize_type!(deserialize_u8 => visit_u8);
232 deserialize_type!(deserialize_u16 => visit_u16);
233 deserialize_type!(deserialize_u32 => visit_u32);
234 deserialize_type!(deserialize_u64 => visit_u64);
235 deserialize_type!(deserialize_f32 => visit_f32);
236 deserialize_type!(deserialize_f64 => visit_f64);
237 deserialize_type!(deserialize_bool => visit_bool);
238
239 fn deserialize_char<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
240 self.deserialize_string(visitor)
241 }
242
243 fn deserialize_str<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
244 self.deserialize_string(visitor)
245 }
246
247 fn deserialize_bytes<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
248 self.deserialize_string(visitor)
249 }
250
251 fn deserialize_byte_buf<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
252 self.deserialize_string(visitor)
253 }
254
255 fn deserialize_unit<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
256 if let XmlEvent::StartElement { .. } = *self.peek()? {
257 self.set_map_value()
258 }
259 self.read_inner_value::<V, V::Value, _>(
260 |this| expect!(this.peek()?, &XmlEvent::EndElement { .. } => visitor.visit_unit()),
261 )
262 }
263
264 fn deserialize_unit_struct<V: de::Visitor<'de>>(
265 self,
266 _name: &'static str,
267 visitor: V,
268 ) -> Result<V::Value> {
269 self.deserialize_unit(visitor)
270 }
271
272 fn deserialize_tuple_struct<V: de::Visitor<'de>>(
273 self,
274 _name: &'static str,
275 len: usize,
276 visitor: V,
277 ) -> Result<V::Value> {
278 self.deserialize_tuple(len, visitor)
279 }
280
281 fn deserialize_tuple<V: de::Visitor<'de>>(self, len: usize, visitor: V) -> Result<V::Value> {
282 visitor.visit_seq(SeqAccess::new(self, Some(len))?)
283 }
284
285 fn deserialize_enum<V: de::Visitor<'de>>(
286 self,
287 _name: &'static str,
288 _variants: &'static [&'static str],
289 visitor: V,
290 ) -> Result<V::Value> {
291 self.read_inner_value::<V, V::Value, _>(|this| visitor.visit_enum(EnumAccess::new(this)))
292 }
293
294 fn deserialize_string<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
295 if let XmlEvent::StartElement { .. } = *self.peek()? {
296 self.set_map_value()
297 }
298 self.read_inner_value::<V, V::Value, _>(|this| {
299 if let XmlEvent::EndElement { .. } = *this.peek()? {
300 return visitor.visit_str("");
301 }
302 expect!(this.next()?, XmlEvent::Characters(s) => {
303 visitor.visit_string(s)
304 })
305 })
306 }
307
308 fn deserialize_seq<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
309 expect!(self.next(), Ok(XmlEvent::StartElement { name, .. }) => {
310 let result = visitor.visit_seq(SeqAccess::new(self, None)?);
311 self.expect_end_element(name)?;
312 result
313 })
314 }
315
316 fn deserialize_map<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
317 self.unset_map_value();
318 expect!(self.next()?, XmlEvent::StartElement { name, attributes, .. } => {
319 let map_value = visitor.visit_map(MapAccess::new(self, attributes, false))?;
320 self.expect_end_element(name)?;
321 Ok(map_value)
322 })
323 }
324
325 fn deserialize_option<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
326 match *self.peek()? {
327 XmlEvent::EndElement { .. } => visitor.visit_none(),
328 _ => visitor.visit_some(self),
329 }
330 }
331
332 fn deserialize_ignored_any<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
333 self.unset_map_value();
334 let depth = self.depth;
335 loop {
336 self.next()?;
337 if self.depth == depth {
338 break;
339 }
340 }
341 visitor.visit_unit()
342 }
343
344 fn deserialize_any<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
345 match *self.peek()? {
346 XmlEvent::StartElement { .. } => self.deserialize_map(visitor),
347 XmlEvent::EndElement { .. } => self.deserialize_unit(visitor),
348 _ => self.deserialize_string(visitor),
349 }
350 }
351}