From 589036c19409c7626a5bafda5af96c2fbc6a7de5 Mon Sep 17 00:00:00 2001 From: Ryan Leckey Date: Thu, 26 Jan 2017 19:02:13 -0800 Subject: Refactor the file source to allow for N formats; implement JSON. --- src/value.rs | 53 +++++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 26 deletions(-) (limited to 'src/value.rs') 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), + Array(Vec), } 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> { - 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 { + 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 { - if let Value::Boolean(value) = *self { + pub fn as_bool(self) -> Option { + 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 { - if let Value::Integer(value) = *self { + pub fn as_int(self) -> Option { + 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 { - if let Value::Float(value) = *self { + pub fn as_float(self) -> Option { + 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 -- cgit v1.2.3