diff options
-rw-r--r-- | src/value.rs | 66 |
1 files changed, 40 insertions, 26 deletions
diff --git a/src/value.rs b/src/value.rs index 83be066..5efdb92 100644 --- a/src/value.rs +++ b/src/value.rs @@ -1,6 +1,7 @@ //! Definition of a TOML value -use std::collections::BTreeMap; +use std::collections::{BTreeMap, HashMap}; +use std::hash::Hash; use std::fmt; use std::ops; use std::str::FromStr; @@ -219,48 +220,61 @@ impl<I> ops::IndexMut<I> for Value where I: Index { } } -impl From<String> for Value { - fn from(val: String) -> Value { - Value::String(val) +impl<'a> From<&'a str> for Value { + #[inline] + fn from(val: &'a str) -> Value { + Value::String(val.to_string()) } } -impl From<i64> for Value { - fn from(val: i64) -> Value { - Value::Integer(val) +impl<V: Into<Value>> From<Vec<V>> for Value { + fn from(val: Vec<V>) -> Value { + Value::Array(val.into_iter().map(|v| v.into()).collect()) } } -impl From<f64> for Value { - fn from(val: f64) -> Value { - Value::Float(val) - } -} +impl<S: Into<String>, V: Into<Value>> From<BTreeMap<S, V>> for Value { + fn from(val: BTreeMap<S, V>) -> Value { + let table = val.into_iter() + .map(|(s, v)| (s.into(), v.into())) + .collect(); -impl From<bool> for Value { - fn from(val: bool) -> Value { - Value::Boolean(val) + Value::Table(table) } } -impl From<Array> for Value { - fn from(val: Array) -> Value { - Value::Array(val) - } -} +impl<S: Into<String> + Hash + Eq, V: Into<Value>> From<HashMap<S, V>> for Value { + fn from(val: HashMap<S, V>) -> Value { + let table = val.into_iter() + .map(|(s, v)| (s.into(), v.into())) + .collect(); -impl From<Table> for Value { - fn from(val: Table) -> Value { - Value::Table(val) + Value::Table(table) } } -impl From<Datetime> for Value { - fn from(val: Datetime) -> Value { - Value::Datetime(val) +macro_rules! impl_into_value { + ($variant:ident : $T:ty) => { + impl From<$T> for Value { + #[inline] + fn from(val: $T) -> Value { + Value::$variant(val.into()) + } + } } } +impl_into_value!(String: String); +impl_into_value!(Integer: i64); +impl_into_value!(Integer: i32); +impl_into_value!(Integer: i8); +impl_into_value!(Integer: u8); +impl_into_value!(Integer: u32); +impl_into_value!(Float: f64); +impl_into_value!(Float: f32); +impl_into_value!(Boolean: bool); +impl_into_value!(Datetime: Datetime); + /// Types that can be used to index a `toml::Value` /// /// Currently this is implemented for `usize` to index arrays and `str` to index |