tamer: xir::writer::XmlWriter: Do not take Token ownership

impl for `&Token` instead of Token; the writer is just copying data into the
destination stream anyway.

This will allow us to continue writing the token while also using it for
further processing, like `tee`.

DEV-7145
main
Mike Gerwitz 2022-07-21 15:29:55 -04:00
parent 0504788a16
commit de35cc37fd
1 changed files with 19 additions and 18 deletions

View File

@ -183,7 +183,7 @@ impl<S: Escaper> XmlWriter<S> for QName {
}
}
impl<S: Escaper> XmlWriter<S> for Token {
impl<S: Escaper> XmlWriter<S> for &Token {
fn write<W: Write>(
self,
sink: &mut W,
@ -192,8 +192,9 @@ impl<S: Escaper> XmlWriter<S> for Token {
) -> Result {
type W = WriterState; // More concise
use Token::*;
match (self, prev_state) {
(Self::Open(name, _), W::NodeExpected | W::NodeOpen) => {
(Open(name, _), W::NodeExpected | W::NodeOpen) => {
// If a node is still open, then we are a child.
prev_state.close_tag_if_open(sink)?;
sink.write(b"<")?;
@ -202,13 +203,13 @@ impl<S: Escaper> XmlWriter<S> for Token {
Ok(W::NodeOpen)
}
(Self::Close(None, _), W::NodeOpen) => {
(Close(None, _), W::NodeOpen) => {
sink.write(b"/>")?;
Ok(W::NodeExpected)
}
(Self::Close(Some(name), _), W::NodeExpected | W::NodeOpen) => {
(Close(Some(name), _), W::NodeExpected | W::NodeOpen) => {
// If open, we're going to produce an element of the form
// `<foo></foo>`.
prev_state.close_tag_if_open(sink)?;
@ -220,37 +221,37 @@ impl<S: Escaper> XmlWriter<S> for Token {
Ok(W::NodeExpected)
}
(Self::AttrName(name, _), W::NodeOpen) => {
(AttrName(name, _), W::NodeOpen) => {
sink.write(b" ")?;
name.write(sink, prev_state, escaper)?;
Ok(W::AttrNameAdjacent)
}
(Self::AttrValue(value, _), W::AttrNameAdjacent) => {
(AttrValue(value, _), W::AttrNameAdjacent) => {
sink.write(b"=\"")?;
sink.write(escaper.escape(value).lookup_str().as_bytes())?;
sink.write(escaper.escape(*value).lookup_str().as_bytes())?;
sink.write(b"\"")?;
Ok(W::NodeOpen)
}
(Self::AttrValue(value, _), W::AttrFragmentAdjacent) => {
sink.write(escaper.escape(value).lookup_str().as_bytes())?;
(AttrValue(value, _), W::AttrFragmentAdjacent) => {
sink.write(escaper.escape(*value).lookup_str().as_bytes())?;
sink.write(b"\"")?;
Ok(W::NodeOpen)
}
(Self::AttrValueFragment(value, _), W::AttrNameAdjacent) => {
(AttrValueFragment(value, _), W::AttrNameAdjacent) => {
sink.write(b"=\"")?;
sink.write(escaper.escape(value).lookup_str().as_bytes())?;
sink.write(escaper.escape(*value).lookup_str().as_bytes())?;
Ok(W::AttrFragmentAdjacent)
}
(Self::AttrValueFragment(value, _), W::AttrFragmentAdjacent) => {
sink.write(escaper.escape(value).lookup_str().as_bytes())?;
(AttrValueFragment(value, _), W::AttrFragmentAdjacent) => {
sink.write(escaper.escape(*value).lookup_str().as_bytes())?;
Ok(W::AttrFragmentAdjacent)
}
@ -259,9 +260,9 @@ impl<S: Escaper> XmlWriter<S> for Token {
// as CData,
// which may also be beneficial to avoid escaping if we
// haven't yet encountered the unescaped representation.
(Self::Text(text, _), W::NodeExpected | W::NodeOpen) => {
(Text(text, _), W::NodeExpected | W::NodeOpen) => {
prev_state.close_tag_if_open(sink)?;
sink.write(escaper.escape(text).lookup_str().as_bytes())?;
sink.write(escaper.escape(*text).lookup_str().as_bytes())?;
Ok(W::NodeExpected)
}
@ -269,7 +270,7 @@ impl<S: Escaper> XmlWriter<S> for Token {
// XXX: While we currently only output comments that have been
// _read_ as comments,
// that will not always be the case and we must escape `--`!
(Self::Comment(comment, _), W::NodeExpected | W::NodeOpen) => {
(Comment(comment, _), W::NodeExpected | W::NodeOpen) => {
prev_state.close_tag_if_open(sink)?;
sink.write(b"<!--")?;
sink.write(comment.lookup_str().as_bytes())?;
@ -278,7 +279,7 @@ impl<S: Escaper> XmlWriter<S> for Token {
Ok(W::NodeExpected)
}
(Self::Whitespace(ws, _), W::NodeOpen) => {
(Whitespace(ws, _), W::NodeOpen) => {
sink.write(ws.lookup_str().as_bytes())?;
Ok(W::NodeOpen)
@ -286,7 +287,7 @@ impl<S: Escaper> XmlWriter<S> for Token {
// As-of-yet unsupported operations that weren't needed at the
// time of writing, but were planned for in the design of Xir.
(invalid @ Self::AttrName(_, _), W::AttrNameAdjacent) => {
(invalid @ AttrName(_, _), W::AttrNameAdjacent) => {
Err(Error::Todo(format!("{:?}", invalid), prev_state))
}