Skip to main content

nanvm_lib/vm/string/
debug.rs

1use crate::vm::{IVm, String};
2use core::{
3    fmt::{Debug, Formatter, Result, Write},
4    ops::RangeInclusive,
5};
6
7impl<A: IVm> Debug for String<A> {
8    fn fmt(&self, f: &mut Formatter<'_>) -> Result {
9        const DOUBLE_QUOTE: u16 = '"' as u16;
10        const BACKSLASH: u16 = '\\' as u16;
11        const PRINTABLE_ASCII: RangeInclusive<u16> = 0x20..=0x7F;
12        f.write_char('"')?;
13        for i in self.clone().into_iter() {
14            match i {
15                DOUBLE_QUOTE => f.write_str("\\\"")?,
16                BACKSLASH => f.write_str("\\\\")?,
17                c => {
18                    if PRINTABLE_ASCII.contains(&c) {
19                        f.write_char(c as u8 as char)?;
20                    } else {
21                        write!(f, "\\u{c:04X}")?;
22                    }
23                }
24            }
25        }
26        f.write_char('"')
27    }
28}