@@ -7,6 +7,8 @@ use quick_xml::Reader;
77use quick_xml:: Writer ;
88
99use crate :: error:: { Error , XmlError } ;
10+ use crate :: extension:: util:: { extension_name, parse_extension} ;
11+ use crate :: extension:: ExtensionMap ;
1012use crate :: fromxml:: FromXml ;
1113use crate :: toxml:: { ToXmlNamed , WriterExt } ;
1214use 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
3539impl 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
133166impl 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) ?;
0 commit comments