use crate::discrim::DiscriminantEncoding;
#[derive(Copy, Clone, Debug)]
pub enum WriteError {
SpaceExhausted,
InvalidArrayLength,
}
impl core::fmt::Display for WriteError {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
WriteError::SpaceExhausted => write!(f, "space exhausted"),
WriteError::InvalidArrayLength => write!(f, "invalid array length (too large)"),
}
}
}
impl core::error::Error for WriteError {}
pub type WriteResult<T = ()> = core::result::Result<T, WriteError>;
pub trait Writer<F> {
#[doc(hidden)]
fn write_opaque_fixed(&mut self, bytes: &[u8]) -> WriteResult<()>;
#[doc(hidden)]
fn write_opaque_unpadded(&mut self, bytes: &[u8]) -> WriteResult<()>;
#[doc(hidden)]
fn write_opaque_padding(&mut self, len: usize) -> WriteResult<()>;
fn write_opaque_variable(&mut self, bytes: &[u8]) -> WriteResult<()>;
fn write_i64(&mut self, n: i64) -> WriteResult<()>;
fn write_i32(&mut self, n: i32) -> WriteResult<()>;
fn write_i16(&mut self, n: i16) -> WriteResult<()>;
fn write_u64(&mut self, n: u64) -> WriteResult<()>;
fn write_u32(&mut self, n: u32) -> WriteResult<()>;
fn write_u16(&mut self, n: u16) -> WriteResult<()>;
fn write_bool(&mut self, b: bool) -> WriteResult<()>;
fn write_discriminant(&mut self, d: i32, encoding: DiscriminantEncoding) -> WriteResult<()> {
match encoding {
DiscriminantEncoding::Signed => self.write_i32(d),
DiscriminantEncoding::Unsigned => self.write_u32(d as u32),
DiscriminantEncoding::Bool => self.write_bool(d != 0),
}
}
fn write_f32(&mut self, n: f32) -> WriteResult<()>;
fn write_f64(&mut self, n: f64) -> WriteResult<()>;
}