diff options
Diffstat (limited to 'src/abstractdoc.rs')
-rw-r--r-- | src/abstractdoc.rs | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/src/abstractdoc.rs b/src/abstractdoc.rs new file mode 100644 index 0000000..d45b4fc --- /dev/null +++ b/src/abstractdoc.rs @@ -0,0 +1,96 @@ +use std::io::BufRead; + +use quick_xml::events::Event; +use quick_xml::reader::Reader; + +use errors::{Error, ErrorKind}; +use xmlutil::{FromXml, element_text}; + +#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)] +pub struct AbstractLink { + pub anchor: String, + pub link: String, +} + +impl FromXml for AbstractLink { + fn from_xml<B: BufRead>(reader: &mut Reader<B>) -> Result<Self, Error> { + let mut link = AbstractLink::default(); + let mut buf = Vec::new(); + + loop { + match reader.read_event(&mut buf) { + Ok(Event::Start(ref e)) => { + match e.name() { + b"anchor" => { + let res = element_text(reader); + link.anchor = res?; + }, + b"link" => { + let res = element_text(reader); + link.link = res?; + }, + _ => (), + } + }, + Ok(Event::End(_)) => { + return Ok(link) + }, + Err(err) => bail!(err), + _ => (), + } + } + } +} + +#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)] +pub struct AbstractDoc { + pub title: String, + pub url: String, + pub abstract_text: String, + pub links: Vec<AbstractLink>, +} + +impl FromXml for AbstractDoc { + fn from_xml<B: BufRead>(reader: &mut Reader<B>) -> Result<Self, Error> { + let mut abs = AbstractDoc::default(); + let mut buf = Vec::new(); + + loop { + match reader.read_event(&mut buf) { + Ok(Event::Start(ref e)) => { + match e.name() { + b"title" => { + let res = element_text(reader); + abs.title = res?; + }, + b"url" => { + let res = element_text(reader); + abs.url = res?; + }, + b"abstract" => { + let res = element_text(reader); + abs.abstract_text = res?; + }, + b"sublink" => { + match AbstractLink::from_xml(reader) { + Ok(link) => { + abs.links.push(link); + }, + Err(err) => bail!(err), + } + }, + _ => {}, + } + }, + Ok(Event::End(_)) => { + return Ok(abs); + }, + Ok(Event::Eof) => break, + Err(err) => bail!(err), + _ => (), + } + } + + bail!(ErrorKind::EOF) + } +} |