summaryrefslogtreecommitdiffstats
path: root/src/source.rs
diff options
context:
space:
mode:
authorRyan Leckey <leckey.ryan@gmail.com>2017-01-26 00:09:41 -0800
committerRyan Leckey <leckey.ryan@gmail.com>2017-01-26 00:09:41 -0800
commita6fb2f92dc8d53660c1d2d066f146ef261052330 (patch)
treed66d90b8e563f0df6bee8563847ba9e67edfa9b7 /src/source.rs
parent7c696e6b457debb0faca4fdb0d55e3ed43773484 (diff)
Add some examples
Diffstat (limited to 'src/source.rs')
-rw-r--r--src/source.rs127
1 files changed, 0 insertions, 127 deletions
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<HashMap<String, Value>, Box<Error>>;
}
-
-#[derive(Default)]
-pub struct File {
- // Basename of configuration file
- name: String,
-
- // Namespace to restrict configuration from the file
- namespace: Option<String>,
-
- // 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<String, Value>, table: &toml::Table, prefix: Option<String>) {
- 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<HashMap<String, Value>, Box<Error>> {
- 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)
- }
-}