diff --git a/src/config.rs b/src/config.rs index 2517b22..f852b03 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,6 +1,11 @@ -// use std::path::Path; +use std::default::Default; +use std::fs::File; +use std::io::prelude::*; +use std::path::Path; -// use errors::{Result}; +use toml::Parser; + +use errors::{Result, ErrorKind}; #[derive(Debug, PartialEq)] @@ -9,9 +14,70 @@ pub struct Config { pub base_url: String, } +impl Default for Config { + fn default() -> Config { + Config { + title: "".to_string(), + base_url: "".to_string(), + } + } +} + +impl Config { + pub fn from_str(content: &str) -> Result { + let mut parser = Parser::new(&content); + + if let Some(value) = parser.parse() { + let mut config = Config::default(); + + for (key, value) in value.iter() { + if key == "title" { + config.title = value.as_str().ok_or(ErrorKind::InvalidConfig)?.to_string(); + } + if key == "base_url" { + config.base_url = value.as_str().ok_or(ErrorKind::InvalidConfig)?.to_string(); + } + } + + return Ok(config); + } else { + println!("parse errors: {:?}", parser.errors); + } + + unreachable!() + } + + pub fn from_file>(path: P) -> Result { + let mut content = String::new(); + File::open(path)?.read_to_string(&mut content)?; -//impl Config { -// pub fn from_file>(path: P) -> Result { -// Ok(()) -// } -//} + Config::from_str(&content) + } +} + +#[cfg(test)] +mod tests { + use super::{Config}; + + #[test] + fn test_can_import_valid_config() { + let config = r#" +title = "My site" +base_url = "https://replace-this-with-your-url.com" + "#; + + let config = Config::from_str(config).unwrap(); + assert_eq!(config.title, "My site".to_string()); + } + + #[test] + fn test_errors_when_invalid_type() { + let config = r#" +title = 1 +base_url = "https://replace-this-with-your-url.com" + "#; + + let config = Config::from_str(config); + assert!(config.is_err()); + } +} diff --git a/src/errors.rs b/src/errors.rs index e813481..6edf733 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -5,6 +5,10 @@ error_chain! { } errors { + InvalidConfig { + description("invalid config") + display("The config.toml is invalid or is using the wrong type for an argument") + } FolderExists(name: String) { description("folder already exists") display("Folder '{}' already exists.", name) diff --git a/src/main.rs b/src/main.rs index 99eaf95..cd99f85 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,11 +3,25 @@ #[macro_use] extern crate clap; #[macro_use] extern crate error_chain; +extern crate toml; mod config; mod errors; mod cmd; +use config::Config; + + +fn get_config() -> Config { + match Config::from_file("config.toml") { + Ok(c) => c, + Err(e) => { + println!("Error: {}", e); + ::std::process::exit(1); + } + } +} + fn main() { let matches = clap_app!(myapp =>