summaryrefslogtreecommitdiffstats
path: root/src/value.rs
diff options
context:
space:
mode:
authorRyan Leckey <leckey.ryan@gmail.com>2017-02-02 23:16:53 -0800
committerRyan Leckey <leckey.ryan@gmail.com>2017-02-02 23:16:53 -0800
commit2107b3f0b58a111f42ce1a2d6c7d318155912f05 (patch)
tree43f9c894f4816def6d1e72f165ea04944fcd2bc1 /src/value.rs
parent115fe07e2c11aa72e91a5ce9b028ed1c1ff7d806 (diff)
Add slice support and auto conversion of hash/slice sets
Diffstat (limited to 'src/value.rs')
-rw-r--r--src/value.rs37
1 files changed, 34 insertions, 3 deletions
diff --git a/src/value.rs b/src/value.rs
index 5228d91..528e1a9 100644
--- a/src/value.rs
+++ b/src/value.rs
@@ -80,6 +80,13 @@ impl Value {
_ => None
}
}
+ /// Gets the underlying type as a slice; only works if the type is actually a slice.
+ pub fn as_slice(&self) -> Option<&[Value]> {
+ match *self {
+ Value::Array(ref value) => Some(value),
+ _ => None
+ }
+ }
}
// Generalized construction from type into variant is needed
@@ -115,8 +122,32 @@ impl From<bool> for Value {
}
}
-impl From<HashMap<String, Value>> for Value {
- fn from(value: HashMap<String, Value>) -> Value {
- Value::Table(value)
+// impl From<HashMap<String, Value>> for Value {
+// fn from(value: HashMap<String, Value>) -> Value {
+// Value::Table(value)
+// }
+// }
+
+impl<T> From<HashMap<String, T>> for Value where T: Into<Value> {
+ fn from(values: HashMap<String, T>) -> Value {
+ let mut r = HashMap::new();
+
+ for (k, v) in values {
+ r.insert(k.clone(), v.into());
+ }
+
+ Value::Table(r)
+ }
+}
+
+impl<T> From<Vec<T>> for Value where T: Into<Value> {
+ fn from(values: Vec<T>) -> Value {
+ let mut l = Vec::new();
+
+ for v in values {
+ l.push(v.into());
+ }
+
+ Value::Array(l)
}
}