pub trait Writer {
// Required methods
fn write_byte(&mut self, byte: u8) -> Result<(), SerializeError>;
fn write_bytes(&mut self, bytes: &[u8]) -> Result<(), SerializeError>;
}Expand description
A trait for writing bytes during serialization with error handling.
This trait enables custom serialization targets that can report errors, such as buffer overflow. It’s designed to support use cases like buffer pooling where you need to detect when a fixed-size buffer is too small.
§Example
use facet_format_postcard::{Writer, SerializeError};
struct PooledWriter {
buf: Vec<u8>, // In practice, this would be from a buffer pool
overflow: Option<Vec<u8>>,
}
impl Writer for PooledWriter {
fn write_byte(&mut self, byte: u8) -> Result<(), SerializeError> {
// Try pooled buffer first, fall back to Vec on overflow
if let Some(ref mut overflow) = self.overflow {
overflow.push(byte);
} else if self.buf.len() < self.buf.capacity() {
self.buf.push(byte);
} else {
// Overflow - allocate Vec and transfer contents
let mut overflow = Vec::new();
overflow.extend_from_slice(&self.buf);
overflow.push(byte);
self.overflow = Some(overflow);
}
Ok(())
}
fn write_bytes(&mut self, bytes: &[u8]) -> Result<(), SerializeError> {
if let Some(ref mut overflow) = self.overflow {
overflow.extend_from_slice(bytes);
} else if self.buf.len() + bytes.len() <= self.buf.capacity() {
self.buf.extend_from_slice(bytes);
} else {
// Overflow - allocate Vec and transfer contents
let mut overflow = Vec::new();
overflow.extend_from_slice(&self.buf);
overflow.extend_from_slice(bytes);
self.overflow = Some(overflow);
}
Ok(())
}
}Required Methods§
Sourcefn write_byte(&mut self, byte: u8) -> Result<(), SerializeError>
fn write_byte(&mut self, byte: u8) -> Result<(), SerializeError>
Write a single byte to the writer.
Sourcefn write_bytes(&mut self, bytes: &[u8]) -> Result<(), SerializeError>
fn write_bytes(&mut self, bytes: &[u8]) -> Result<(), SerializeError>
Write a slice of bytes to the writer.