use libimagrt::runtime::Runtime;
use libimagerror::errors::ErrorMsg as EM;
use toml::Value;
use toml_query::read::TomlValueReadExt;
use failure::Error;
use failure::Fallible as Result;
use failure::ResultExt;
pub fn get_diary_name(rt: &Runtime) -> Option<String> {
use libimagdiary::config::get_default_diary_name;
rt.cli()
.value_of("diaryname")
.map(String::from)
.or_else(|| get_default_diary_name(rt))
}
pub enum Timed {
Daily,
Hourly,
Minutely,
Secondly,
}
pub fn get_diary_timed_config(rt: &Runtime, diary_name: &str) -> Result<Option<Timed>> {
match rt.config() {
None => Ok(None),
Some(cfg) => {
let v = cfg
.read(&format!("diary.diaries.{}.timed", diary_name))
.context(EM::IO)
.map_err(Error::from);
match v {
Ok(Some(&Value::String(ref s))) => parse_timed_string(s, diary_name).map(Some),
Ok(Some(_)) => {
let s = format!("Type error at 'diary.diaryies.{}.timed': should be either 'd'/'daily', 'h'/'hourly', 'm'/'minutely' or 's'/'secondly'", diary_name);
Err(format_err!("{}", s))
},
Ok(None) => Ok(None),
Err(e) => Err(e),
}
}
}
}
pub fn parse_timed_string(s: &str, diary_name: &str) -> Result<Timed> {
if s == "d" || s == "daily" {
Ok(Timed::Daily)
} else if s == "h" || s == "hourly" {
Ok(Timed::Hourly)
} else if s == "m" || s == "minutely" {
Ok(Timed::Minutely)
} else if s == "s" || s == "secondly" {
Ok(Timed::Secondly)
} else {
Err(format_err!("Cannot parse config: 'diary.diaries.{}.timed = {}'", diary_name, s))
}
}