Skip to content
This repository was archived by the owner on May 30, 2022. It is now read-only.

Commit ae5f2fc

Browse files
authored
Merge pull request #8 from Mingun/renames
Renames of some `DeError` variants for unifying and consistency
2 parents a181d0a + 9083636 commit ae5f2fc

File tree

6 files changed

+155
-105
lines changed

6 files changed

+155
-105
lines changed

Changelog.md

+18
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,24 @@
1010

1111
## Unreleased
1212

13+
### Misc Changes
14+
15+
- [#8]: Changes in the error type `DeError`:
16+
|Variant|Change
17+
|-------|---------------------------------------------------------------------
18+
|~~`DeError::Text`~~|Removed because never raised
19+
|~~`DeError::InvalidEnum`~~|Removed because never raised
20+
|`DeError::Xml`|Renamed to `DeError::InvalidXml` for consistency with `DeError::InvalidBoolean`
21+
|`DeError::Int`|Renamed to `DeError::InvalidInt` for consistency with `DeError::InvalidBoolean`
22+
|`DeError::Float`|Renamed to `DeError::InvalidFloat` for consistency with `DeError::InvalidBoolean`
23+
|`DeError::Start`|Renamed to `DeError::UnexpectedStart` and tag name added to an error
24+
|`DeError::End`|Renamed to `DeError::UnexpectedEnd` and tag name added to an error
25+
|`DeEvent::Eof`|Renamed to `DeError::UnexpectedEof`
26+
|`DeError::EndOfAttributes`|Renamed to `DeError::KeyNotFound`
27+
|`DeError::ExpectedStart`|Added
28+
29+
[#8]: https://github.com/Mingun/fast-xml/pull/8
30+
1331
## 0.23.0 -- 2022-05-08
1432

1533
- feat: add support for `i128` / `u128` in attributes or text/CDATA content

src/de/escape.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ impl<'a> EscapedDeserializer<'a> {
3232
}
3333
fn unescaped(&self) -> Result<Cow<[u8]>, DeError> {
3434
if self.escaped {
35-
unescape(&self.escaped_value).map_err(|e| DeError::Xml(Error::EscapeError(e)))
35+
unescape(&self.escaped_value).map_err(|e| DeError::InvalidXml(Error::EscapeError(e)))
3636
} else {
3737
Ok(Cow::Borrowed(&self.escaped_value))
3838
}

src/de/map.rs

+36-19
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,38 @@ use serde::de::{self, DeserializeSeed, IntoDeserializer};
1111
use std::borrow::Cow;
1212
use std::ops::Range;
1313

14-
/// Representing state of the `MapAccess` accessor.
15-
enum State {
16-
/// `next_key_seed` not yet called. This is initial state and state after deserializing
17-
/// value (calling `next_value_seed`).
18-
Empty,
14+
/// Defines a source that should be used to deserialize a value in the next call
15+
/// to [`next_value_seed()`](de::MapAccess::next_value_seed)
16+
#[derive(Debug, PartialEq)]
17+
enum ValueSource {
18+
/// Source are not specified, because [`next_key_seed()`] not yet called.
19+
/// This is an initial state and state after deserializing value
20+
/// (after call of [`next_value_seed()`]).
21+
///
22+
/// Attempt to call [`next_value_seed()`] while accessor in this state would
23+
/// return a [`DeError::KeyNotRead`] error.
24+
///
25+
/// [`next_key_seed()`]: de::MapAccess::next_key_seed
26+
/// [`next_value_seed()`]: de::MapAccess::next_value_seed
27+
Unknown,
1928
/// `next_key_seed` checked the attributes list and find it is not exhausted yet.
2029
/// Next call to the `next_value_seed` will deserialize type from the attribute value
2130
Attribute(Range<usize>),
22-
/// The same as `InnerValue`
31+
/// The same as `Text`
2332
Nested,
24-
/// Value should be deserialized from the text content of the XML node:
33+
/// Value should be deserialized from the text content of the XML node, which
34+
/// represented or by an ordinary text node, or by a CDATA node:
2535
///
2636
/// ```xml
2737
/// <...>text content for field value<...>
2838
/// ```
29-
InnerValue,
39+
/// ```xml
40+
/// <any-tag>
41+
/// <key><![CDATA[cdata content]]></key>
42+
/// <!-- ^^^^^^^^^^^^^ - this will be used to deserialize a map value -->
43+
/// </any-tag>
44+
/// ```
45+
Text,
3046
}
3147

3248
/// A deserializer for `Attributes`
@@ -42,7 +58,7 @@ where
4258
iter: IterState,
4359
/// Current state of the accessor that determines what next call to API
4460
/// methods should return.
45-
state: State,
61+
source: ValueSource,
4662
/// list of fields yet to unflatten (defined as starting with $unflatten=)
4763
unflatten_fields: Vec<&'static [u8]>,
4864
}
@@ -61,7 +77,7 @@ where
6177
de,
6278
start,
6379
iter: IterState::new(0, false),
64-
state: State::Empty,
80+
source: ValueSource::Unknown,
6581
unflatten_fields: fields
6682
.iter()
6783
.filter(|f| f.starts_with(UNFLATTEN_PREFIX))
@@ -81,6 +97,8 @@ where
8197
&mut self,
8298
seed: K,
8399
) -> Result<Option<K::Value>, Self::Error> {
100+
debug_assert_eq!(self.source, ValueSource::Unknown);
101+
84102
// FIXME: There error positions counted from end of tag name - need global position
85103
let slice = self.start.attributes_raw();
86104
let decoder = self.de.reader.decoder();
@@ -89,7 +107,7 @@ where
89107
if let Some(a) = self.iter.next(slice).transpose()? {
90108
// try getting map from attributes (key= "value")
91109
let (key, value) = a.into();
92-
self.state = State::Attribute(value.unwrap_or_default());
110+
self.source = ValueSource::Attribute(value.unwrap_or_default());
93111
seed.deserialize(EscapedDeserializer::new(
94112
Cow::Borrowed(&slice[key]),
95113
decoder,
@@ -100,7 +118,7 @@ where
100118
// try getting from events (<key>value</key>)
101119
match self.de.peek()? {
102120
DeEvent::Text(_) | DeEvent::CData(_) => {
103-
self.state = State::InnerValue;
121+
self.source = ValueSource::Text;
104122
// Deserialize `key` from special attribute name which means
105123
// that value should be taken from the text content of the
106124
// XML node
@@ -123,10 +141,11 @@ where
123141
// TODO: This should be handled by #[serde(flatten)]
124142
// See https://github.com/serde-rs/serde/issues/1905
125143
DeEvent::Start(_) if has_value_field => {
126-
self.state = State::InnerValue;
144+
self.source = ValueSource::Text;
127145
seed.deserialize(INNER_VALUE.into_deserializer()).map(Some)
128146
}
129147
DeEvent::Start(e) => {
148+
self.source = ValueSource::Nested;
130149
let key = if let Some(p) = self
131150
.unflatten_fields
132151
.iter()
@@ -143,11 +162,9 @@ where
143162
// #[serde(rename = "$unflatten=xxx")]
144163
// xxx: String,
145164
// }
146-
self.state = State::InnerValue;
147165
seed.deserialize(self.unflatten_fields.remove(p).into_deserializer())
148166
} else {
149167
let name = Cow::Borrowed(e.local_name());
150-
self.state = State::Nested;
151168
seed.deserialize(EscapedDeserializer::new(name, decoder, false))
152169
};
153170
key.map(Some)
@@ -161,8 +178,8 @@ where
161178
&mut self,
162179
seed: K,
163180
) -> Result<K::Value, Self::Error> {
164-
match std::mem::replace(&mut self.state, State::Empty) {
165-
State::Attribute(value) => {
181+
match std::mem::replace(&mut self.source, ValueSource::Unknown) {
182+
ValueSource::Attribute(value) => {
166183
let slice = self.start.attributes_raw();
167184
let decoder = self.de.reader.decoder();
168185

@@ -172,8 +189,8 @@ where
172189
true,
173190
))
174191
}
175-
State::Nested | State::InnerValue => seed.deserialize(&mut *self.de),
176-
State::Empty => Err(DeError::EndOfAttributes),
192+
ValueSource::Nested | ValueSource::Text => seed.deserialize(&mut *self.de),
193+
ValueSource::Unknown => Err(DeError::KeyNotRead),
177194
}
178195
}
179196
}

src/de/mod.rs

+25-25
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ where
284284
let e = self.next()?;
285285
match e {
286286
DeEvent::Start(e) => return Ok(Some(e)),
287-
DeEvent::End(_) => return Err(DeError::End),
287+
DeEvent::End(e) => return Err(DeError::UnexpectedEnd(e.name().to_owned())),
288288
DeEvent::Eof => return Ok(None),
289289
_ => (), // ignore texts
290290
}
@@ -301,24 +301,24 @@ where
301301
/// |Event |XML |Handling
302302
/// |------------------|---------------------------|----------------------------------------
303303
/// |[`DeEvent::Start`]|`<tag>...</tag>` |Result determined by the second table
304-
/// |[`DeEvent::End`] |`</any-tag>` |Emits [`DeError::End`]
304+
/// |[`DeEvent::End`] |`</any-tag>` |Emits [`DeError::UnexpectedEnd`]
305305
/// |[`DeEvent::Text`] |`text content` |Unescapes `text content` and returns it
306306
/// |[`DeEvent::CData`]|`<![CDATA[cdata content]]>`|Returns `cdata content` unchanged
307-
/// |[`DeEvent::Eof`] | |Emits [`DeError::Eof`]
307+
/// |[`DeEvent::Eof`] | |Emits [`DeError::UnexpectedEof`]
308308
///
309309
/// Second event, consumed if [`DeEvent::Start`] was received:
310310
///
311311
/// |Event |XML |Handling
312312
/// |------------------|---------------------------|----------------------------------------------------------------------------------
313-
/// |[`DeEvent::Start`]|`<any-tag>...</any-tag>` |Emits [`DeError::Start`]
313+
/// |[`DeEvent::Start`]|`<any-tag>...</any-tag>` |Emits [`DeError::UnexpectedStart`]
314314
/// |[`DeEvent::End`] |`</tag>` |Returns an empty slice, if close tag matched the open one
315-
/// |[`DeEvent::End`] |`</any-tag>` |Emits [`DeError::End`]
315+
/// |[`DeEvent::End`] |`</any-tag>` |Emits [`DeError::UnexpectedEnd`]
316316
/// |[`DeEvent::Text`] |`text content` |Unescapes `text content` and returns it, consumes events up to `</tag>`
317317
/// |[`DeEvent::CData`]|`<![CDATA[cdata content]]>`|Returns `cdata content` unchanged, consumes events up to `</tag>`
318-
/// |[`DeEvent::Eof`] | |Emits [`DeError::Eof`]
318+
/// |[`DeEvent::Eof`] | |Emits [`DeError::UnexpectedEof`]
319319
fn next_text(&mut self, unescape: bool) -> Result<BytesCData<'de>, DeError> {
320320
match self.next()? {
321-
DeEvent::Text(e) if unescape => e.unescape().map_err(|e| DeError::Xml(e.into())),
321+
DeEvent::Text(e) if unescape => e.unescape().map_err(|e| DeError::InvalidXml(e.into())),
322322
DeEvent::Text(e) => Ok(BytesCData::new(e.into_inner())),
323323
DeEvent::CData(e) => Ok(e),
324324
DeEvent::Start(e) => {
@@ -328,20 +328,20 @@ where
328328
DeEvent::Text(t) if unescape => t.unescape()?,
329329
DeEvent::Text(t) => BytesCData::new(t.into_inner()),
330330
DeEvent::CData(t) => t,
331-
DeEvent::Start(_) => return Err(DeError::Start),
331+
DeEvent::Start(s) => return Err(DeError::UnexpectedStart(s.name().to_owned())),
332332
// We can get End event in case of `<tag></tag>` or `<tag/>` input
333333
// Return empty text in that case
334334
DeEvent::End(end) if end.name() == e.name() => {
335335
return Ok(BytesCData::new(&[] as &[u8]));
336336
}
337-
DeEvent::End(_) => return Err(DeError::End),
338-
DeEvent::Eof => return Err(DeError::Eof),
337+
DeEvent::End(end) => return Err(DeError::UnexpectedEnd(end.name().to_owned())),
338+
DeEvent::Eof => return Err(DeError::UnexpectedEof),
339339
};
340340
self.read_to_end(e.name())?;
341341
Ok(t)
342342
}
343-
DeEvent::End(_) => Err(DeError::End),
344-
DeEvent::Eof => Err(DeError::Eof),
343+
DeEvent::End(e) => Err(DeError::UnexpectedEnd(e.name().to_owned())),
344+
DeEvent::Eof => Err(DeError::UnexpectedEof),
345345
}
346346
}
347347

@@ -434,7 +434,7 @@ where
434434
self.read_to_end(&name)?;
435435
Ok(value)
436436
} else {
437-
Err(DeError::Start)
437+
Err(DeError::ExpectedStart)
438438
}
439439
}
440440

@@ -508,10 +508,10 @@ where
508508
/// |Event |XML |Handling
509509
/// |------------------|---------------------------|-------------------------------------------
510510
/// |[`DeEvent::Start`]|`<tag>...</tag>` |Calls `visitor.visit_unit()`, consumes all events up to corresponding `End` event
511-
/// |[`DeEvent::End`] |`</tag>` |Emits [`DeError::End`]
511+
/// |[`DeEvent::End`] |`</tag>` |Emits [`UnexpectedEnd("tag")`](DeError::UnexpectedEnd)
512512
/// |[`DeEvent::Text`] |`text content` |Calls `visitor.visit_unit()`. Text content is ignored
513513
/// |[`DeEvent::CData`]|`<![CDATA[cdata content]]>`|Calls `visitor.visit_unit()`. CDATA content is ignored
514-
/// |[`DeEvent::Eof`] | |Emits [`DeError::Eof`]
514+
/// |[`DeEvent::Eof`] | |Emits [`UnexpectedEof`](DeError::UnexpectedEof)
515515
fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, DeError>
516516
where
517517
V: Visitor<'de>,
@@ -522,8 +522,8 @@ where
522522
visitor.visit_unit()
523523
}
524524
DeEvent::Text(_) | DeEvent::CData(_) => visitor.visit_unit(),
525-
DeEvent::End(_) => Err(DeError::End),
526-
DeEvent::Eof => Err(DeError::Eof),
525+
DeEvent::End(e) => Err(DeError::UnexpectedEnd(e.name().to_owned())),
526+
DeEvent::Eof => Err(DeError::UnexpectedEof),
527527
}
528528
}
529529

@@ -630,8 +630,8 @@ where
630630
{
631631
match self.next()? {
632632
DeEvent::Start(e) => self.read_to_end(e.name())?,
633-
DeEvent::End(_) => return Err(DeError::End),
634-
DeEvent::Eof => return Err(DeError::Eof),
633+
DeEvent::End(e) => return Err(DeError::UnexpectedEnd(e.name().to_owned())),
634+
DeEvent::Eof => return Err(DeError::UnexpectedEof),
635635
_ => (),
636636
}
637637
visitor.visit_unit()
@@ -715,7 +715,7 @@ impl<'i, R: BufRead> XmlRead<'i> for IoReader<R> {
715715

716716
fn read_to_end(&mut self, name: &[u8]) -> Result<(), DeError> {
717717
match self.reader.read_to_end(name, &mut self.buf) {
718-
Err(Error::UnexpectedEof(_)) => Err(DeError::Eof),
718+
Err(Error::UnexpectedEof(_)) => Err(DeError::UnexpectedEof),
719719
other => Ok(other?),
720720
}
721721
}
@@ -751,7 +751,7 @@ impl<'de> XmlRead<'de> for SliceReader<'de> {
751751

752752
fn read_to_end(&mut self, name: &[u8]) -> Result<(), DeError> {
753753
match self.reader.read_to_end_unbuffered(name) {
754-
Err(Error::UnexpectedEof(_)) => Err(DeError::Eof),
754+
Err(Error::UnexpectedEof(_)) => Err(DeError::UnexpectedEof),
755755
other => Ok(other?),
756756
}
757757
}
@@ -917,12 +917,12 @@ mod tests {
917917
#[test]
918918
fn next_text() {
919919
match from_str::<String>(r#"</root>"#) {
920-
Err(DeError::Xml(Error::EndEventMismatch { expected, found })) => {
920+
Err(DeError::InvalidXml(Error::EndEventMismatch { expected, found })) => {
921921
assert_eq!(expected, "");
922922
assert_eq!(found, "root");
923923
}
924924
x => panic!(
925-
r#"Expected `Err(Xml(EndEventMismatch("", "root")))`, but found {:?}"#,
925+
r#"Expected `Err(InvalidXml(EndEventMismatch("", "root")))`, but found {:?}"#,
926926
x
927927
),
928928
}
@@ -931,12 +931,12 @@ mod tests {
931931
assert_eq!(s, "");
932932

933933
match from_str::<String>(r#"<root></other>"#) {
934-
Err(DeError::Xml(Error::EndEventMismatch { expected, found })) => {
934+
Err(DeError::InvalidXml(Error::EndEventMismatch { expected, found })) => {
935935
assert_eq!(expected, "root");
936936
assert_eq!(found, "other");
937937
}
938938
x => panic!(
939-
r#"Expected `Err(Xml(EndEventMismatch("root", "other")))`, but found {:?}"#,
939+
r#"Expected `Err(InvalidXml(EndEventMismatch("root", "other")))`, but found {:?}"#,
940940
x
941941
),
942942
}

0 commit comments

Comments
 (0)