Skip to content

Commit be59065

Browse files
committed
Enables the parsing of elements defined in another namespace in person elements.
1 parent cc048b3 commit be59065

File tree

3 files changed

+64
-1
lines changed

3 files changed

+64
-1
lines changed

src/person.rs

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ use quick_xml::Reader;
77
use quick_xml::Writer;
88

99
use crate::error::{Error, XmlError};
10+
use crate::extension::util::{extension_name, parse_extension};
11+
use crate::extension::ExtensionMap;
1012
use crate::fromxml::FromXml;
1113
use crate::toxml::{ToXmlNamed, WriterExt};
1214
use crate::util::{atom_text, decode, skip};
@@ -30,6 +32,8 @@ pub struct Person {
3032
pub email: Option<String>,
3133
/// A Web page for the person.
3234
pub uri: Option<String>,
35+
/// A list of extensions for the person.
36+
pub extensions: ExtensionMap,
3337
}
3438

3539
impl Person {
@@ -128,6 +132,35 @@ impl Person {
128132
{
129133
self.uri = uri.into()
130134
}
135+
136+
/// Return the extensions for this person.
137+
///
138+
/// # Examples
139+
///
140+
/// ```
141+
/// use atom_syndication::{Person, extension::ExtensionMap};
142+
///
143+
/// let mut person = Person::default();
144+
/// person.set_extensions(ExtensionMap::new());
145+
/// assert_eq!(person.extensions().len(), 0);
146+
/// ```
147+
pub fn extensions(&self) -> &ExtensionMap {
148+
&self.extensions
149+
}
150+
151+
/// Set the extensions for this person.
152+
///
153+
/// # Examples
154+
///
155+
/// ```
156+
/// use atom_syndication::{Person, extension::ExtensionMap};
157+
///
158+
/// let mut person = Person::default();
159+
/// person.set_extensions(ExtensionMap::new());
160+
/// ```
161+
pub fn set_extensions(&mut self, extensions: ExtensionMap) {
162+
self.extensions = extensions;
163+
}
131164
}
132165

133166
impl FromXml for Person {
@@ -141,7 +174,19 @@ impl FromXml for Person {
141174
Cow::Borrowed("name") => person.name = atom_text(reader)?.unwrap_or_default(),
142175
Cow::Borrowed("email") => person.email = atom_text(reader)?,
143176
Cow::Borrowed("uri") => person.uri = atom_text(reader)?,
144-
_ => skip(element.name(), reader)?,
177+
n => {
178+
if let Some((ns, name)) = extension_name(n.as_ref()) {
179+
parse_extension(
180+
reader,
181+
element.attributes(),
182+
ns,
183+
name,
184+
&mut person.extensions,
185+
)?;
186+
} else {
187+
skip(element.name(), reader)?;
188+
}
189+
}
145190
},
146191
Event::End(_) => break,
147192
Event::Eof => return Err(Error::Eof),
@@ -173,6 +218,12 @@ impl ToXmlNamed for Person {
173218
writer.write_text_element("uri", uri)?;
174219
}
175220

221+
for map in self.extensions.values() {
222+
for extensions in map.values() {
223+
writer.write_objects(extensions)?;
224+
}
225+
}
226+
176227
writer
177228
.write_event(Event::End(BytesEnd::new(name)))
178229
.map_err(XmlError::new)?;

tests/data/person.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@
33
<name>John Doe</name>
44
<email>johndoe@example.com</email>
55
<uri>http://example.com</uri>
6+
<ext:name exattr="exvalue" xmlns:ext="http://www.example.com">Example Name</ext:name>
67
</author>
78
</feed>

tests/read.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,17 @@ fn read_person() {
118118
assert_eq!(person.name(), "John Doe");
119119
assert_eq!(person.email(), Some("johndoe@example.com"));
120120
assert_eq!(person.uri(), Some("http://example.com"));
121+
122+
// Person extensions
123+
assert!(person.extensions().contains_key("ext"));
124+
let map = person.extensions().get("ext").unwrap();
125+
assert!(map.contains_key("name"));
126+
let name = map.get("name").unwrap().first().unwrap();
127+
assert_eq!(name.value(), Some("Example Name"));
128+
assert_eq!(
129+
name.attrs().get("exattr").map(String::as_str),
130+
Some("exvalue")
131+
);
121132
}
122133

123134
#[test]

0 commit comments

Comments
 (0)