diff --git a/lib/domain/libimaghabit/src/habit.rs b/lib/domain/libimaghabit/src/habit.rs index 99e1bacc..ab22ed09 100644 --- a/lib/domain/libimaghabit/src/habit.rs +++ b/lib/domain/libimaghabit/src/habit.rs @@ -30,6 +30,7 @@ use error::*; use iter::HabitInstanceStoreIdIterator; use util::date_to_string; use util::IsHabitCheck; +use util::get_string_header_from_entry; use libimagentrylink::internal::InternalLinker; use libimagstore::store::Store; @@ -202,19 +203,19 @@ impl HabitTemplate for Entry { } fn habit_name(&self) -> Result { - get_string_header_from_habit(self, "habit.template.name") + get_string_header_from_entry(self, "habit.template.name") } fn habit_basedate(&self) -> Result { - get_string_header_from_habit(self, "habit.template.basedate") + get_string_header_from_entry(self, "habit.template.basedate") } fn habit_recur_spec(&self) -> Result { - get_string_header_from_habit(self, "habit.template.recurspec") + get_string_header_from_entry(self, "habit.template.recurspec") } fn habit_comment(&self) -> Result { - get_string_header_from_habit(self, "habit.template.comment") + get_string_header_from_entry(self, "habit.template.comment") } fn habit_until_date(&self) -> Result> { @@ -239,15 +240,6 @@ fn instance_id_for_name_and_datestr(habit_name: &String, habit_date: &String) -> .map_err(HE::from) } -#[inline] -fn get_string_header_from_habit(e: &Entry, path: &'static str) -> Result { - match e.get_header().read(path)? { - Some(&Value::String(ref s)) => Ok(s.clone()), - Some(_) => Err(HEK::HeaderTypeError(path, "String").into()), - None => Err(HEK::HeaderFieldMissing(path).into()), - } -} - pub mod builder { use toml::Value; use toml_query::insert::TomlValueInsertExt; diff --git a/lib/domain/libimaghabit/src/instance.rs b/lib/domain/libimaghabit/src/instance.rs index 84bd9b5c..773ccaba 100644 --- a/lib/domain/libimaghabit/src/instance.rs +++ b/lib/domain/libimaghabit/src/instance.rs @@ -22,7 +22,6 @@ use toml::Value; use toml_query::read::TomlValueReadExt; use toml_query::set::TomlValueSetExt; -use error::HabitErrorKind as HEK; use error::*; use util::*; @@ -61,11 +60,8 @@ impl HabitInstance for Entry { } fn get_date(&self) -> Result { - match self.get_header().read("habit.instance.date")? { - Some(&Value::String(ref s)) => date_from_string(s), - Some(_) => Err(HEK::HeaderTypeError("habit.instance.date", "String").into()), - None => Err(HEK::HeaderFieldMissing("habit.instance.date").into()), - } + use util::date_from_string; + get_string_header_from_entry(self, "habit.instance.date").and_then(date_from_string) } fn set_date(&mut self, n: &NaiveDate) -> Result<()> { @@ -77,11 +73,7 @@ impl HabitInstance for Entry { } fn get_comment(&self) -> Result { - match self.get_header().read("habit.instance.comment")? { - Some(&Value::String(ref s)) => Ok(s.clone()), - Some(_) => Err(HEK::HeaderTypeError("habit.instance.comment", "String").into()), - None => Err(HEK::HeaderFieldMissing("habit.instance.comment").into()), - } + get_string_header_from_entry(self, "habit.instance.comment") } fn set_comment(&mut self, c: String) -> Result<()> { @@ -93,11 +85,7 @@ impl HabitInstance for Entry { } fn get_template_name(&self) -> Result { - match self.get_header().read("habit.instance.name")? { - Some(&Value::String(ref s)) => Ok(s.clone()), - Some(_) => Err(HEK::HeaderTypeError("habit.instance.name", "String").into()), - None => Err(HEK::HeaderFieldMissing("habit.instance.name").into()), - } + get_string_header_from_entry(self, "habit.instance.name") } } diff --git a/lib/domain/libimaghabit/src/util.rs b/lib/domain/libimaghabit/src/util.rs index 4acd6282..3598bedf 100644 --- a/lib/domain/libimaghabit/src/util.rs +++ b/lib/domain/libimaghabit/src/util.rs @@ -34,8 +34,8 @@ pub fn date_to_string(ndt: &NaiveDate) -> String { ndt.format(NAIVE_DATE_STRING_FORMAT).to_string() } -pub fn date_from_string(s: &str) -> Result { - NaiveDate::parse_from_str(s, NAIVE_DATE_STRING_FORMAT).map_err(From::from) +pub fn date_from_string(s: String) -> Result { + NaiveDate::parse_from_str(&s, NAIVE_DATE_STRING_FORMAT).map_err(From::from) } /// Helper trait to check whether a object which can be a habit instance and a habit template is @@ -90,3 +90,14 @@ impl IsHabitCheck for Entry { } } +#[inline] +pub fn get_string_header_from_entry(e: &Entry, path: &'static str) -> Result { + use error::HabitErrorKind as HEK; + use toml_query::read::TomlValueReadExt; + + e.get_header() + .read(path)? + .ok_or(HEK::HeaderFieldMissing(path).into()) + .and_then(|o| o.as_str().map(String::from).ok_or(HEK::HeaderTypeError(path, "String").into())) +} +