pub mod minify;
pub mod pretty;
use super::access::number::ToNumberRepresentation;
pub trait JsoncFormatter {
fn write_bool<W: std::io::Write>(&mut self, write: &mut W, value: bool) -> crate::Result<()> {
Ok(write.write_all(if value { b"true" } else { b"false" })?)
}
fn write_null<W: std::io::Write>(&mut self, write: &mut W) -> crate::Result<()> {
Ok(write.write_all(b"null")?)
}
fn write_number<W: std::io::Write, N: ToNumberRepresentation>(
&mut self,
write: &mut W,
value: N,
) -> crate::Result<()>
where
crate::Error: From<N::Err>,
{
Ok(write.write_all(&value.to_number_representation()?)?)
}
fn write_str<W: std::io::Write>(&mut self, write: &mut W, value: &str) -> crate::Result<()> {
write.write_all(b"\"")?;
for &b in value.as_bytes() {
match b {
b'"' => write.write_all(br#"""#)?,
b'\\' => write.write_all(br"\\")?,
b'/' => write.write_all(br"/")?,
b'\x08' => write.write_all(br"\b")?,
b'\x0C' => write.write_all(br"\f")?,
b'\n' => write.write_all(br"\n")?,
b'\r' => write.write_all(br"\r")?,
b'\t' => write.write_all(br"\t")?,
b if b.is_ascii_control() => {
let (big, little) = (b >> 4, b & 0x0F);
let bb = if big < 10 { b'0' + big } else { b'A' + big - 10 };
let lb = if little < 10 { b'0' + little } else { b'A' + little - 10 };
write.write_all(&[b'\\', b'u', b'0', b'0', bb, lb])?
}
b => write.write_all(&[b])?,
};
}
Ok(write.write_all(b"\"")?)
}
fn write_array_start<W: std::io::Write>(&mut self, write: &mut W) -> crate::Result<()> {
self.write_array_start_super(write)
}
fn write_array_start_super<W: std::io::Write>(&mut self, write: &mut W) -> crate::Result<()> {
Ok(write.write_all(b"[")?)
}
fn write_array_value_start<W: std::io::Write>(
&mut self,
write: &mut W,
index: usize,
len: Option<usize>,
) -> crate::Result<()> {
self.write_array_value_start_super(write, index, len)
}
fn write_array_value_start_super<W: std::io::Write>(
&mut self,
_write: &mut W,
_index: usize,
_len: Option<usize>,
) -> crate::Result<()> {
Ok(())
}
fn write_array_value_end<W: std::io::Write>(
&mut self,
write: &mut W,
index: usize,
len: Option<usize>,
) -> crate::Result<()> {
self.write_array_value_end_super(write, index, len)
}
fn write_array_value_end_super<W: std::io::Write>(
&mut self,
write: &mut W,
index: usize,
len: Option<usize>,
) -> crate::Result<()> {
match len.map(|l| index + 1 < l) {
Some(true) => Ok(write.write_all(b",")?),
_ => Ok(()),
}
}
fn write_array_end<W: std::io::Write>(&mut self, write: &mut W) -> crate::Result<()> {
self.write_array_end_super(write)
}
fn write_array_end_super<W: std::io::Write>(&mut self, write: &mut W) -> crate::Result<()> {
Ok(write.write_all(b"]")?)
}
fn write_object_start<W: std::io::Write>(&mut self, write: &mut W) -> crate::Result<()> {
self.write_object_start_super(write)
}
fn write_object_start_super<W: std::io::Write>(&mut self, write: &mut W) -> crate::Result<()> {
Ok(write.write_all(b"{")?)
}
fn write_object_key_start<W: std::io::Write>(
&mut self,
write: &mut W,
index: usize,
len: Option<usize>,
) -> crate::Result<()> {
self.write_object_key_start_super(write, index, len)
}
fn write_object_key_start_super<W: std::io::Write>(
&mut self,
_write: &mut W,
_index: usize,
_len: Option<usize>,
) -> crate::Result<()> {
Ok(())
}
fn write_object_key_end<W: std::io::Write>(
&mut self,
write: &mut W,
index: usize,
len: Option<usize>,
) -> crate::Result<()> {
self.write_object_key_end_super(write, index, len)
}
fn write_object_key_end_super<W: std::io::Write>(
&mut self,
write: &mut W,
_index: usize,
_len: Option<usize>,
) -> crate::Result<()> {
Ok(write.write_all(b":")?)
}
fn write_object_value_start<W: std::io::Write>(
&mut self,
write: &mut W,
index: usize,
len: Option<usize>,
) -> crate::Result<()> {
self.write_object_value_start_super(write, index, len)
}
fn write_object_value_start_super<W: std::io::Write>(
&mut self,
_write: &mut W,
_index: usize,
_len: Option<usize>,
) -> crate::Result<()> {
Ok(())
}
fn write_object_value_end<W: std::io::Write>(
&mut self,
write: &mut W,
index: usize,
len: Option<usize>,
) -> crate::Result<()> {
self.write_object_value_end_super(write, index, len)
}
fn write_object_value_end_super<W: std::io::Write>(
&mut self,
write: &mut W,
index: usize,
len: Option<usize>,
) -> crate::Result<()> {
match len.map(|l| index + 1 < l) {
Some(true) => Ok(write.write_all(b",")?),
_ => Ok(()),
}
}
fn write_object_end<W: std::io::Write>(&mut self, write: &mut W) -> crate::Result<()> {
self.write_object_end_super(write)
}
fn write_object_end_super<W: std::io::Write>(&mut self, write: &mut W) -> crate::Result<()> {
Ok(write.write_all(b"}")?)
}
}