summaryrefslogtreecommitdiffstats
path: root/bin/domain/imag-diary/src/util.rs
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2017-09-14 18:58:40 +0200
committerMatthias Beyer <mail@beyermatthias.de>2017-09-14 18:58:40 +0200
commitdbf529e427865421a37f67f07508d244e7bf8928 (patch)
tree6f3eb61a19249247cbd603bdb882f4cf80ac3be7 /bin/domain/imag-diary/src/util.rs
parentea982204b9e527610570d494202358cf32c73e3d (diff)
Add config parsing helpers
Diffstat (limited to 'bin/domain/imag-diary/src/util.rs')
-rw-r--r--bin/domain/imag-diary/src/util.rs57
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)
+ }
+}