diff options
author | Mario Krehl <mario-krehl@gmx.de> | 2017-12-09 15:44:27 +0100 |
---|---|---|
committer | Mario Krehl <mario-krehl@gmx.de> | 2017-12-09 15:44:27 +0100 |
commit | f31d9b16c91afd4bedc9a9dfe856e019561ed4f9 (patch) | |
tree | 98192978e04d2e48156515c8ce49cd55f5ed22b9 /src | |
parent | 8bc335330080805816fb3ccf803e2daf0cd252bb (diff) |
Add basic functionality:
- logging
- error handling
- configuration parsing
Diffstat (limited to 'src')
-rw-r--r-- | src/config.rs | 42 | ||||
-rw-r--r-- | src/error.rs | 10 | ||||
-rw-r--r-- | src/main.rs | 57 |
3 files changed, 108 insertions, 1 deletions
diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..5d1885c --- /dev/null +++ b/src/config.rs @@ -0,0 +1,42 @@ +//! Module for parsing/accessing the configuration + +extern crate log; +extern crate toml; + +use std::fs::File; +use std::io::Read; +use error::*; + +/// Main Config struct +#[derive(Debug, Deserialize)] +pub struct Config { + item : Vec<Item>, +} + +/// Holds data for one antikoerper Log-File +#[derive(Debug, Deserialize)] +struct Item { + file : String, + regex : String, + alias : String, +} + +impl Config { + pub fn load(filename : String) -> Result<Config> { + debug!("configuration file name: '{}'", filename); + let mut file = File::open(filename.clone()) + .chain_err(|| "configuration file could not be opened")?; + debug!("configuration file successfully opened"); + let mut content = String::new(); + file.read_to_string(&mut content) + .chain_err(|| "configuration file could not be read")?; + debug!("configuration file successfully read"); + match toml::from_str(content.as_str()) { + Ok(config) => { + debug!("configuration file successfully parsed"); + Ok(config) + }, + _ => Err(ErrorKind::ConfigParseError(filename).into()), + } + } +} diff --git a/src/error.rs b/src/error.rs new file mode 100644 index 0000000..6258c10 --- /dev/null +++ b/src/error.rs @@ -0,0 +1,10 @@ + +error_chain! { + errors { + ConfigParseError(filename: String) { + description("configuration file could not be parsed"), + display("configuration file could not be parsed: '{}'", filename), + } + } +} + diff --git a/src/main.rs b/src/main.rs index e7a11a9..4a4e53d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,58 @@ +#![recursion_limit = "1024"] + +extern crate clap; +#[macro_use] +extern crate error_chain; +#[macro_use] +extern crate log; +#[macro_use] +extern crate serde_derive; +extern crate simplelog; + +use clap::{App, Arg}; +use simplelog::{SimpleLogger, LogLevelFilter, Config as LogConfig}; + +use std::process::exit; + +mod error; +mod config; +use config::Config; + fn main() { - println!("Hello, world!"); + let matches = App::new("aklog-server") + .version("0.1.0") + .author("Mario Krehl <mario-krehl@gmx.de>") + .about("Presents antikoerper-logfiles to grafana") + .arg(Arg::with_name("config") + .short("c") + .long("config") + .value_name("FILE") + .help("configuration file to use") + .takes_value(true) + .required(true)) + .arg(Arg::with_name("verbosity") + .short("v") + .long("verbose") + .help("sets the level of verbosity") + .multiple(true)) + .get_matches(); + + match matches.occurrences_of("verbosity") { + 0 => SimpleLogger::init(LogLevelFilter::Warn, LogConfig::default()).unwrap(), + 1 => SimpleLogger::init(LogLevelFilter::Info, LogConfig::default()).unwrap(), + 2 => SimpleLogger::init(LogLevelFilter::Debug, LogConfig::default()).unwrap(), + 3 | _ => SimpleLogger::init(LogLevelFilter::Trace, LogConfig::default()).unwrap(), + }; + + debug!("Initialized logger"); + + let config_file = matches.value_of("config").unwrap(); + let config = match Config::load(String::from(config_file)) { + Ok(c) => c, + Err(_) => { + error!("Failed to open/parse configuration file: '{}'", config_file); + exit(1); + }, + }; + } |