use core::fmt::Write;
use crate::BaseEncoder;
use crate::ByteEncoder;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Default)]
#[repr(transparent)]
pub struct SizeEncoder {
size: usize,
}
impl SizeEncoder {
#[inline]
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[inline]
#[must_use]
pub fn size(&self) -> usize {
(*self).into()
}
}
impl From<SizeEncoder> for usize {
#[inline]
fn from(encoder: SizeEncoder) -> usize {
encoder.size
}
}
impl Write for SizeEncoder {
#[inline]
fn write_str(&mut self, s: &str) -> core::fmt::Result {
self.size += s.len();
Ok(())
}
}
impl BaseEncoder for SizeEncoder {
type Error = core::convert::Infallible;
}
impl ByteEncoder for SizeEncoder {
#[inline]
fn put_slice(&mut self, slice: &[u8]) -> Result<(), Self::Error> {
self.size += slice.len();
Ok(())
}
#[inline]
fn put_byte(&mut self, _byte: u8) -> Result<(), Self::Error> {
self.size += 1;
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn assert_that_size_encoder_can_be_used_with_format_strings() {
let mut size_encoder = SizeEncoder::new();
let s = "hello world";
write!(size_encoder, "{s}").unwrap();
assert_eq!(size_encoder.size(), s.len());
}
}