From a6fb2f92dc8d53660c1d2d066f146ef261052330 Mon Sep 17 00:00:00 2001 From: Ryan Leckey Date: Thu, 26 Jan 2017 00:09:41 -0800 Subject: Add some examples --- src/source.rs | 127 ---------------------------------------------------------- 1 file changed, 127 deletions(-) (limited to 'src/source.rs') diff --git a/src/source.rs b/src/source.rs index b608097..95785a6 100644 --- a/src/source.rs +++ b/src/source.rs @@ -1,135 +1,8 @@ -use std::fs; -use std::env; use std::error::Error; -use std::io::Read; use std::collections::HashMap; -use toml; - use value::Value; pub trait Source { fn build(&mut self) -> Result, Box>; } - -#[derive(Default)] -pub struct File { - // Basename of configuration file - name: String, - - // Namespace to restrict configuration from the file - namespace: Option, - - // A required File will error if it cannot be found - required: bool, -} - -impl File { - pub fn with_name(name: &str) -> File { - File { - name: name.into(), - required: true, - - ..Default::default() - } - } - - pub fn namespace(&mut self, namespace: &str) -> &mut File { - self.namespace = Some(namespace.into()); - self - } - - pub fn required(&mut self, required: bool) -> &mut File { - self.required = required; - self - } -} - -fn collect(content: &mut HashMap, table: &toml::Table, prefix: Option) { - for (key, value) in table { - // Construct full key from prefix - let key = if let Some(ref prefix) = prefix { - prefix.clone() + "." + key - } else { - key.clone() - }; - - match *value { - // Recurse into nested table - toml::Value::Table(ref table) => collect(content, table, Some(key)), - - toml::Value::String(ref value) => { - content.insert(key, value.clone().into()); - } - - toml::Value::Integer(value) => { - content.insert(key, value.into()); - } - - toml::Value::Float(value) => { - content.insert(key, value.into()); - } - - toml::Value::Boolean(value) => { - content.insert(key, value.into()); - } - - _ => { - // Unhandled - } - } - } -} - -impl Source for File { - fn build(&mut self) -> Result, Box> { - let mut content = HashMap::new(); - - // Find file - // TODO: Use a nearest algorithm rather than strictly CWD - let cwd = match env::current_dir() { - Ok(cwd) => cwd, - Err(err) => { - if self.required { - return Err(From::from(err)); - } else { - return Ok(content); - } - } - }; - - let filename = cwd.join(self.name.clone() + ".toml"); - - // Read contents from file - let mut file = match fs::File::open(filename) { - Ok(file) => file, - Err(err) => { - if self.required { - return Err(From::from(err)); - } else { - return Ok(content); - } - } - }; - - let mut buffer = String::new(); - let res = file.read_to_string(&mut buffer); - if res.is_err() { - if self.required { - return Err(From::from(res.err().unwrap())); - } else { - return Ok(content); - } - } - - // Parse - let mut parser = toml::Parser::new(&buffer); - // TODO: Get a solution to make this return an Error-able - let document = parser.parse().unwrap(); - - // Iterate through document and fill content - collect(&mut content, &document, None); - - Ok(content) - } -} -- cgit v1.2.3