#![cfg_attr(not(feature = "std"), no_std)]
mod error;
pub use error::Error;
mod types;
pub mod helpers;
pub trait EncodeStr {
fn len(&self) -> usize;
fn write(&self, buff: &mut [u8]) -> Result<usize, Error>;
fn write_str<'a>(&self, buff: &'a mut [u8]) -> Result<&'a str, Error> {
let n = self.write(buff)?;
core::str::from_utf8(&buff[..n]).map_err(|_| Error::InvalidUtf8)
}
}
impl <T: EncodeStr> EncodeStr for &T {
fn len(&self) -> usize {
<T as EncodeStr>::len(self)
}
fn write(&self, buff: &mut [u8]) -> Result<usize, Error> {
<T as EncodeStr>::write(self, buff)
}
}
#[macro_export]
macro_rules! write {
($b:expr, $($t:expr),+) => {
|buff: &mut [u8]| -> Result<usize, $crate::Error>{
let mut n = 0;
$(
n += EncodeStr::write(& $t, &mut buff[n..])?;
)*
Ok(n)
}(&mut $b)
}
}
#[macro_export]
macro_rules! write_str {
($b:expr, $($t:expr),+) => {
$crate::write!($b, $($t),+).map(|n| {
core::str::from_utf8(& $b[..n]).unwrap()
})
}
}
#[cfg(test)]
mod test {
use crate::{EncodeStr};
#[test]
fn join_str() {
let mut buff = [0u8; 32];
let n = write!(buff, "a", ' ', "b", ' ', "c").unwrap();
assert_eq!(n, 5);
assert_eq!(&buff[..n], b"a b c");
}
#[test]
fn join_ints() {
let mut buff = [0u8; 32];
let n = write!(buff, 12u8, '/', 100u8).unwrap();
assert_eq!(n, 6);
assert_eq!(&buff[..n], b"12/100");
}
}