Merge pull request #1357 from matthiasbeyer/libimaghabit/create-vs-retrieve
Libimaghabit/create vs retrieve
This commit is contained in:
commit
c857f97287
1 changed files with 49 additions and 17 deletions
|
@ -62,6 +62,12 @@ pub trait HabitTemplate : Sized {
|
||||||
/// `::chrono::Local::today().naive_local()`.
|
/// `::chrono::Local::today().naive_local()`.
|
||||||
fn create_instance_today<'a>(&self, store: &'a Store) -> Result<FileLockEntry<'a>>;
|
fn create_instance_today<'a>(&self, store: &'a Store) -> Result<FileLockEntry<'a>>;
|
||||||
|
|
||||||
|
/// 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<FileLockEntry<'a>>;
|
||||||
|
|
||||||
|
/// Same as `HabitTemplate::create_instance_today()` but uses `Store::retrieve` internally.
|
||||||
|
fn retrieve_instance_today<'a>(&self, store: &'a Store) -> Result<FileLockEntry<'a>>;
|
||||||
|
|
||||||
/// Get instances for this template
|
/// Get instances for this template
|
||||||
fn linked_instances(&self) -> Result<HabitInstanceStoreIdIterator>;
|
fn linked_instances(&self) -> Result<HabitInstanceStoreIdIterator>;
|
||||||
|
|
||||||
|
@ -96,24 +102,30 @@ impl HabitTemplate for Entry {
|
||||||
let date = date_to_string(date);
|
let date = date_to_string(date);
|
||||||
let id = instance_id_for_name_and_datestr(&name, &date)?;
|
let id = instance_id_for_name_and_datestr(&name, &date)?;
|
||||||
|
|
||||||
store.retrieve(id)
|
store.create(id)
|
||||||
.map_err(From::from)
|
.map_err(From::from)
|
||||||
.and_then(|mut entry| {
|
.and_then(|entry| postprocess_instance(entry, name, date, comment))
|
||||||
{
|
|
||||||
let _ = entry.set_isflag::<IsHabitInstance>()?;
|
|
||||||
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 create_instance_today<'a>(&self, store: &'a Store) -> Result<FileLockEntry<'a>> {
|
fn create_instance_today<'a>(&self, store: &'a Store) -> Result<FileLockEntry<'a>> {
|
||||||
self.create_instance_with_date(store, &Local::today().naive_local())
|
self.create_instance_with_date(store, &Local::today().naive_local())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn retrieve_instance_with_date<'a>(&self, store: &'a Store, date: &NaiveDate) -> Result<FileLockEntry<'a>> {
|
||||||
|
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(|entry| postprocess_instance(entry, name, date, comment))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn retrieve_instance_today<'a>(&self, store: &'a Store) -> Result<FileLockEntry<'a>> {
|
||||||
|
self.retrieve_instance_with_date(store, &Local::today().naive_local())
|
||||||
|
}
|
||||||
|
|
||||||
fn linked_instances(&self) -> Result<HabitInstanceStoreIdIterator> {
|
fn linked_instances(&self) -> Result<HabitInstanceStoreIdIterator> {
|
||||||
let iter = self
|
let iter = self
|
||||||
.get_internal_links()?
|
.get_internal_links()?
|
||||||
|
@ -264,6 +276,7 @@ pub mod builder {
|
||||||
use libimagstore::storeid::IntoStoreId;
|
use libimagstore::storeid::IntoStoreId;
|
||||||
use libimagstore::store::FileLockEntry;
|
use libimagstore::store::FileLockEntry;
|
||||||
use libimagentryutil::isa::Is;
|
use libimagentryutil::isa::Is;
|
||||||
|
use libimagutil::debug_result::DebugResult;
|
||||||
|
|
||||||
use error::HabitError as HE;
|
use error::HabitError as HE;
|
||||||
use error::HabitErrorKind as HEK;
|
use error::HabitErrorKind as HEK;
|
||||||
|
@ -313,14 +326,17 @@ pub mod builder {
|
||||||
HE::from_kind(HEK::HabitBuilderMissing(s))
|
HE::from_kind(HEK::HabitBuilderMissing(s))
|
||||||
}
|
}
|
||||||
|
|
||||||
let name = try!(self.name.ok_or_else(|| mkerr("name")));
|
let name = self.name
|
||||||
debug!("Success: Name present");
|
.ok_or_else(|| mkerr("name"))
|
||||||
|
.map_dbg_str("Success: Name present")?;
|
||||||
|
|
||||||
let dateobj = try!(self.basedate.ok_or_else(|| mkerr("date")));
|
let dateobj = self.basedate
|
||||||
debug!("Success: Date present");
|
.ok_or_else(|| mkerr("date"))
|
||||||
|
.map_dbg_str("Success: Date present")?;
|
||||||
|
|
||||||
let recur = try!(self.recurspec.ok_or_else(|| mkerr("recurspec")));
|
let recur = self.recurspec
|
||||||
debug!("Success: Recurr spec present");
|
.ok_or_else(|| mkerr("recurspec"))
|
||||||
|
.map_dbg_str("Success: Recurr spec present")?;
|
||||||
|
|
||||||
if let Some(until) = self.untildate {
|
if let Some(until) = self.untildate {
|
||||||
debug!("Success: Until-Date present");
|
debug!("Success: Until-Date present");
|
||||||
|
@ -382,3 +398,19 @@ pub mod builder {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn postprocess_instance<'a>(mut entry: FileLockEntry<'a>,
|
||||||
|
name: String,
|
||||||
|
date: String,
|
||||||
|
comment: String)
|
||||||
|
-> Result<FileLockEntry<'a>>
|
||||||
|
{
|
||||||
|
{
|
||||||
|
let _ = entry.set_isflag::<IsHabitInstance>()?;
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue