use alloc::{borrow::Cow, borrow::ToOwned, boxed::Box, rc::Rc, string::String, vec::Vec};
use core::fmt::Display;
use crate::JsonFormatter;
pub trait DisplayJson {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result;
}
impl<T: DisplayJson + ?Sized> DisplayJson for &T {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
(**self).fmt(f)
}
}
impl<T: DisplayJson + ?Sized> DisplayJson for &mut T {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
(**self).fmt(f)
}
}
impl<T: DisplayJson + ?Sized> DisplayJson for Box<T> {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
(**self).fmt(f)
}
}
impl<T: DisplayJson + ?Sized> DisplayJson for Rc<T> {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
(**self).fmt(f)
}
}
#[cfg(target_has_atomic = "ptr")]
impl<T: DisplayJson + ?Sized> DisplayJson for alloc::sync::Arc<T> {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
(**self).fmt(f)
}
}
impl<T: DisplayJson> DisplayJson for Option<T> {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
if let Some(v) = self {
v.fmt(f)
} else {
write!(f.inner_mut(), "null")
}
}
}
impl DisplayJson for bool {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for i8 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for i16 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for i32 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for i64 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for i128 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for isize {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for u8 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for u16 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for u32 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for u64 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for u128 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for usize {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for core::num::NonZeroI8 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for core::num::NonZeroI16 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for core::num::NonZeroI32 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for core::num::NonZeroI64 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for core::num::NonZeroI128 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for core::num::NonZeroIsize {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for core::num::NonZeroU8 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for core::num::NonZeroU16 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for core::num::NonZeroU32 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for core::num::NonZeroU64 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for core::num::NonZeroU128 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for core::num::NonZeroUsize {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "{self}")
}
}
impl DisplayJson for f32 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
if self.is_finite() {
write!(f.inner_mut(), "{self}")
} else {
write!(f.inner_mut(), "null")
}
}
}
impl DisplayJson for f64 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
if self.is_finite() {
write!(f.inner_mut(), "{self}")
} else {
write!(f.inner_mut(), "null")
}
}
}
impl DisplayJson for char {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
f.string(self)
}
}
impl DisplayJson for str {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
f.string(self)
}
}
impl DisplayJson for String {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
f.string(self)
}
}
impl<'a, T: ?Sized + DisplayJson + ToOwned> DisplayJson for Cow<'a, T> {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
f.value(self.as_ref())
}
}
#[cfg(feature = "std")]
impl DisplayJson for std::path::Path {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
f.string(self.display())
}
}
#[cfg(feature = "std")]
impl DisplayJson for std::path::PathBuf {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
f.string(self.display())
}
}
#[cfg(feature = "std")]
impl DisplayJson for std::net::SocketAddr {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
f.string(self)
}
}
#[cfg(feature = "std")]
impl DisplayJson for std::net::SocketAddrV4 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
f.string(self)
}
}
#[cfg(feature = "std")]
impl DisplayJson for std::net::SocketAddrV6 {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
f.string(self)
}
}
#[cfg(feature = "std")]
impl DisplayJson for std::net::IpAddr {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
f.string(self)
}
}
#[cfg(feature = "std")]
impl DisplayJson for std::net::Ipv4Addr {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
f.string(self)
}
}
#[cfg(feature = "std")]
impl DisplayJson for std::net::Ipv6Addr {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
f.string(self)
}
}
impl<T: DisplayJson, const N: usize> DisplayJson for [T; N] {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
f.array(|f| f.elements(self.iter()))
}
}
impl<T: DisplayJson> DisplayJson for [T] {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
f.array(|f| f.elements(self.iter()))
}
}
impl<T: DisplayJson> DisplayJson for Vec<T> {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
f.array(|f| f.elements(self.iter()))
}
}
impl<T: DisplayJson> DisplayJson for alloc::collections::VecDeque<T> {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
f.array(|f| f.elements(self.iter()))
}
}
impl<T: DisplayJson> DisplayJson for alloc::collections::BTreeSet<T> {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
f.array(|f| f.elements(self.iter()))
}
}
#[cfg(feature = "std")]
impl<T: DisplayJson> DisplayJson for std::collections::HashSet<T> {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
f.array(|f| f.elements(self.iter()))
}
}
impl DisplayJson for () {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
write!(f.inner_mut(), "null")
}
}
impl<K: Display, V: DisplayJson> DisplayJson for alloc::collections::BTreeMap<K, V> {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
f.object(|f| f.members(self.iter()))
}
}
#[cfg(feature = "std")]
impl<K: Display, V: DisplayJson> DisplayJson for std::collections::HashMap<K, V> {
fn fmt(&self, f: &mut JsonFormatter<'_, '_>) -> core::fmt::Result {
f.object(|f| f.members(self.iter()))
}
}