Skip to content

Commit 9fc1bb0

Browse files
committed
Consume event when write. Use Event::borrow() if you want to keep ownership
This change will allow to feed to the writer different structs which, otherwise, would be impossible if are not holds an `Event` inside your struct. In the future the Event may be split into `reader::Event` and `writer::Event` and the reader variant may evolve to be borrow-only.
1 parent c0280cd commit 9fc1bb0

File tree

6 files changed

+35
-34
lines changed

6 files changed

+35
-34
lines changed

Changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
- `Writer::new()`
5151
- [#760]: `Attribute::decode_and_unescape_value` and `Attribute::decode_and_unescape_value_with` now
5252
accepts `Decoder` instead of `Reader`. Use `Reader::decoder()` to get it.
53+
- [#760]: `Writer::write_event` now consumes event. Use `Event::borrow()` if you want to keep ownership.
5354

5455
[#650]: https://github.com/tafia/quick-xml/issues/650
5556
[#755]: https://github.com/tafia/quick-xml/pull/755

fuzz/fuzz_targets/fuzz_target_1.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ where
2626
let _event = black_box(event.borrow());
2727
let _event = black_box(event.as_ref());
2828
debug_format!(event);
29-
debug_format!(writer.write_event(event));
29+
debug_format!(writer.write_event(event.borrow()));
3030
}
3131
match event_result {
3232
Ok(Event::Start(ref e)) | Ok(Event::Empty(ref e)) => {

fuzz/fuzz_targets/structured_roundtrip.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ fn fuzz_round_trip(driver: Driver) -> quick_xml::Result<()> {
5151
// TODO: Handle error cases.
5252
use WriterFunc::*;
5353
match writer_func {
54-
WriteEvent(event) => writer.write_event(event)?,
54+
WriteEvent(event) => writer.write_event(event.borrow())?,
5555
WriteBom => writer.write_bom()?,
5656
WriteIndent => writer.write_indent()?,
5757
CreateElement {

src/writer.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ use {crate::de::DeError, serde::Serialize};
5252
/// },
5353
/// Ok(Event::Eof) => break,
5454
/// // we can either move or borrow the event to write, depending on your use-case
55-
/// Ok(e) => assert!(writer.write_event(e).is_ok()),
55+
/// Ok(e) => assert!(writer.write_event(e.borrow()).is_ok()),
5656
/// Err(e) => panic!("Error at position {}: {:?}", reader.buffer_position(), e),
5757
/// }
5858
/// }
@@ -193,37 +193,37 @@ impl<W: Write> Writer<W> {
193193
}
194194

195195
/// Writes the given event to the underlying writer.
196-
pub fn write_event<'a, E: AsRef<Event<'a>>>(&mut self, event: E) -> Result<()> {
196+
pub fn write_event<'a, E: Into<Event<'a>>>(&mut self, event: E) -> Result<()> {
197197
let mut next_should_line_break = true;
198-
let result = match *event.as_ref() {
199-
Event::Start(ref e) => {
200-
let result = self.write_wrapped(b"<", e, b">");
198+
let result = match event.into() {
199+
Event::Start(e) => {
200+
let result = self.write_wrapped(b"<", &e, b">");
201201
if let Some(i) = self.indent.as_mut() {
202202
i.grow();
203203
}
204204
result
205205
}
206-
Event::End(ref e) => {
206+
Event::End(e) => {
207207
if let Some(i) = self.indent.as_mut() {
208208
i.shrink();
209209
}
210-
self.write_wrapped(b"</", e, b">")
210+
self.write_wrapped(b"</", &e, b">")
211211
}
212-
Event::Empty(ref e) => self.write_wrapped(b"<", e, b"/>"),
213-
Event::Text(ref e) => {
212+
Event::Empty(e) => self.write_wrapped(b"<", &e, b"/>"),
213+
Event::Text(e) => {
214214
next_should_line_break = false;
215-
self.write(e)
215+
self.write(&e)
216216
}
217-
Event::Comment(ref e) => self.write_wrapped(b"<!--", e, b"-->"),
218-
Event::CData(ref e) => {
217+
Event::Comment(e) => self.write_wrapped(b"<!--", &e, b"-->"),
218+
Event::CData(e) => {
219219
next_should_line_break = false;
220220
self.write(b"<![CDATA[")?;
221-
self.write(e)?;
221+
self.write(&e)?;
222222
self.write(b"]]>")
223223
}
224-
Event::Decl(ref e) => self.write_wrapped(b"<?", e, b"?>"),
225-
Event::PI(ref e) => self.write_wrapped(b"<?", e, b"?>"),
226-
Event::DocType(ref e) => self.write_wrapped(b"<!DOCTYPE ", e, b">"),
224+
Event::Decl(e) => self.write_wrapped(b"<?", &e, b"?>"),
225+
Event::PI(e) => self.write_wrapped(b"<?", &e, b"?>"),
226+
Event::DocType(e) => self.write_wrapped(b"<!DOCTYPE ", &e, b">"),
227227
Event::Eof => Ok(()),
228228
};
229229
if let Some(i) = self.indent.as_mut() {

src/writer/async_tokio.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,37 +9,37 @@ use crate::{ElementWriter, Writer};
99

1010
impl<W: AsyncWrite + Unpin> Writer<W> {
1111
/// Writes the given event to the underlying writer. Async version of [`Writer::write_event`].
12-
pub async fn write_event_async<'a, E: AsRef<Event<'a>>>(&mut self, event: E) -> Result<()> {
12+
pub async fn write_event_async<'a, E: Into<Event<'a>>>(&mut self, event: E) -> Result<()> {
1313
let mut next_should_line_break = true;
14-
let result = match *event.as_ref() {
15-
Event::Start(ref e) => {
16-
let result = self.write_wrapped_async(b"<", e, b">").await;
14+
let result = match event.into() {
15+
Event::Start(e) => {
16+
let result = self.write_wrapped_async(b"<", &e, b">").await;
1717
if let Some(i) = self.indent.as_mut() {
1818
i.grow();
1919
}
2020
result
2121
}
22-
Event::End(ref e) => {
22+
Event::End(e) => {
2323
if let Some(i) = self.indent.as_mut() {
2424
i.shrink();
2525
}
26-
self.write_wrapped_async(b"</", e, b">").await
26+
self.write_wrapped_async(b"</", &e, b">").await
2727
}
28-
Event::Empty(ref e) => self.write_wrapped_async(b"<", e, b"/>").await,
29-
Event::Text(ref e) => {
28+
Event::Empty(e) => self.write_wrapped_async(b"<", &e, b"/>").await,
29+
Event::Text(e) => {
3030
next_should_line_break = false;
31-
self.write_async(e).await
31+
self.write_async(&e).await
3232
}
33-
Event::Comment(ref e) => self.write_wrapped_async(b"<!--", e, b"-->").await,
34-
Event::CData(ref e) => {
33+
Event::Comment(e) => self.write_wrapped_async(b"<!--", &e, b"-->").await,
34+
Event::CData(e) => {
3535
next_should_line_break = false;
3636
self.write_async(b"<![CDATA[").await?;
37-
self.write_async(e).await?;
37+
self.write_async(&e).await?;
3838
self.write_async(b"]]>").await
3939
}
40-
Event::Decl(ref e) => self.write_wrapped_async(b"<?", e, b"?>").await,
41-
Event::PI(ref e) => self.write_wrapped_async(b"<?", e, b"?>").await,
42-
Event::DocType(ref e) => self.write_wrapped_async(b"<!DOCTYPE ", e, b">").await,
40+
Event::Decl(e) => self.write_wrapped_async(b"<?", &e, b"?>").await,
41+
Event::PI(e) => self.write_wrapped_async(b"<?", &e, b"?>").await,
42+
Event::DocType(e) => self.write_wrapped_async(b"<!DOCTYPE ", &e, b">").await,
4343
Event::Eof => Ok(()),
4444
};
4545
if let Some(i) = self.indent.as_mut() {

tests/unit_tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ fn test_writer_borrow() -> Result<()> {
191191
loop {
192192
match reader.read_event()? {
193193
Eof => break,
194-
e => assert!(writer.write_event(&e).is_ok()), // either `e` or `&e`
194+
e => assert!(writer.write_event(e.borrow()).is_ok()),
195195
}
196196
}
197197

0 commit comments

Comments
 (0)