use core::fmt::{self, Debug, Display, Write};
const CAP: usize = 256;
pub(crate) struct FmtBuf {
bytes: [u8; CAP],
len: usize,
}
impl FmtBuf {
pub(crate) const fn new() -> Self {
Self {
bytes: [0; CAP],
len: 0,
}
}
pub(crate) fn as_str(&self) -> &str {
core::str::from_utf8(&self.bytes[..self.len]).unwrap_or("")
}
}
impl Write for FmtBuf {
fn write_str(&mut self, s: &str) -> fmt::Result {
let end = self.len + s.len();
let slot = self.bytes.get_mut(self.len..end).ok_or(fmt::Error)?;
slot.copy_from_slice(s.as_bytes());
self.len = end;
Ok(())
}
}
pub(crate) fn display(value: impl Display) -> FmtBuf {
let mut buf = FmtBuf::new();
let _ = write!(buf, "{value}");
buf
}
pub(crate) fn debug(value: impl Debug) -> FmtBuf {
let mut buf = FmtBuf::new();
let _ = write!(buf, "{value:?}");
buf
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn fmt_buf_collects_written_text() {
let mut buf = FmtBuf::new();
write!(buf, "ab{}", 12).unwrap();
assert_eq!(buf.as_str(), "ab12");
}
#[test]
fn display_and_debug_render() {
assert_eq!(display(42_u32).as_str(), "42");
assert_eq!(debug("x").as_str(), "\"x\"");
}
#[test]
fn fmt_buf_rejects_overflow() {
let mut buf = FmtBuf::new();
let oversized = [b'x'; CAP + 1];
let oversized = core::str::from_utf8(&oversized).unwrap_or("");
assert!(write!(buf, "{oversized}").is_err());
}
}