use super::Value; use crate::map::Map; use crate::number::Number; use alloc::borrow::Cow; use alloc::string::{String, ToString}; use alloc::vec::Vec; use core::iter::FromIterator; macro_rules! from_integer { ($($ty:ident)*) => { $( impl From<$ty> for Value { fn from(n: $ty) -> Self { Value::Number(n.into()) } } )* }; } from_integer! { i8 i16 i32 i64 isize u8 u16 u32 u64 usize } #[cfg(feature = "arbitrary_precision")] from_integer! { i128 u128 } impl From for Value { /// Convert 32-bit floating point number to `Value` /// /// # Examples /// /// ``` /// use serde_json::Value; /// /// let f: f32 = 13.37; /// let x: Value = f.into(); /// ``` fn from(f: f32) -> Self { From::from(f as f64) } } impl From for Value { /// Convert 64-bit floating point number to `Value` /// /// # Examples /// /// ``` /// use serde_json::Value; /// /// let f: f64 = 13.37; /// let x: Value = f.into(); /// ``` fn from(f: f64) -> Self { Number::from_f64(f).map_or(Value::Null, Value::Number) } } impl From for Value { /// Convert boolean to `Value` /// /// # Examples /// /// ``` /// use serde_json::Value; /// /// let b = false; /// let x: Value = b.into(); /// ``` fn from(f: bool) -> Self { Value::Bool(f) } } impl From for Value { /// Convert `String` to `Value` /// /// # Examples /// /// ``` /// use serde_json::Value; /// /// let s: String = "lorem".to_string(); /// let x: Value = s.into(); /// ``` fn from(f: String) -> Self { Value::String(f) } } impl<'a> From<&'a str> for Value { /// Convert string slice to `Value` /// /// # Examples /// /// ``` /// use serde_json::Value; /// /// let s: &str = "lorem"; /// let x: Value = s.into(); /// ``` fn from(f: &str) -> Self { Value::String(f.to_string()) } } impl<'a> From> for Value { /// Convert copy-on-write string to `Value` /// /// # Examples /// /// ``` /// use serde_json::Value; /// use std::borrow::Cow; /// /// let s: Cow = Cow::Borrowed("lorem"); /// let x: Value = s.into(); /// ``` /// /// ``` /// use serde_json::Value; /// use std::borrow::Cow; /// /// let s: Cow = Cow::Owned("lorem".to_string()); /// let x: Value = s.into(); /// ``` fn from(f: Cow<'a, str>) -> Self { Value::String(f.into_owned()) } } impl From for Value { /// Convert `Number` to `Value` /// /// # Examples /// /// ``` /// use serde_json::{Number, Value}; /// /// let n = Number::from(7); /// let x: Value = n.into(); /// ``` fn from(f: Number) -> Self { Value::Number(f) } } impl From> for Value { /// Convert map (with string keys) to `Value` /// /// # Examples /// /// ``` /// use serde_json::{Map, Value}; /// /// let mut m = Map::new(); /// m.insert("Lorem".to_string(), "ipsum".into()); /// let x: Value = m.into(); /// ``` fn from(f: Map) -> Self { Value::Object(f) } } impl> From> for Value { /// Convert a `Vec` to `Value` /// /// # Examples /// /// ``` /// use serde_json::Value; /// /// let v = vec!["lorem", "ipsum", "dolor"]; /// let x: Value = v.into(); /// ``` fn from(f: Vec) -> Self { Value::Array(f.into_iter().map(Into::into).collect()) } } impl<'a, T: Clone + Into> From<&'a [T]> for Value { /// Convert a slice to `Value` /// /// # Examples /// /// ``` /// use serde_json::Value; /// /// let v: &[&str] = &["lorem", "ipsum", "dolor"]; /// let x: Value = v.into(); /// ``` fn from(f: &'a [T]) -> Self { Value::Array(f.iter().cloned().map(Into::into).collect()) } } impl> FromIterator for Value { /// Convert an iteratable type to a `Value` /// /// # Examples /// /// ``` /// use serde_json::Value; /// /// let v = std::iter::repeat(42).take(5); /// let x: Value = v.collect(); /// ``` /// /// ``` /// use serde_json::Value; /// /// let v: Vec<_> = vec!["lorem", "ipsum", "dolor"]; /// let x: Value = v.into_iter().collect(); /// ``` /// /// ``` /// use std::iter::FromIterator; /// use serde_json::Value; /// /// let x: Value = Value::from_iter(vec!["lorem", "ipsum", "dolor"]); /// ``` fn from_iter>(iter: I) -> Self { Value::Array(iter.into_iter().map(Into::into).collect()) } } impl, V: Into> FromIterator<(K, V)> for Value { /// Convert an iteratable type to a `Value` /// /// # Examples /// /// ``` /// use serde_json::Value; /// /// let v: Vec<_> = vec![("lorem", 40), ("ipsum", 2)]; /// let x: Value = v.into_iter().collect(); /// ``` fn from_iter>(iter: I) -> Self { Value::Object( iter.into_iter() .map(|(k, v)| (k.into(), v.into())) .collect(), ) } } impl From<()> for Value { /// Convert `()` to `Value` /// /// # Examples /// /// ``` /// use serde_json::Value; /// /// let u = (); /// let x: Value = u.into(); /// ``` fn from((): ()) -> Self { Value::Null } } impl From> for Value where T: Into, { fn from(opt: Option) -> Self { match opt { None => Value::Null, Some(value) => Into::into(value), } } }