use super::JValue;
use crate::{JsonString, Map};
use serde_json::Number;
use std::borrow::Cow;
use std::collections::HashMap;
use std::rc::Rc;
use std::string::String;
use std::vec::Vec;
macro_rules! from_integer {
($($ty:ident)*) => {
$(
impl From<$ty> for JValue {
fn from(n: $ty) -> Self {
JValue::Number(n.into())
}
}
)*
};
}
from_integer! {
i8 i16 i32 i64 isize
u8 u16 u32 u64 usize
}
impl From<f32> for JValue {
fn from(f: f32) -> Self {
Number::from_f64(f as _).map_or(JValue::Null, JValue::Number)
}
}
impl From<f64> for JValue {
fn from(f: f64) -> Self {
Number::from_f64(f).map_or(JValue::Null, JValue::Number)
}
}
impl From<bool> for JValue {
fn from(f: bool) -> Self {
JValue::Bool(f)
}
}
impl From<String> for JValue {
fn from(f: String) -> Self {
JValue::String(f.into())
}
}
impl From<JsonString> for JValue {
fn from(f: JsonString) -> Self {
JValue::String(f)
}
}
impl From<&str> for JValue {
fn from(f: &str) -> Self {
JValue::String(f.into())
}
}
impl<'a> From<Cow<'a, str>> for JValue {
fn from(f: Cow<'a, str>) -> Self {
JValue::String(f.into())
}
}
impl From<Number> for JValue {
fn from(f: Number) -> Self {
JValue::Number(f)
}
}
impl From<Map<JsonString, JValue>> for JValue {
fn from(f: Map<JsonString, JValue>) -> Self {
JValue::Object(f.into())
}
}
impl<K: Into<JsonString>, V: Into<JValue>> From<HashMap<K, V>> for JValue {
fn from(f: HashMap<K, V>) -> Self {
JValue::object_from_pairs(f)
}
}
impl<T: Into<JValue>> From<Vec<T>> for JValue {
fn from(f: Vec<T>) -> Self {
JValue::Array(f.into_iter().map(Into::into).collect())
}
}
impl<T: Clone + Into<JValue>> From<&[T]> for JValue {
fn from(f: &[T]) -> Self {
JValue::Array(f.iter().cloned().map(Into::into).collect())
}
}
impl<T: Into<JValue>> FromIterator<T> for JValue {
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
JValue::Array(iter.into_iter().map(Into::into).collect())
}
}
impl<K: Into<JsonString>, V: Into<JValue>> FromIterator<(K, V)> for JValue {
fn from_iter<I: IntoIterator<Item = (K, V)>>(iter: I) -> Self {
JValue::Object(Rc::new(
iter.into_iter()
.map(|(k, v)| (k.into(), v.into()))
.collect(),
))
}
}
impl From<()> for JValue {
#[inline]
fn from((): ()) -> Self {
JValue::Null
}
}
impl<T> From<Option<T>> for JValue
where
T: Into<JValue>,
{
fn from(opt: Option<T>) -> Self {
match opt {
None => JValue::Null,
Some(value) => Into::into(value),
}
}
}
impl From<&serde_json::Value> for JValue {
fn from(value: &serde_json::Value) -> Self {
use serde_json::Value;
match value {
Value::Null => JValue::Null,
Value::Bool(b) => JValue::Bool(*b),
Value::Number(n) => JValue::Number(n.clone()),
Value::String(s) => JValue::String(s.as_str().into()),
Value::Array(a) => JValue::Array(a.iter().map(Into::into).collect()),
Value::Object(o) => {
let oo = Map::from_iter(o.into_iter().map(|(k, v)| (k.as_str().into(), v.into())));
JValue::Object(oo.into())
}
}
}
}
impl From<serde_json::Value> for JValue {
#[inline]
fn from(value: serde_json::Value) -> Self {
Self::from(&value)
}
}