1pub struct WritableBuf<'a> {
5 buf: &'a mut [u8],
6 offset: usize,
7}
8
9impl<'a> WritableBuf<'a> {
10 pub fn new(buf: &'a mut [u8]) -> Self {
11 WritableBuf { buf, offset: 0 }
12 }
13
14 pub fn len(&self) -> usize {
15 self.offset
16 }
17}
18
19impl<'a> core::fmt::Write for WritableBuf<'a> {
20 fn write_str(&mut self, s: &str) -> core::fmt::Result {
21 let bytes = s.as_bytes();
22 let rem = &mut self.buf[self.offset..];
23 if rem.len() < bytes.len() {
24 Err(core::fmt::Error)
25 } else {
26 let rem = &mut rem[..bytes.len()];
27 rem.copy_from_slice(bytes);
28 self.offset += bytes.len();
29 Ok(())
30 }
31 }
32}
33
34pub fn concat_str<'a>(buf: &'a mut [u8], str_list: &[&str]) -> &'a str {
36 let mut p = 0;
37 for s in str_list {
38 let bytes = s.as_bytes();
39 buf[p..p + bytes.len()].copy_from_slice(bytes);
40 p += bytes.len();
41 }
42 if buf.len() > p + 1 {
43 buf[p] = 0;
44 }
45 core::str::from_utf8(&buf[0..p]).unwrap()
46}