A personal rust firmware for the Badger 2040 W
at main 1.7 kB view raw
1use core::fmt::Arguments; 2use heapless::String; 3 4/// Makes it easier to format strings in a single line method 5pub fn easy_format<const N: usize>(args: Arguments<'_>) -> String<N> { 6 let mut formatted_string: String<N> = String::<N>::new(); 7 let result = core::fmt::write(&mut formatted_string, args); 8 match result { 9 Ok(_) => formatted_string, 10 Err(_) => { 11 panic!("Error formatting the string") 12 } 13 } 14} 15 16pub fn easy_format_str<'a>( 17 args: Arguments<'_>, 18 buffer: &'a mut [u8], 19) -> Result<&'a str, core::fmt::Error> { 20 let mut writer = BufWriter::new(buffer); 21 let result = core::fmt::write(&mut writer, args); 22 23 match result { 24 Ok(_) => { 25 let len = writer.len(); 26 let response_str = core::str::from_utf8(&buffer[..len]).unwrap(); 27 Ok(response_str) 28 } 29 Err(_) => { 30 panic!("Error formatting the string") 31 } 32 } 33} 34 35// A simple wrapper struct to use core::fmt::Write on a [u8] buffer 36pub struct BufWriter<'a> { 37 buf: &'a mut [u8], 38 pos: usize, 39} 40 41impl<'a> BufWriter<'a> { 42 pub fn new(buf: &'a mut [u8]) -> Self { 43 BufWriter { buf, pos: 0 } 44 } 45 46 pub fn len(&self) -> usize { 47 self.pos 48 } 49} 50 51impl<'a> core::fmt::Write for BufWriter<'a> { 52 fn write_str(&mut self, s: &str) -> core::fmt::Result { 53 let bytes = s.as_bytes(); 54 if self.pos + bytes.len() > self.buf.len() { 55 return Err(core::fmt::Error); // Buffer overflow 56 } 57 58 self.buf[self.pos..self.pos + bytes.len()].copy_from_slice(bytes); 59 self.pos += bytes.len(); 60 Ok(()) 61 } 62}