A personal rust firmware for the Badger 2040 W
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}