diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2017-09-14 18:58:40 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2017-09-14 18:58:40 +0200 |
commit | dbf529e427865421a37f67f07508d244e7bf8928 (patch) | |
tree | 6f3eb61a19249247cbd603bdb882f4cf80ac3be7 /bin/domain/imag-diary/src/util.rs | |
parent | ea982204b9e527610570d494202358cf32c73e3d (diff) |
Add config parsing helpers
Diffstat (limited to 'bin/domain/imag-diary/src/util.rs')
-rw-r--r-- | bin/domain/imag-diary/src/util.rs | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/bin/domain/imag-diary/src/util.rs b/bin/domain/imag-diary/src/util.rs index 25498085..a6ed9342 100644 --- a/bin/domain/imag-diary/src/util.rs +++ b/bin/domain/imag-diary/src/util.rs @@ -18,6 +18,10 @@ // use libimagrt::runtime::Runtime; +use libimagdiary::error::*; + +use toml::Value; +use toml_query::read::TomlValueReadExt; pub fn get_diary_name(rt: &Runtime) -> Option<String> { use libimagdiary::config::get_default_diary_name; @@ -26,3 +30,56 @@ pub fn get_diary_name(rt: &Runtime) -> Option<String> { .or(rt.cli().value_of("diaryname").map(String::from)) } +pub enum Timed { + Hourly, + Minutely, +} + +/// Returns true if the diary should always create timed entries, which is whenever +/// +/// ```toml +/// diary.diaries.<diary>.timed = true +/// ``` +/// +/// # Returns +/// +/// * Ok(Some(Timed::Hourly)) if diary should create timed entries +/// * Ok(Some(Timed::Minutely)) if diary should not create timed entries +/// * Ok(None) if config is not available +/// * Err(e) if reading the toml failed, type error or something like this +/// +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 + .config() + .read(&format!("diary.diaries.{}.timed", diary_name)) + .chain_err(|| DiaryErrorKind::IOError); + + 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 'h'/'hourly' or 'm'/'minutely'", diary_name); + Err(s).map_err(From::from) + }, + + Ok(None) => Ok(None), + Err(e) => Err(e), + } + } + } +} + +pub fn parse_timed_string(s: &str, diary_name: &str) -> Result<Timed> { + if s == "h" || s == "hourly" { + Ok(Timed::Hourly) + } else if s == "m" || s == "minutely" { + Ok(Timed::Minutely) + } else { + let s = format!("Cannot parse config: 'diary.diaries.{}.timed = {}'", + diary_name, s); + Err(s).map_err(From::from) + } +} |