Simple config system
This commit is contained in:
parent
021b8ea21f
commit
f29eabe713
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
14
src/main.rs
14
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 =>
|
||||
|
|
Loading…
Reference in a new issue