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)]
|
#[derive(Debug, PartialEq)]
|
||||||
|
@ -9,9 +14,70 @@ pub struct Config {
|
||||||
pub base_url: String,
|
pub base_url: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for Config {
|
||||||
|
fn default() -> Config {
|
||||||
|
Config {
|
||||||
|
title: "".to_string(),
|
||||||
|
base_url: "".to_string(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//impl Config {
|
impl Config {
|
||||||
// pub fn from_file<P: AsRef<Path>>(path: P) -> Result<Config> {
|
pub fn from_str(content: &str) -> Result<Config> {
|
||||||
// Ok(())
|
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 {
|
errors {
|
||||||
|
InvalidConfig {
|
||||||
|
description("invalid config")
|
||||||
|
display("The config.toml is invalid or is using the wrong type for an argument")
|
||||||
|
}
|
||||||
FolderExists(name: String) {
|
FolderExists(name: String) {
|
||||||
description("folder already exists")
|
description("folder already exists")
|
||||||
display("Folder '{}' already exists.", name)
|
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 clap;
|
||||||
#[macro_use] extern crate error_chain;
|
#[macro_use] extern crate error_chain;
|
||||||
|
extern crate toml;
|
||||||
|
|
||||||
mod config;
|
mod config;
|
||||||
mod errors;
|
mod errors;
|
||||||
mod cmd;
|
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() {
|
fn main() {
|
||||||
let matches = clap_app!(myapp =>
|
let matches = clap_app!(myapp =>
|
||||||
|
|
Loading…
Reference in a new issue