Skip to content

Commit

Permalink
Upgrade quick-xml
Browse files Browse the repository at this point in the history
  • Loading branch information
andy128k committed Dec 27, 2022
1 parent eb33b90 commit 52c4398
Show file tree
Hide file tree
Showing 14 changed files with 369 additions and 283 deletions.
4 changes: 2 additions & 2 deletions Cargo.toml
Expand Up @@ -13,8 +13,8 @@ categories = ["parser-implementations"]
include = ["src/*", "Cargo.toml", "LICENSE-MIT", "LICENSE-APACHE", "README.md"]

[dependencies]
quick-xml = { version = "0.22", features = ["encoding"] }
derive_builder = { version = "0.10.2", optional = true }
quick-xml = { version = "0.27", features = ["encoding"] }
derive_builder = { version = "0.12", optional = true }
never = { version = "0.1", optional = true }
serde = { version = "1.0", optional = true, features = ["derive"] }
chrono = { version = "0.4", default-features = false, features = ["alloc"] }
Expand Down
29 changes: 16 additions & 13 deletions src/category.rs
Expand Up @@ -2,6 +2,7 @@ use std::io::{BufRead, Write};

use quick_xml::events::attributes::Attributes;
use quick_xml::events::{BytesStart, Event};
use quick_xml::name::QName;
use quick_xml::Reader;
use quick_xml::Writer;

Expand Down Expand Up @@ -138,29 +139,32 @@ impl FromXml for Category {

for att in atts.with_checks(false).flatten() {
match att.key {
b"term" => {
QName(b"term") => {
category.term = att
.unescape_and_decode_value(reader)
.decode_and_unescape_value(reader)
.map_err(XmlError::new)?
.to_string();
}
b"scheme" => {
QName(b"scheme") => {
category.scheme = Some(
att.unescape_and_decode_value(reader)
.map_err(XmlError::new)?,
)
att.decode_and_unescape_value(reader)
.map_err(XmlError::new)?
.to_string(),
);
}
b"label" => {
QName(b"label") => {
category.label = Some(
att.unescape_and_decode_value(reader)
.map_err(XmlError::new)?,
)
att.decode_and_unescape_value(reader)
.map_err(XmlError::new)?
.to_string(),
);
}
_ => {}
}
}

reader
.read_to_end(b"category", &mut Vec::new())
.read_to_end_into(QName(b"category"), &mut Vec::new())
.map_err(XmlError::new)?;

Ok(category)
Expand All @@ -169,8 +173,7 @@ impl FromXml for Category {

impl ToXml for Category {
fn to_xml<W: Write>(&self, writer: &mut Writer<W>) -> Result<(), XmlError> {
let name = b"category";
let mut element = BytesStart::borrowed(name, name.len());
let mut element = BytesStart::new("category");
element.push_attribute(("term", &*self.term));

if let Some(ref scheme) = self.scheme {
Expand Down
51 changes: 28 additions & 23 deletions src/content.rs
Expand Up @@ -2,6 +2,7 @@ use std::io::{BufRead, Write};

use quick_xml::events::attributes::Attributes;
use quick_xml::events::{BytesEnd, BytesStart, BytesText, Event};
use quick_xml::name::QName;
use quick_xml::Reader;
use quick_xml::Writer;

Expand Down Expand Up @@ -174,29 +175,33 @@ impl FromXml for Content {

for att in atts.with_checks(false).flatten() {
match att.key {
b"xml:base" => {
QName(b"xml:base") => {
content.base = Some(
att.unescape_and_decode_value(reader)
.map_err(XmlError::new)?,
)
att.decode_and_unescape_value(reader)
.map_err(XmlError::new)?
.to_string(),
);
}
b"xml:lang" => {
QName(b"xml:lang") => {
content.lang = Some(
att.unescape_and_decode_value(reader)
.map_err(XmlError::new)?,
)
att.decode_and_unescape_value(reader)
.map_err(XmlError::new)?
.to_string(),
);
}
b"type" => {
QName(b"type") => {
content.content_type = Some(
att.unescape_and_decode_value(reader)
.map_err(XmlError::new)?,
)
att.decode_and_unescape_value(reader)
.map_err(XmlError::new)?
.to_string(),
);
}
b"src" => {
QName(b"src") => {
content.src = Some(
att.unescape_and_decode_value(reader)
.map_err(XmlError::new)?,
)
att.decode_and_unescape_value(reader)
.map_err(XmlError::new)?
.to_string(),
);
}
_ => {}
}
Expand All @@ -213,8 +218,8 @@ impl FromXml for Content {

impl ToXml for Content {
fn to_xml<W: Write>(&self, writer: &mut Writer<W>) -> Result<(), XmlError> {
let name = b"content";
let mut element = BytesStart::borrowed(name, name.len());
let name = "content";
let mut element = BytesStart::new(name);

if let Some(ref base) = self.base {
element.push_attribute(("xml:base", base.as_str()));
Expand Down Expand Up @@ -244,16 +249,16 @@ impl ToXml for Content {
writer
.write_event(Event::Text(
if self.content_type.as_deref() == Some("xhtml") {
BytesText::from_escaped(value.as_bytes())
BytesText::from_escaped(value)
} else {
BytesText::from_plain(value.as_bytes())
BytesText::new(value)
},
))
.map_err(XmlError::new)?;
}

writer
.write_event(Event::End(BytesEnd::borrowed(name)))
.write_event(Event::End(BytesEnd::new(name)))
.map_err(XmlError::new)?;

Ok(())
Expand Down Expand Up @@ -293,9 +298,9 @@ mod test {

loop {
let mut buf = Vec::new();
match reader.read_event(&mut buf).map_err(XmlError::new)? {
match reader.read_event_into(&mut buf).map_err(XmlError::new)? {
Event::Start(element) => {
if element.name() == b"content" {
if element.name() == QName(b"content") {
let content = Content::from_xml(&mut reader, element.attributes())?;
return Ok(content);
} else {
Expand Down
55 changes: 29 additions & 26 deletions src/entry.rs
Expand Up @@ -2,13 +2,14 @@ use std::io::{BufRead, Write};

use quick_xml::events::attributes::Attributes;
use quick_xml::events::{BytesEnd, BytesStart, Event};
use quick_xml::name::QName;
use quick_xml::Reader;
use quick_xml::Writer;

use crate::category::Category;
use crate::content::Content;
use crate::error::{Error, XmlError};
use crate::extension::util::{extension_name, parse_extension};
use crate::extension::util::parse_extension;
use crate::extension::ExtensionMap;
use crate::fromxml::FromXml;
use crate::link::Link;
Expand Down Expand Up @@ -512,49 +513,51 @@ impl FromXml for Entry {
let mut buf = Vec::new();

loop {
match reader.read_event(&mut buf).map_err(XmlError::new)? {
match reader.read_event_into(&mut buf).map_err(XmlError::new)? {
Event::Start(element) => match element.name() {
b"id" => entry.id = atom_text(reader)?.unwrap_or_default(),
b"title" => entry.title = Text::from_xml(reader, element.attributes())?,
b"updated" => {
QName(b"id") => entry.id = atom_text(reader)?.unwrap_or_default(),
QName(b"title") => entry.title = Text::from_xml(reader, element.attributes())?,
QName(b"updated") => {
entry.updated =
atom_datetime(reader)?.unwrap_or_else(default_fixed_datetime)
}
b"author" => entry
QName(b"author") => entry
.authors
.push(Person::from_xml(reader, element.attributes())?),
b"category" => entry
QName(b"category") => entry
.categories
.push(Category::from_xml(reader, element.attributes())?),
b"contributor" => entry
QName(b"contributor") => entry
.contributors
.push(Person::from_xml(reader, element.attributes())?),
b"link" => entry
QName(b"link") => entry
.links
.push(Link::from_xml(reader, element.attributes())?),
b"published" => entry.published = atom_datetime(reader)?,
b"rights" => entry.rights = Some(Text::from_xml(reader, element.attributes())?),
b"source" => {
QName(b"published") => entry.published = atom_datetime(reader)?,
QName(b"rights") => {
entry.rights = Some(Text::from_xml(reader, element.attributes())?)
}
QName(b"source") => {
entry.source = Some(Source::from_xml(reader, element.attributes())?)
}
b"summary" => {
QName(b"summary") => {
entry.summary = Some(Text::from_xml(reader, element.attributes())?)
}
b"content" => {
QName(b"content") => {
entry.content = Some(Content::from_xml(reader, element.attributes())?)
}
n => {
if let Some((ns, name)) = extension_name(element.name()) {
if let Some(ns) = element.name().prefix() {
parse_extension(
reader,
element.attributes(),
ns,
name,
element.name().local_name(),
&mut entry.extensions,
)?;
} else {
reader
.read_to_end(n, &mut Vec::new())
.read_to_end_into(n, &mut Vec::new())
.map_err(XmlError::new)?;
}
}
Expand All @@ -573,32 +576,32 @@ impl FromXml for Entry {

impl ToXml for Entry {
fn to_xml<W: Write>(&self, writer: &mut Writer<W>) -> Result<(), XmlError> {
let name = b"entry";
let name = "entry";
writer
.write_event(Event::Start(BytesStart::borrowed(name, name.len())))
.write_event(Event::Start(BytesStart::new(name)))
.map_err(XmlError::new)?;
writer.write_object_named(&self.title, b"title")?;
writer.write_text_element(b"id", &*self.id)?;
writer.write_text_element(b"updated", &*self.updated.to_rfc3339())?;
writer.write_object_named(&self.title, "title")?;
writer.write_text_element("id", &self.id)?;
writer.write_text_element("updated", &self.updated.to_rfc3339())?;
writer.write_objects_named(&self.authors, "author")?;
writer.write_objects(&self.categories)?;
writer.write_objects_named(&self.contributors, "contributor")?;
writer.write_objects(&self.links)?;

if let Some(ref published) = self.published {
writer.write_text_element(b"published", &published.to_rfc3339())?;
writer.write_text_element("published", &published.to_rfc3339())?;
}

if let Some(ref rights) = self.rights {
writer.write_object_named(rights, b"rights")?;
writer.write_object_named(rights, "rights")?;
}

if let Some(ref source) = self.source {
writer.write_object(source)?;
}

if let Some(ref summary) = self.summary {
writer.write_object_named(summary, b"summary")?;
writer.write_object_named(summary, "summary")?;
}

if let Some(ref content) = self.content {
Expand All @@ -612,7 +615,7 @@ impl ToXml for Entry {
}

writer
.write_event(Event::End(BytesEnd::borrowed(name)))
.write_event(Event::End(BytesEnd::new(name)))
.map_err(XmlError::new)?;

Ok(())
Expand Down
7 changes: 3 additions & 4 deletions src/extension/mod.rs
Expand Up @@ -182,16 +182,15 @@ impl Extension {

impl ToXml for Extension {
fn to_xml<W: Write>(&self, writer: &mut Writer<W>) -> Result<(), XmlError> {
let name = self.name.as_bytes();
let mut element = BytesStart::borrowed(name, name.len());
let mut element = BytesStart::new(&self.name);
element.extend_attributes(self.attrs.iter().map(|a| (a.0.as_bytes(), a.1.as_bytes())));
writer
.write_event(Event::Start(element))
.map_err(XmlError::new)?;

if let Some(value) = self.value.as_ref() {
writer
.write_event(Event::Text(BytesText::from_escaped(value.as_bytes())))
.write_event(Event::Text(BytesText::new(value)))
.map_err(XmlError::new)?;
}

Expand All @@ -200,7 +199,7 @@ impl ToXml for Extension {
}

writer
.write_event(Event::End(BytesEnd::borrowed(name)))
.write_event(Event::End(BytesEnd::new(&self.name)))
.map_err(XmlError::new)?;
Ok(())
}
Expand Down

0 comments on commit 52c4398

Please sign in to comment.