summaryrefslogtreecommitdiffstats
path: root/src/value.rs
diff options
context:
space:
mode:
authorRyan Leckey <leckey.ryan@gmail.com>2017-01-26 19:02:13 -0800
committerRyan Leckey <leckey.ryan@gmail.com>2017-01-26 19:02:13 -0800
commit589036c19409c7626a5bafda5af96c2fbc6a7de5 (patch)
tree9f4e09809df7c200c3d60b619c7eea9b91e6d70c /src/value.rs
parentd7ad51c8851fe3c845569760935fae1828e859b5 (diff)
Refactor the file source to allow for N formats; implement JSON.
Diffstat (limited to 'src/value.rs')
-rw-r--r--src/value.rs53
1 files changed, 27 insertions, 26 deletions
diff --git a/src/value.rs b/src/value.rs
index 52a2103..a887104 100644
--- a/src/value.rs
+++ b/src/value.rs
@@ -1,5 +1,5 @@
use std::convert::From;
-use std::borrow::Cow;
+use std::collections::HashMap;
/// A configuration value.
///
@@ -11,38 +11,39 @@ pub enum Value {
Integer(i64),
Float(f64),
Boolean(bool),
+ Table(HashMap<String, Value>),
+ Array(Vec<Value>),
}
impl Value {
/// Gets the underyling value as a string, performing a conversion only if neccessary.
- #[allow(needless_lifetimes)]
- pub fn as_str<'a>(&'a self) -> Option<Cow<'a, str>> {
- if let Value::String(ref value) = *self {
- Some(Cow::Borrowed(value))
- } else if let Value::Integer(value) = *self {
- Some(Cow::Owned(value.to_string()))
- } else if let Value::Float(value) = *self {
- Some(Cow::Owned(value.to_string()))
- } else if let Value::Boolean(value) = *self {
- Some(Cow::Owned(value.to_string()))
+ pub fn as_str(self) -> Option<String> {
+ if let Value::String(value) = self {
+ Some(value)
+ } else if let Value::Integer(value) = self {
+ Some(value.to_string())
+ } else if let Value::Float(value) = self {
+ Some(value.to_string())
+ } else if let Value::Boolean(value) = self {
+ Some(value.to_string())
} else {
None
}
}
/// Gets the underlying type as a boolean, performing a conversion only if neccessary.
- pub fn as_bool(&self) -> Option<bool> {
- if let Value::Boolean(value) = *self {
+ pub fn as_bool(self) -> Option<bool> {
+ if let Value::Boolean(value) = self {
Some(value)
- } else if let Value::String(ref value) = *self {
+ } else if let Value::String(ref value) = self {
match value.to_lowercase().as_ref() {
"1" | "true" | "on" | "yes" => Some(true),
"0" | "false" | "off" | "no" => Some(false),
_ => None,
}
- } else if let Value::Integer(value) = *self {
+ } else if let Value::Integer(value) = self {
Some(value != 0)
- } else if let Value::Float(value) = *self {
+ } else if let Value::Float(value) = self {
Some(value != 0.0)
} else {
None
@@ -50,14 +51,14 @@ impl Value {
}
/// Gets the underlying type as an integer, performing a conversion only if neccessary.
- pub fn as_int(&self) -> Option<i64> {
- if let Value::Integer(value) = *self {
+ pub fn as_int(self) -> Option<i64> {
+ if let Value::Integer(value) = self {
Some(value)
- } else if let Value::String(ref value) = *self {
+ } else if let Value::String(ref value) = self {
value.parse().ok()
- } else if let Value::Boolean(value) = *self {
+ } else if let Value::Boolean(value) = self {
Some(if value { 1 } else { 0 })
- } else if let Value::Float(value) = *self {
+ } else if let Value::Float(value) = self {
Some(value.round() as i64)
} else {
None
@@ -65,14 +66,14 @@ impl Value {
}
/// Gets the underlying type as a floating-point, performing a conversion only if neccessary.
- pub fn as_float(&self) -> Option<f64> {
- if let Value::Float(value) = *self {
+ pub fn as_float(self) -> Option<f64> {
+ if let Value::Float(value) = self {
Some(value)
- } else if let Value::String(ref value) = *self {
+ } else if let Value::String(ref value) = self {
value.parse().ok()
- } else if let Value::Integer(value) = *self {
+ } else if let Value::Integer(value) = self {
Some(value as f64)
- } else if let Value::Boolean(value) = *self {
+ } else if let Value::Boolean(value) = self {
Some(if value { 1.0 } else { 0.0 })
} else {
None