@@ -7,6 +7,8 @@ use quick_xml::Reader;
7
7
use quick_xml:: Writer ;
8
8
9
9
use crate :: error:: { Error , XmlError } ;
10
+ use crate :: extension:: util:: { extension_name, parse_extension} ;
11
+ use crate :: extension:: ExtensionMap ;
10
12
use crate :: fromxml:: FromXml ;
11
13
use crate :: toxml:: { ToXmlNamed , WriterExt } ;
12
14
use crate :: util:: { atom_text, decode, skip} ;
@@ -30,6 +32,8 @@ pub struct Person {
30
32
pub email : Option < String > ,
31
33
/// A Web page for the person.
32
34
pub uri : Option < String > ,
35
+ /// A list of extensions for the person.
36
+ pub extensions : ExtensionMap ,
33
37
}
34
38
35
39
impl Person {
@@ -128,6 +132,35 @@ impl Person {
128
132
{
129
133
self . uri = uri. into ( )
130
134
}
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
+ }
131
164
}
132
165
133
166
impl FromXml for Person {
@@ -141,7 +174,19 @@ impl FromXml for Person {
141
174
Cow :: Borrowed ( "name" ) => person. name = atom_text ( reader) ?. unwrap_or_default ( ) ,
142
175
Cow :: Borrowed ( "email" ) => person. email = atom_text ( reader) ?,
143
176
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
+ }
145
190
} ,
146
191
Event :: End ( _) => break ,
147
192
Event :: Eof => return Err ( Error :: Eof ) ,
@@ -173,6 +218,12 @@ impl ToXmlNamed for Person {
173
218
writer. write_text_element ( "uri" , uri) ?;
174
219
}
175
220
221
+ for map in self . extensions . values ( ) {
222
+ for extensions in map. values ( ) {
223
+ writer. write_objects ( extensions) ?;
224
+ }
225
+ }
226
+
176
227
writer
177
228
. write_event ( Event :: End ( BytesEnd :: new ( name) ) )
178
229
. map_err ( XmlError :: new) ?;
0 commit comments