From dbf529e427865421a37f67f07508d244e7bf8928 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Thu, 14 Sep 2017 18:58:40 +0200 Subject: [PATCH] Add config parsing helpers --- bin/domain/imag-diary/src/util.rs | 57 +++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) 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 { use libimagdiary::config::get_default_diary_name; @@ -26,3 +30,56 @@ pub fn get_diary_name(rt: &Runtime) -> Option { .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..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> { + 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 { + 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) + } +}