Implement HabitInstance for Entry
This commit is contained in:
parent
533d97532b
commit
42cabffa64
1 changed files with 66 additions and 3 deletions
|
@ -18,9 +18,17 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
use chrono::NaiveDate;
|
use chrono::NaiveDate;
|
||||||
|
use toml::Value;
|
||||||
|
use toml_query::read::TomlValueReadExt;
|
||||||
|
use toml_query::set::TomlValueSetExt;
|
||||||
|
|
||||||
use error::Result;
|
use error::HabitError as HE;
|
||||||
|
use error::HabitErrorKind as HEK;
|
||||||
|
use error::*;
|
||||||
use habit::HabitTemplate;
|
use habit::HabitTemplate;
|
||||||
|
use util::*;
|
||||||
|
|
||||||
|
use libimagstore::store::Entry;
|
||||||
|
|
||||||
/// An instance of a habit is created for each time a habit is done.
|
/// An instance of a habit is created for each time a habit is done.
|
||||||
///
|
///
|
||||||
|
@ -34,9 +42,64 @@ pub trait HabitInstance {
|
||||||
fn is_habit_instance(&self) -> Result<bool>;
|
fn is_habit_instance(&self) -> Result<bool>;
|
||||||
|
|
||||||
fn get_date(&self) -> Result<NaiveDate>;
|
fn get_date(&self) -> Result<NaiveDate>;
|
||||||
fn set_date(&self, n: NaiveDate) -> Result<()>;
|
fn set_date(&mut self, n: &NaiveDate) -> Result<()>;
|
||||||
fn get_comment(&self) -> Result<String>;
|
fn get_comment(&self) -> Result<String>;
|
||||||
fn set_comment(&self, c: String) -> Result<()>;
|
fn set_comment(&mut self, c: String) -> Result<()>;
|
||||||
fn get_template_name(&self) -> Result<String>;
|
fn get_template_name(&self) -> Result<String>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl HabitInstance for Entry {
|
||||||
|
fn is_habit_instance(&self) -> Result<bool> {
|
||||||
|
[
|
||||||
|
"habit.instance.name",
|
||||||
|
"habit.instance.date",
|
||||||
|
"habit.instance.comment",
|
||||||
|
].iter().fold(Ok(true), |acc, path| acc.and_then(|b| {
|
||||||
|
self.get_header()
|
||||||
|
.read(path)
|
||||||
|
.map(|o| is_match!(o, Some(&Value::String(_))))
|
||||||
|
.map_err(From::from)
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_date(&self) -> Result<NaiveDate> {
|
||||||
|
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()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_date(&mut self, n: &NaiveDate) -> Result<()> {
|
||||||
|
// Using `set` here because when creating the entry, these headers should be made present.
|
||||||
|
self.get_header_mut()
|
||||||
|
.set("habit.instance.date", Value::String(date_to_string(n)))
|
||||||
|
.map_err(From::from)
|
||||||
|
.map(|_| ())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_comment(&self) -> Result<String> {
|
||||||
|
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()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn set_comment(&mut self, c: String) -> Result<()> {
|
||||||
|
// Using `set` here because when creating the entry, these headers should be made present.
|
||||||
|
self.get_header_mut()
|
||||||
|
.set("habit.instance.comment", Value::String(c))
|
||||||
|
.map_err(From::from)
|
||||||
|
.map(|_| ())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_template_name(&self) -> Result<String> {
|
||||||
|
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()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue