You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by kr...@apache.org on 2026/02/18 14:49:17 UTC
(avro-rs) 01/01: feat: Add support for resetting a Writer back by a clearable buffer
This is an automated email from the ASF dual-hosted git repository.
kriskras99 pushed a commit to branch feat/resetable_writer
in repository https://gitbox.apache.org/repos/asf/avro-rs.git
commit 78e56f1ce27e3573e5ed8c4b5f89d541eb56b384
Author: Kriskras99 <gi...@kriskras99.nl>
AuthorDate: Wed Feb 18 14:48:42 2026 +0000
feat: Add support for resetting a Writer back by a clearable buffer
---
avro/src/writer.rs | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 81 insertions(+)
diff --git a/avro/src/writer.rs b/avro/src/writer.rs
index c8e02c8..2c9a88a 100644
--- a/avro/src/writer.rs
+++ b/avro/src/writer.rs
@@ -542,6 +542,60 @@ impl<'a, W: Write> Writer<'a, W> {
}
}
+/// A buffer that can be cleared.
+pub trait Clearable {
+ /// Clear the buffer, keeping the capacity.
+ fn clear(&mut self);
+}
+
+impl Clearable for Vec<u8> {
+ fn clear(&mut self) {
+ self.clear();
+ }
+}
+
+impl<'a, W: Clearable + Write> Writer<'a, W> {
+ /// Reset the writer.
+ ///
+ /// This will clear the underlying writer and the internal buffer.
+ /// It will also clear any user metadata added.
+ ///
+ /// # Example
+ /// ```
+ /// # use apache_avro::{Writer, Schema, Error};
+ /// # let schema = Schema::Boolean;
+ /// # let values = [true, false];
+ /// # fn send(_: &Vec<u8>) {}
+ /// let mut writer = Writer::new(&schema, Vec::new())?;
+ ///
+ /// // Write some values
+ /// for value in values {
+ /// writer.append_value(value)?;
+ /// }
+ ///
+ /// // Flush the buffer and only then do something with buffer
+ /// writer.flush()?;
+ /// send(writer.get_ref());
+ ///
+ /// // Reset the writer
+ /// writer.reset();
+ ///
+ /// // Write some values again
+ /// for value in values {
+ /// writer.append(value)?;
+ /// }
+ ///
+ /// # Ok::<(), Error>(())
+ /// ```
+ pub fn reset(&mut self) {
+ self.buffer.clear();
+ self.writer.clear();
+ self.has_header = false;
+ self.num_values = 0;
+ self.user_metadata.clear();
+ }
+}
+
impl<W: Write> Drop for Writer<'_, W> {
/// Drop the writer, will try to flush ignoring any errors.
fn drop(&mut self) {
@@ -1858,4 +1912,31 @@ mod tests {
Ok(())
}
+
+ #[test]
+ fn avro_rs_469_reset_writer() -> TestResult {
+ let schema = Schema::Boolean;
+ let values = [true, false, true, false];
+ let mut writer = Writer::new(&schema, Vec::new())?;
+
+ for value in values {
+ writer.append_value(value)?;
+ }
+
+ writer.flush()?;
+ let first_buffer = writer.get_ref().clone();
+
+ writer.reset();
+ assert_eq!(writer.get_ref().len(), 0);
+
+ for value in values {
+ writer.append_value(value)?;
+ }
+
+ writer.flush()?;
+ let second_buffer = writer.get_ref().clone();
+ assert_eq!(first_buffer, second_buffer);
+
+ Ok(())
+ }
}