use std::fmt;
use std::io;
use serde::Serialize;
use crate::array::Array;
use crate::array::ItemSer;
use crate::map::KeyValuePairSer;
use crate::map::Map;
use crate::Expr;
use crate::Null;
struct WriterFormatter<'a, 'b: 'a> {
inner: &'a mut fmt::Formatter<'b>,
}
impl<'a, 'b> io::Write for WriterFormatter<'a, 'b> {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
let s = unsafe { std::str::from_utf8_unchecked(buf) };
self.inner.write_str(s).map_err(io_error)?;
Ok(buf.len())
}
fn flush(&mut self) -> io::Result<()> {
Ok(())
}
}
fn io_error(_: fmt::Error) -> io::Error {
io::Error::new(io::ErrorKind::Other, "fmt error")
}
impl<T: KeyValuePairSer> fmt::Display for Map<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let alternate = f.alternate();
let mut wr = WriterFormatter { inner: f };
if alternate {
serde_json::ser::to_writer_pretty(&mut wr, self).map_err(|_| fmt::Error)
} else {
serde_json::ser::to_writer(&mut wr, self).map_err(|_| fmt::Error)
}
}
}
impl<T: ItemSer> fmt::Display for Array<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let alternate = f.alternate();
let mut wr = WriterFormatter { inner: f };
if alternate {
serde_json::ser::to_writer_pretty(&mut wr, self).map_err(|_| fmt::Error)
} else {
serde_json::ser::to_writer(&mut wr, self).map_err(|_| fmt::Error)
}
}
}
impl<S: Serialize> fmt::Display for Expr<S> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let alternate = f.alternate();
let mut wr = WriterFormatter { inner: f };
if alternate {
serde_json::ser::to_writer_pretty(&mut wr, self).map_err(|_| fmt::Error)
} else {
serde_json::ser::to_writer(&mut wr, self).map_err(|_| fmt::Error)
}
}
}
impl fmt::Display for Null {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let alternate = f.alternate();
let mut wr = WriterFormatter { inner: f };
if alternate {
serde_json::ser::to_writer_pretty(&mut wr, self).map_err(|_| fmt::Error)
} else {
serde_json::ser::to_writer(&mut wr, self).map_err(|_| fmt::Error)
}
}
}