embedded_c_sdk_bind_hal/common/
format.rsuse core::cmp::min;
use core::fmt;
use core::str::from_utf8;
pub struct WriteTo<'a> {
buf: &'a mut [u8],
len: usize,
}
impl<'a> WriteTo<'a> {
pub fn new(buf: &'a mut [u8]) -> Self {
WriteTo { buf, len: 0 }
}
pub fn as_str(self) -> Option<&'a str> {
let min_len;
if self.len > self.buf.len() {
min_len = self.buf.len();
let tail = &mut self.buf[min_len - 3..];
tail.fill(b'.');
} else {
min_len = min(self.len, self.buf.len())
};
from_utf8(&self.buf[..min_len]).ok()
}
pub fn len(&self) -> usize {
min(self.len, self.buf.len())
}
pub fn is_empty(&self) -> bool {
self.len == 0
}
}
impl<'a> fmt::Write for WriteTo<'a> {
fn write_str(&mut self, s: &str) -> fmt::Result {
if self.len >= self.buf.len() {
return Err(fmt::Error);
}
let rem = &mut self.buf[self.len..];
let raw_s = s.as_bytes();
let num = min(raw_s.len(), rem.len());
rem[..num].copy_from_slice(&raw_s[..num]);
self.len += raw_s.len();
Ok(())
}
}
pub fn fmt_to_buf<'a>(buf: &'a mut [u8], arg: fmt::Arguments) -> Result<&'a str, fmt::Error> {
let mut w = WriteTo::new(buf);
if let Err(e) = fmt::write(&mut w, arg) {
if w.len() == 0 {
return Err(e);
}
}
w.as_str().ok_or(fmt::Error)
}