use super::builder::{arr, float, int, null, str};
use super::value::JsonValue;
pub trait ToJson {
fn to_json(&self) -> JsonValue;
}
impl ToJson for String {
#[inline]
fn to_json(&self) -> JsonValue {
str(self)
}
}
impl ToJson for &str {
#[inline]
fn to_json(&self) -> JsonValue {
str(*self)
}
}
impl ToJson for std::borrow::Cow<'_, str> {
#[inline]
fn to_json(&self) -> JsonValue {
str(self.as_ref())
}
}
impl ToJson for i8 {
#[inline]
fn to_json(&self) -> JsonValue {
int(i64::from(*self))
}
}
impl ToJson for i16 {
#[inline]
fn to_json(&self) -> JsonValue {
int(i64::from(*self))
}
}
impl ToJson for i32 {
#[inline]
fn to_json(&self) -> JsonValue {
int(i64::from(*self))
}
}
impl ToJson for i64 {
#[inline]
fn to_json(&self) -> JsonValue {
int(*self)
}
}
impl ToJson for isize {
#[inline]
fn to_json(&self) -> JsonValue {
int(*self as i64)
}
}
impl ToJson for u8 {
#[inline]
fn to_json(&self) -> JsonValue {
int(i64::from(*self))
}
}
impl ToJson for u16 {
#[inline]
fn to_json(&self) -> JsonValue {
int(i64::from(*self))
}
}
impl ToJson for u32 {
#[inline]
fn to_json(&self) -> JsonValue {
int(i64::from(*self))
}
}
impl ToJson for u64 {
#[inline]
fn to_json(&self) -> JsonValue {
int(*self as i64)
}
}
impl ToJson for usize {
#[inline]
fn to_json(&self) -> JsonValue {
int(*self as i64)
}
}
impl ToJson for f32 {
#[inline]
fn to_json(&self) -> JsonValue {
float(f64::from(*self))
}
}
impl ToJson for f64 {
#[inline]
fn to_json(&self) -> JsonValue {
float(*self)
}
}
impl ToJson for bool {
#[inline]
fn to_json(&self) -> JsonValue {
super::builder::bool(*self)
}
}
impl<T: ToJson> ToJson for Option<T> {
#[inline]
fn to_json(&self) -> JsonValue {
self.as_ref().map_or_else(null, ToJson::to_json)
}
}
impl<T: ToJson> ToJson for Vec<T> {
#[inline]
fn to_json(&self) -> JsonValue {
let mut result = arr();
for item in self {
result = result.push(item.to_json());
}
result
}
}
impl<T: ToJson> ToJson for &[T] {
#[inline]
fn to_json(&self) -> JsonValue {
let mut result = arr();
for item in *self {
result = result.push(item.to_json());
}
result
}
}
impl<T: ToJson, const N: usize> ToJson for [T; N] {
#[inline]
fn to_json(&self) -> JsonValue {
let mut result = arr();
for item in self {
result = result.push(item.to_json());
}
result
}
}
impl ToJson for JsonValue {
#[inline]
fn to_json(&self) -> JsonValue {
self.clone()
}
}
impl<T: ToJson + ?Sized> ToJson for &T {
#[inline]
fn to_json(&self) -> JsonValue {
(*self).to_json()
}
}
impl<T: ToJson + ?Sized> ToJson for &mut T {
#[inline]
fn to_json(&self) -> JsonValue {
(**self).to_json()
}
}
impl<T: ToJson + ?Sized> ToJson for Box<T> {
#[inline]
fn to_json(&self) -> JsonValue {
(**self).to_json()
}
}
impl<T: ToJson> ToJson for std::rc::Rc<T> {
#[inline]
fn to_json(&self) -> JsonValue {
(**self).to_json()
}
}
impl<T: ToJson> ToJson for std::sync::Arc<T> {
#[inline]
fn to_json(&self) -> JsonValue {
(**self).to_json()
}
}