Skip to main content

nanvm_lib/vm/string/
debug.rs

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