From 964b168f189575bb994318aa0d8a28c1480980fc Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Thu, 22 Mar 2018 13:51:11 +0100 Subject: [PATCH] Add "retrieve" variants for retrieving instances and fix create implementation to use `Store::create()`, which did the wrong thing. --- lib/domain/libimaghabit/src/habit.rs | 32 +++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/lib/domain/libimaghabit/src/habit.rs b/lib/domain/libimaghabit/src/habit.rs index c273e3dd..f5d984fb 100644 --- a/lib/domain/libimaghabit/src/habit.rs +++ b/lib/domain/libimaghabit/src/habit.rs @@ -62,6 +62,12 @@ pub trait HabitTemplate : Sized { /// `::chrono::Local::today().naive_local()`. fn create_instance_today<'a>(&self, store: &'a Store) -> Result>; + /// Same as `HabitTemplate::create_instance_with_date()` but uses `Store::retrieve` internally. + fn retrieve_instance_with_date<'a>(&self, store: &'a Store, date: &NaiveDate) -> Result>; + + /// Same as `HabitTemplate::create_instance_today()` but uses `Store::retrieve` internally. + fn retrieve_instance_today<'a>(&self, store: &'a Store) -> Result>; + /// Get instances for this template fn linked_instances(&self) -> Result; @@ -94,7 +100,7 @@ impl HabitTemplate for Entry { let date = date_to_string(date); let id = instance_id_for_name_and_datestr(&name, &date)?; - store.retrieve(id) + store.create(id) .map_err(From::from) .and_then(|mut entry| { { @@ -112,6 +118,30 @@ impl HabitTemplate for Entry { self.create_instance_with_date(store, &Local::today().naive_local()) } + fn retrieve_instance_with_date<'a>(&self, store: &'a Store, date: &NaiveDate) -> Result> { + let name = self.habit_name()?; + let comment = self.habit_comment()?; + let date = date_to_string(date); + let id = instance_id_for_name_and_datestr(&name, &date)?; + + store.create(id) + .map_err(From::from) + .and_then(|mut entry| { + { + let _ = entry.set_isflag::()?; + let hdr = entry.get_header_mut(); + let _ = hdr.insert("habit.instance.name", Value::String(name))?; + let _ = hdr.insert("habit.instance.date", Value::String(date))?; + let _ = hdr.insert("habit.instance.comment", Value::String(comment))?; + } + Ok(entry) + }) + } + + fn retrieve_instance_today<'a>(&self, store: &'a Store) -> Result> { + self.retrieve_instance_with_date(store, &Local::today().naive_local()) + } + fn linked_instances(&self) -> Result { let iter = self .get_internal_links()?