Simple config system

This commit is contained in:
Vincent Prouillet 2016-12-06 15:55:17 +09:00
parent 021b8ea21f
commit f29eabe713
3 changed files with 91 additions and 7 deletions

View file

@ -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_file<P: AsRef<Path>>(path: P) -> Result<Config> {
// Ok(())
// }
//}
impl Config {
pub fn from_str(content: &str) -> Result<Config> {
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<P: AsRef<Path>>(path: P) -> Result<Config> {
let mut content = String::new();
File::open(path)?.read_to_string(&mut content)?;
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());
}
}

View file

@ -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)

View file

@ -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 =>