use std::fmt;
use std::env;
use std::str::FromStr;
#[derive(Debug)]
#[derive(Copy, Clone)]
pub enum Level {
Warning,
Critical
}
impl fmt::Display for Level {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
use self::Level::*;
write!(f, "{}", match *self {
Warning => "warning",
Critical => "critical",
})
}
}
pub trait MuninNodePlugin {
fn config(&self);
fn run(&self);
fn check_autoconf(&self) -> bool {
false
}
fn autoconf(&self) {
if self.check_autoconf() {
println!("yes")
} else {
println!("no")
}
}
fn get_env_threshold(level: Level, field: &str) -> Option<String> {
env::var(format!("{}_{}", field, level)).or_else(|_| env::var(level.to_string())).ok()
}
fn get_env_threshold_as<T>(level: Level, field: &str) -> Option<T> where T: FromStr {
Self::get_env_threshold(level, field).and_then(|s| s.parse::<T>().ok())
}
fn print_if_env(level: Level, field: &str) {
match Self::get_env_threshold(level, field) {
Some(v) => println!("{}.{} {}", field, level, v),
_ => ()
}
}
fn start(&self) -> i32 {
match env::args().nth(1) {
Some(ref s) if s == "config" => self.config(),
Some(ref s) if s == "autoconf" => self.autoconf(),
_ => self.run()
};
0
}
}
#[cfg(test)]
mod tests {
use std::env;
use super::*;
use super::Level::*;
struct DummyPlugin;
impl MuninNodePlugin for DummyPlugin {
fn config(&self) { unimplemented!() }
fn run(&self) { unimplemented!() }
}
#[test]
fn test_get_env_threshold() {
let load = "load";
let warning = "warning";
let load_warning = "load_warning";
env::remove_var(warning);
env::remove_var(load_warning);
assert!(env::var(warning).is_err());
assert!(env::var(load_warning).is_err());
assert_eq!(None, DummyPlugin::get_env_threshold(Warning, load));
let yes10 = "10".to_string();
let ok_yes10 = Ok(yes10.clone());
env::set_var(load_warning, &yes10);
assert_eq!(ok_yes10, env::var(load_warning));
assert!(env::var(warning).is_err());
assert_eq!(Some(yes10.clone()), DummyPlugin::get_env_threshold(Warning, load));
let yes50 = "50".to_string();
let ok_yes50 = Ok(yes50.clone());
env::set_var(warning, &yes50);
assert_eq!(ok_yes10, env::var(load_warning));
assert_eq!(ok_yes50, env::var(warning));
assert_eq!(Some(yes10.clone()), DummyPlugin::get_env_threshold(Warning, load));
env::remove_var(load_warning);
assert!(env::var(load_warning).is_err());
assert_eq!(ok_yes50, env::var(warning));
assert_eq!(Some(yes50), DummyPlugin::get_env_threshold(Warning, load));
env::remove_var(warning);
assert!(env::var(warning).is_err());
assert!(env::var(load_warning).is_err());
assert_eq!(None, DummyPlugin::get_env_threshold(Warning, load));
}
#[test]
fn test_get_env_threshold_as_number() {
let load = "load";
let load_warning = "load_warning";
let yes60 = "60".to_string();
let ok_yes60 = Ok(yes60.clone());
env::remove_var(load_warning);
assert_eq!(None, DummyPlugin::get_env_threshold_as::<i32>(Warning, load));
env::set_var(load_warning, &yes60);
assert_eq!(ok_yes60, env::var(load_warning));
assert_eq!(Some(60i32), DummyPlugin::get_env_threshold_as::<i32>(Warning, load));
env::set_var(load_warning, "2.5");
assert_eq!(Some(2.5f32), DummyPlugin::get_env_threshold_as::<f32>(Warning, load));
env::set_var(load_warning, "test");
assert_eq!(None, DummyPlugin::get_env_threshold_as::<i32>(Warning, load));
}
}