debug3 0.4.1

Space Efficient Pretty Printer
Documentation
use serde_json::{
    map::{OccupiedEntry, VacantEntry},
    Map, Number, Value,
};

use crate::{Debug, Formatter};

impl Debug for Value {
    fn fmt(&self, f: &mut Formatter) {
        match self {
            Value::Null => f.debug_tuple("Null").finish(),
            Value::Bool(v) => f.debug_tuple("Bool").field(&v).finish(),
            Value::Number(v) => v.fmt(f),
            Value::String(v) => f.debug_tuple("String").field(v).finish(),
            Value::Array(v) => f.debug_named_list("Array").entries(v).finish(),
            Value::Object(v) => v.fmt(f),
        }
    }
}

impl Debug for Map<String, Value> {
    fn fmt(&self, f: &mut Formatter) {
        let mut m = f.debug_struct("Object");
        for (k, v) in self {
            m.field(k, v);
        }
        m.finish()
    }
}

impl Debug for Number {
    fn fmt(&self, f: &mut Formatter) {
        let mut n = f.debug_tuple("Number");
        if let Some(i) = self.as_i64() {
            n.field(&i);
        } else if let Some(i) = self.as_u64() {
            n.field(&i);
        } else if let Some(f) = self.as_f64() {
            n.field(&f);
        } else {
            struct UnsupportedNumber;
            impl Debug for UnsupportedNumber {
                fn fmt(&self, f: &mut Formatter) {
                    f.word("UnsupportedNumber");
                }
            }
            n.field(&UnsupportedNumber);
        }
        n.finish()
    }
}

impl Debug for VacantEntry<'_> {
    fn fmt(&self, f: &mut Formatter) {
        f.debug_tuple("VacantEntry").field(&self.key()).finish()
    }
}

impl Debug for OccupiedEntry<'_> {
    fn fmt(&self, f: &mut Formatter) {
        f.debug_struct("OccupiedEntry")
            .field("key", self.key())
            .field("value", self.get())
            .finish()
    }
}