summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bin/core/imag-ref/src/main.rs10
-rw-r--r--bin/domain/imag-diary/src/create.rs164
-rw-r--r--bin/domain/imag-diary/src/delete.rs40
-rw-r--r--bin/domain/imag-diary/src/edit.rs42
-rw-r--r--bin/domain/imag-diary/src/list.rs4
-rw-r--r--bin/domain/imag-diary/src/view.rs3
-rw-r--r--bin/domain/imag-mail/Cargo.toml1
-rw-r--r--bin/domain/imag-mail/src/main.rs12
-rw-r--r--bin/domain/imag-todo/src/main.rs53
-rw-r--r--lib/domain/libimagdiary/src/diary.rs149
-rw-r--r--lib/domain/libimagdiary/src/entry.rs64
-rw-r--r--lib/domain/libimagdiary/src/error.rs3
-rw-r--r--lib/domain/libimagdiary/src/is_in_diary.rs10
-rw-r--r--lib/domain/libimagdiary/src/iter.rs53
-rw-r--r--lib/domain/libimagdiary/src/viewer.rs12
-rw-r--r--lib/domain/libimagmail/src/iter.rs15
-rw-r--r--lib/domain/libimagmail/src/mail.rs17
-rw-r--r--lib/domain/libimagtodo/src/error.rs5
-rw-r--r--lib/domain/libimagtodo/src/lib.rs1
-rw-r--r--lib/domain/libimagtodo/src/task.rs276
-rw-r--r--lib/domain/libimagtodo/src/taskstore.rs205
-rw-r--r--lib/entry/libimagentrylink/src/external.rs85
-rw-r--r--lib/entry/libimagentryref/Cargo.toml2
-rw-r--r--lib/entry/libimagentryref/src/hashers/nbytes.rs11
-rw-r--r--lib/entry/libimagentryref/src/lib.rs2
-rw-r--r--lib/entry/libimagentryref/src/lister.rs116
-rw-r--r--lib/entry/libimagentryref/src/reference.rs461
-rw-r--r--lib/entry/libimagentryref/src/refstore.rs269
-rw-r--r--lib/entry/libimagentryref/src/util.rs56
29 files changed, 1093 insertions, 1048 deletions
diff --git a/bin/core/imag-ref/src/main.rs b/bin/core/imag-ref/src/main.rs
index 092ca762..1420f5f8 100644
--- a/bin/core/imag-ref/src/main.rs
+++ b/bin/core/imag-ref/src/main.rs
@@ -48,7 +48,7 @@ use ui::build_ui;
use std::path::PathBuf;
-use libimagentryref::reference::Ref;
+use libimagentryref::refstore::RefStore;
use libimagentryref::flags::RefFlags;
use libimagerror::trace::trace_error;
use libimagrt::setup::generate_runtime_setup;
@@ -82,7 +82,7 @@ fn add(rt: &Runtime) {
.with_content_hashing(cmd.is_present("track-content"))
.with_permission_tracking(cmd.is_present("track-permissions"));
- match Ref::create(rt.store(), path, flags) {
+ match RefStore::create(rt.store(), path, flags) {
Ok(r) => {
debug!("Reference created: {:?}", r);
info!("Ok");
@@ -102,7 +102,7 @@ fn remove(rt: &Runtime) {
let yes = cmd.is_present("yes");
if yes || ask_bool(&format!("Delete Ref with hash '{}'", hash)[..], None) {
- match Ref::delete_by_hash(rt.store(), hash) {
+ match rt.store().delete_by_hash(hash) {
Err(e) => trace_error(&e),
Ok(_) => info!("Ok"),
}
@@ -126,7 +126,7 @@ fn list(rt: &Runtime) {
let iter = match rt.store().retrieve_for_module("ref") {
Ok(iter) => iter.filter_map(|id| {
- match Ref::get(rt.store(), id) {
+ match rt.store().get(id) {
Ok(r) => Some(r),
Err(e) => {
trace_error(&e);
@@ -145,7 +145,7 @@ fn list(rt: &Runtime) {
.check_changed(do_check_changed)
.check_changed_content(do_check_changed_content)
.check_changed_permiss(do_check_changed_permiss)
- .list(iter.map(|e| e.into()))
+ .list(iter.filter_map(Into::into))
.ok();
}
diff --git a/bin/domain/imag-diary/src/create.rs b/bin/domain/imag-diary/src/create.rs
index 78f679a7..b93c2805 100644
--- a/bin/domain/imag-diary/src/create.rs
+++ b/bin/domain/imag-diary/src/create.rs
@@ -19,16 +19,18 @@
use std::process::exit;
+use clap::ArgMatches;
+
use libimagdiary::diary::Diary;
use libimagdiary::diaryid::DiaryId;
use libimagdiary::error::DiaryErrorKind as DEK;
use libimagdiary::error::MapErrInto;
use libimagentryedit::edit::Edit;
use libimagrt::runtime::Runtime;
-use libimagerror::trace::trace_error;
-use libimagdiary::entry::Entry;
-use libimagdiary::result::Result;
+use libimagerror::trace::trace_error_exit;
use libimagutil::warn_exit::warn_exit;
+use libimagstore::store::FileLockEntry;
+use libimagstore::store::Store;
use util::get_diary_name;
@@ -36,88 +38,90 @@ pub fn create(rt: &Runtime) {
let diaryname = get_diary_name(rt)
.unwrap_or_else( || warn_exit("No diary selected. Use either the configuration file or the commandline option", 1));
- let prevent_edit = rt.cli().subcommand_matches("create").unwrap().is_present("no-edit");
-
- fn create_entry<'a>(diary: &'a Diary, rt: &Runtime) -> Result<Entry<'a>> {
- use std::str::FromStr;
-
- let create = rt.cli().subcommand_matches("create").unwrap();
- if !create.is_present("timed") {
- debug!("Creating non-timed entry");
- diary.new_entry_today()
- } else {
- let id = match create.value_of("timed") {
- Some("h") | Some("hourly") => {
- debug!("Creating hourly-timed entry");
- let time = DiaryId::now(String::from(diary.name()));
- let hr = create
- .value_of("hour")
- .map(|v| { debug!("Creating hourly entry with hour = {:?}", v); v })
- .and_then(|s| {
- FromStr::from_str(s)
- .map_err(|_| warn!("Could not parse hour: '{}'", s))
- .ok()
- })
- .unwrap_or(time.hour());
-
- time.with_hour(hr).with_minute(0)
- },
-
- Some("m") | Some("minutely") => {
- debug!("Creating minutely-timed entry");
- let time = DiaryId::now(String::from(diary.name()));
- let hr = create
- .value_of("hour")
- .map(|h| { debug!("hour = {:?}", h); h })
- .and_then(|s| {
- FromStr::from_str(s)
- .map_err(|_| warn!("Could not parse hour: '{}'", s))
- .ok()
- })
- .unwrap_or(time.hour());
-
- let min = create
- .value_of("minute")
- .map(|m| { debug!("minute = {:?}", m); m })
- .and_then(|s| {
- FromStr::from_str(s)
- .map_err(|_| warn!("Could not parse minute: '{}'", s))
- .ok()
- })
- .unwrap_or(time.minute());
-
- time.with_hour(hr).with_minute(min)
- },
-
- Some(_) => {
- warn!("Timed creation failed: Unknown spec '{}'",
- create.value_of("timed").unwrap());
- exit(1);
- },
-
- None => warn_exit("Unexpected error, cannot continue", 1)
- };
-
- diary.new_entry_by_id(id)
- }
- }
+ let mut entry = create_entry(rt.store(), &diaryname, rt);
- let diary = Diary::open(rt.store(), &diaryname[..]);
- let res = create_entry(&diary, rt)
- .and_then(|mut entry| {
- if prevent_edit {
- debug!("Not editing new diary entry");
- Ok(())
- } else {
- debug!("Editing new diary entry");
- entry.edit_content(rt).map_err_into(DEK::DiaryEditError)
- }
- });
+ let res = if rt.cli().subcommand_matches("create").unwrap().is_present("no-edit") {
+ debug!("Not editing new diary entry");
+ Ok(())
+ } else {
+ debug!("Editing new diary entry");
+ entry.edit_content(rt)
+ .map_err_into(DEK::DiaryEditError)
+ };
if let Err(e) = res {
- trace_error(&e);
+ trace_error_exit(&e, 1);
} else {
info!("Ok!");
}
}
+fn create_entry<'a>(diary: &'a Store, diaryname: &str, rt: &Runtime) -> FileLockEntry<'a> {
+ let create = rt.cli().subcommand_matches("create").unwrap();
+ let entry = if !create.is_present("timed") {
+ debug!("Creating non-timed entry");
+ diary.new_entry_today(diaryname)
+ } else {
+ let id = create_id_from_clispec(&create, &diaryname);
+ diary.retrieve(id).map_err_into(DEK::StoreReadError)
+ };
+
+ match entry {
+ Err(e) => trace_error_exit(&e, 1),
+ Ok(e) => {
+ debug!("Created: {}", e.get_location());
+ e
+ }
+ }
+}
+
+
+fn create_id_from_clispec(create: &ArgMatches, diaryname: &str) -> DiaryId {
+ use std::str::FromStr;
+
+ let get_hourly_id = |create: &ArgMatches| -> DiaryId {
+ let time = DiaryId::now(String::from(diaryname));
+ let hr = create
+ .value_of("hour")
+ .map(|v| { debug!("Creating hourly entry with hour = {:?}", v); v })
+ .and_then(|s| {
+ FromStr::from_str(s)
+ .map_err(|_| warn!("Could not parse hour: '{}'", s))
+ .ok()
+ })
+ .unwrap_or(time.hour());
+
+ time.with_hour(hr)
+ };
+
+ match create.value_of("timed") {
+ Some("h") | Some("hourly") => {
+ debug!("Creating hourly-timed entry");
+ get_hourly_id(create)
+ },
+
+ Some("m") | Some("minutely") => {
+ let time = get_hourly_id(create);
+ let min = create
+ .value_of("minute")
+ .map(|m| { debug!("minute = {:?}", m); m })
+ .and_then(|s| {
+ FromStr::from_str(s)
+ .map_err(|_| warn!("Could not parse minute: '{}'", s))
+ .ok()
+ })
+ .unwrap_or(time.minute());
+
+ time.with_minute(min)
+ },
+
+ Some(_) => {
+ warn!("Timed creation failed: Unknown spec '{}'",
+ create.value_of("timed").unwrap());
+ exit(1);
+ },
+
+ None => warn_exit("Unexpected error, cannot continue", 1)
+ }
+}
+
diff --git a/bin/domain/imag-diary/src/delete.rs b/bin/domain/imag-diary/src/delete.rs
index da44bc92..17f24a91 100644
--- a/bin/domain/imag-diary/src/delete.rs
+++ b/bin/domain/imag-diary/src/delete.rs
@@ -17,15 +17,17 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//
+use std::process::exit;
+
use chrono::naive::NaiveDateTime;
-use libimagdiary::diary::Diary;
use libimagdiary::diaryid::DiaryId;
use libimagrt::runtime::Runtime;
use libimagerror::trace::trace_error_exit;
use libimagtimeui::datetime::DateTime;
use libimagtimeui::parse::Parse;
use libimagutil::warn_exit::warn_exit;
+use libimagstore::storeid::IntoStoreId;
use util::get_diary_name;
@@ -35,36 +37,34 @@ pub fn delete(rt: &Runtime) {
let diaryname = get_diary_name(rt)
.unwrap_or_else(|| warn_exit("No diary selected. Use either the configuration file or the commandline option", 1));
- let diary = Diary::open(rt.store(), &diaryname[..]);
- debug!("Diary opened: {:?}", diary);
-
- let datetime : Option<NaiveDateTime> = rt
+ let to_del_location = rt
.cli()
.subcommand_matches("delete")
.unwrap()
.value_of("datetime")
.map(|dt| { debug!("DateTime = {:?}", dt); dt })
.and_then(DateTime::parse)
- .map(|dt| dt.into());
-
- let to_del = match datetime {
- Some(dt) => Some(diary.retrieve(DiaryId::from_datetime(diaryname.clone(), dt))),
- None => diary.get_youngest_entry(),
- };
-
- let to_del = match to_del {
- Some(Ok(e)) => e,
-
- Some(Err(e)) => trace_error_exit(&e, 1),
- None => warn_exit("No entry", 1)
- };
+ .map(|dt| dt.into())
+ .ok_or_else(|| {
+ warn!("Not deleting entries, because missing date/time specification");
+ exit(1);
+ })
+ .and_then(|dt: NaiveDateTime| {
+ DiaryId::from_datetime(diaryname.clone(), dt)
+ .into_storeid()
+ .map(|id| rt.store().retrieve(id))
+ .unwrap_or_else(|e| trace_error_exit(&e, 1))
+ })
+ .unwrap_or_else(|e| trace_error_exit(&e, 1))
+ .get_location()
+ .clone();
- if !ask_bool(&format!("Deleting {:?}", to_del.get_location())[..], Some(true)) {
+ if !ask_bool(&format!("Deleting {:?}", to_del_location), Some(true)) {
info!("Aborting delete action");
return;
}
- if let Err(e) = diary.delete_entry(to_del) {
+ if let Err(e) = rt.store().delete(to_del_location) {
trace_error_exit(&e, 1)
}
diff --git a/bin/domain/imag-diary/src/edit.rs b/bin/domain/imag-diary/src/edit.rs
index 1cd5f9e5..c623e1fa 100644
--- a/bin/domain/imag-diary/src/edit.rs
+++ b/bin/domain/imag-diary/src/edit.rs
@@ -17,6 +17,8 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//
+use std::process::exit;
+
use chrono::naive::NaiveDateTime;
use libimagdiary::diary::Diary;
@@ -30,33 +32,39 @@ use libimagerror::into::IntoError;
use libimagtimeui::datetime::DateTime;
use libimagtimeui::parse::Parse;
use libimagutil::warn_exit::warn_exit;
+use libimagerror::trace::trace_error_exit;
use util::get_diary_name;
pub fn edit(rt: &Runtime) {
let diaryname = get_diary_name(rt).unwrap_or_else(|| warn_exit("No diary name", 1));
- let diary = Diary::open(rt.store(), &diaryname[..]);
- let datetime : Option<NaiveDateTime> = rt
- .cli()
+ rt.cli()
.subcommand_matches("edit")
.unwrap()
.value_of("datetime")
.and_then(DateTime::parse)
- .map(|dt| dt.into());
-
- let to_edit = match datetime {
- Some(dt) => Some(diary.retrieve(DiaryId::from_datetime(diaryname.clone(), dt))),
- None => diary.get_youngest_entry(),
- };
-
- match to_edit {
- Some(Ok(mut e)) => e.edit_content(rt).map_err_into(DEK::IOError),
-
- Some(Err(e)) => Err(e),
- None => Err(DEK::EntryNotInDiary.into_error()),
- }
- .map_err_trace().ok();
+ .map(|dt| dt.into())
+ .map(|dt: NaiveDateTime| DiaryId::from_datetime(diaryname.clone(), dt))
+ .or_else(|| {
+ rt.store()
+ .get_youngest_entry_id(&diaryname)
+ .map(|optid| match optid {
+ Ok(id) => id,
+ Err(e) => trace_error_exit(&e, 1),
+ })
+ })
+ .ok_or_else(|| {
+ error!("No entries in diary. Aborting");
+ exit(1)
+ })
+ .and_then(|id| rt.store().get(id))
+ .map(|opte| match opte {
+ Some(mut e) => e.edit_content(rt).map_err_into(DEK::IOError),
+ None => Err(DEK::EntryNotInDiary.into_error()),
+ })
+ .map_err_trace()
+ .ok();
}
diff --git a/bin/domain/imag-diary/src/list.rs b/bin/domain/imag-diary/src/list.rs
index 4ed3123c..90a8dd96 100644
--- a/bin/domain/imag-diary/src/list.rs
+++ b/bin/domain/imag-diary/src/list.rs
@@ -42,9 +42,7 @@ pub fn list(rt: &Runtime) {
.unwrap_or(String::from("<<Path Parsing Error>>"))
}
- let diary = Diary::open(rt.store(), &diaryname[..]);
- debug!("Diary opened: {:?}", diary);
- diary.entries()
+ Diary::entries(rt.store(), &diaryname)
.and_then(|es| {
debug!("Iterator for listing: {:?}", es);
diff --git a/bin/domain/imag-diary/src/view.rs b/bin/domain/imag-diary/src/view.rs
index 041a1fe0..1e60383b 100644
--- a/bin/domain/imag-diary/src/view.rs
+++ b/bin/domain/imag-diary/src/view.rs
@@ -27,10 +27,9 @@ use util::get_diary_name;
pub fn view(rt: &Runtime) {
let diaryname = get_diary_name(rt).unwrap_or_else(|| warn_exit("No diary name", 1));
- let diary = Diary::open(rt.store(), &diaryname[..]);
let hdr = rt.cli().subcommand_matches("view").unwrap().is_present("show-header");
- diary.entries()
+ Diary::entries(rt.store(), &diaryname)
.and_then(|entries| DV::new(hdr).view_entries(entries.into_iter().filter_map(Result::ok)))
.map_err_trace()
.ok();
diff --git a/bin/domain/imag-mail/Cargo.toml b/bin/domain/imag-mail/Cargo.toml
index 606fdfed..b9b31787 100644
--- a/bin/domain/imag-mail/Cargo.toml
+++ b/bin/domain/imag-mail/Cargo.toml
@@ -17,5 +17,4 @@ version = "2.0.1"
libimagrt = { version = "0.4.0", path = "../../../lib/core/libimagrt" }
libimagerror = { version = "0.4.0", path = "../../../lib/core/libimagerror" }
libimagmail = { version = "0.4.0", path = "../../../lib/domain/libimagmail" }
-libimagentryref = { version = "0.4.0", path = "../../../lib/entry/libimagentryref" }
libimagutil = { version = "0.4.0", path = "../../../lib/etc/libimagutil" }
diff --git a/bin/domain/imag-mail/src/main.rs b/bin/domain/imag-mail/src/main.rs
index 5fd6d1d4..8596d77b 100644
--- a/bin/domain/imag-mail/src/main.rs
+++ b/bin/domain/imag-mail/src/main.rs
@@ -25,11 +25,9 @@ extern crate libimagrt;
extern crate libimagmail;
extern crate libimagerror;
extern crate libimagutil;
-extern crate libimagentryref;
use libimagerror::trace::{MapErrTrace, trace_error, trace_error_exit};
use libimagmail::mail::Mail;
-use libimagentryref::reference::Ref;
use libimagrt::runtime::Runtime;
use libimagrt::setup::generate_runtime_setup;
use libimagutil::info_result::*;
@@ -74,11 +72,11 @@ fn list(rt: &Runtime) {
let iter = match store.retrieve_for_module("ref") {
Ok(iter) => iter.filter_map(|id| {
- Ref::get(store, id)
- .map_err_into(MEK::RefHandlingError)
- .and_then(|rf| Mail::from_ref(rf))
- .map_err_trace()
- .ok()
+ match store.get(id).map_err_into(MEK::RefHandlingError).map_err_trace() {
+ Ok(Some(fle)) => Mail::from_fle(fle).map_err_trace().ok(),
+ Ok(None) => None,
+ Err(e) => trace_error_exit(&e, 1),
+ }
}),
Err(e) => trace_error_exit(&e, 1),
};
diff --git a/bin/domain/imag-todo/src/main.rs b/bin/domain/imag-todo/src/main.rs
index 43545d2a..20ad60e4 100644
--- a/bin/domain/imag-todo/src/main.rs
+++ b/bin/domain/imag-todo/src/main.rs
@@ -35,7 +35,7 @@ use toml::Value;
use libimagrt::runtime::Runtime;
use libimagrt::setup::generate_runtime_setup;
-use libimagtodo::task::Task;
+use libimagtodo::taskstore::TaskStore;
use libimagerror::trace::{MapErrTrace, trace_error, trace_error_exit};
mod ui;
@@ -61,9 +61,11 @@ fn tw_hook(rt: &Runtime) {
let subcmd = rt.cli().subcommand_matches("tw-hook").unwrap();
if subcmd.is_present("add") {
let stdin = stdin();
- let stdin = stdin.lock(); // implements BufRead which is required for `Task::import()`
- match Task::import(rt.store(), stdin) {
+ // implements BufRead which is required for `Store::import_task_from_reader()`
+ let stdin = stdin.lock();
+
+ match rt.store().import_task_from_reader(stdin) {
Ok((_, line, uuid)) => println!("{}\nTask {} stored in imag", line, uuid),
Err(e) => trace_error_exit(&e, 1),
}
@@ -71,7 +73,7 @@ fn tw_hook(rt: &Runtime) {
// The used hook is "on-modify". This hook gives two json-objects
// per usage und wants one (the second one) back.
let stdin = stdin();
- Task::delete_by_imports(rt.store(), stdin.lock()).map_err_trace().ok();
+ rt.store().delete_tasks_by_imports(stdin.lock()).map_err_trace().ok();
} else {
// Should not be possible, as one argument is required via
// ArgGroup
@@ -92,30 +94,35 @@ fn list(rt: &Runtime) {
is_match!(e.kind(), &::toml_query::error::ErrorKind::IdentifierNotFoundInDocument(_))
};
- let res = Task::all(rt.store()) // get all tasks
+ let res = rt.store().all_tasks() // get all tasks
.map(|iter| { // and if this succeeded
// filter out the ones were we can read the uuid
- let uuids : Vec<_> = iter.filter_map(|t| match t {
- Ok(v) => match v.get_header().read(&String::from("todo.uuid")) {
- Ok(Some(&Value::String(ref u))) => Some(u.clone()),
- Ok(Some(_)) => {
- warn!("Header type error");
- None
- },
- Ok(None) => {
- warn!("Header missing field");
- None
+ let uuids : Vec<_> = iter.filter_map(|storeid| {
+ match rt.store().retrieve(storeid) {
+ Ok(fle) => {
+ match fle.get_header().read(&String::from("todo.uuid")) {
+ Ok(Some(&Value::String(ref u))) => Some(u.clone()),
+ Ok(Some(_)) => {
+ error!("Header type error, expected String at 'todo.uuid' in {}",
+ fle.get_location());
+ None
+ },
+ Ok(None) => {
+ error!("Header missing field in {}", fle.get_location());
+ None
+ },
+ Err(e) => {
+ if !no_identifier(&e) {
+ trace_error(&e);
+ }
+ None
+ }
+ }
},
Err(e) => {
- if !no_identifier(&e) {
- trace_error(&e);
- }
+ trace_error(&e);
None
- }
- },
- Err(e) => {
- trace_error(&e);
- None
+ },
}
})
.collect();
diff --git a/lib/domain/libimagdiary/src/diary.rs b/lib/domain/libimagdiary/src/diary.rs
index 431b6320..c67467cc 100644
--- a/lib/domain/libimagdiary/src/diary.rs
+++ b/lib/domain/libimagdiary/src/diary.rs
@@ -19,110 +19,117 @@
use std::cmp::Ordering;
+use libimagstore::store::FileLockEntry;
use libimagstore::store::Store;
-use libimagstore::storeid::IntoStoreId;
use libimagerror::trace::trace_error;
use chrono::offset::Local;
use chrono::Datelike;
use itertools::Itertools;
use chrono::naive::NaiveDateTime;
+use chrono::Timelike;
-use entry::Entry;
+use entry::DiaryEntry;
use diaryid::DiaryId;
-use error::DiaryError as DE;
use error::DiaryErrorKind as DEK;
+use error::MapErrInto;
use result::Result;
use iter::DiaryEntryIterator;
-use is_in_diary::IsInDiary;
+use iter::DiaryNameIterator;
-#[derive(Debug)]
-pub struct Diary<'a> {
- store: &'a Store,
- name: &'a str,
-}
+pub trait Diary {
-impl<'a> Diary<'a> {
+ // create or get a new entry for today
+ fn new_entry_today(&self, diary_name: &str) -> Result<FileLockEntry>;
- pub fn open(store: &'a Store, name: &'a str) -> Diary<'a> {
- Diary {
- store: store,
- name: name,
- }
- }
+ // create or get a new entry for now
+ fn new_entry_now(&self, diary_name: &str) -> Result<FileLockEntry>;
+
+ // Get an iterator for iterating over all entries of a Diary
+ fn entries(&self, diary_name: &str) -> Result<DiaryEntryIterator>;
+
+ fn get_youngest_entry_id(&self, diary_name: &str) -> Option<Result<DiaryId>>;
+
+ /// Get all diary names
+ fn diary_names(&self) -> Result<DiaryNameIterator>;
+
+}
+
+impl Diary for Store {
// create or get a new entry for today
- pub fn new_entry_today(&self) -> Result<Entry> {
+ fn new_entry_today(&self, diary_name: &str) -> Result<FileLockEntry> {
let dt = Local::now();
let ndt = dt.naive_local();
- let id = DiaryId::new(String::from(self.name), ndt.year(), ndt.month(), ndt.day(), 0, 0);
- self.new_entry_by_id(id)
- }
+ let id = DiaryId::new(String::from(diary_name), ndt.year(), ndt.month(), ndt.day(), 0, 0);
- pub fn new_entry_by_id(&self, id: DiaryId) -> Result<Entry> {
- self.retrieve(id.with_diary_name(String::from(self.name)))
+ self.retrieve(id).map_err_into(DEK::StoreReadError)
}
- pub fn retrieve(&self, id: DiaryId) -> Result<Entry> {
- id.into_storeid()
- .and_then(|id| self.store.retrieve(id))
- .map(|fle| Entry::new(fle))
- .map_err(|e| DE::new(DEK::StoreWriteError, Some(Box::new(e))))
+ // create or get a new entry for today
+ fn new_entry_now(&self, diary_name: &str) -> Result<FileLockEntry> {
+ let dt = Local::now();
+ let ndt = dt.naive_local();
+ let id = DiaryId::new(String::from(diary_name),
+ ndt.year(),
+ ndt.month(),
+ ndt.day(),
+ ndt.minute(),
+ ndt.second());
+
+ self.retrieve(id).map_err_into(DEK::StoreReadError)
}
// Get an iterator for iterating over all entries
- pub fn entries(&self) -> Result<DiaryEntryIterator<'a>> {
- self.store
- .retrieve_for_module("diary")
- .map(|iter| DiaryEntryIterator::new(self.name, self.store, iter))
- .map_err(|e| DE::new(DEK::StoreReadError, Some(Box::new(e))))
+ fn entries(&self, diary_name: &str) -> Result<DiaryEntryIterator> {
+ self.retrieve_for_module("diary")
+ .map(|iter| DiaryEntryIterator::new(self, String::from(diary_name), iter))
+ .map_err_into(DEK::StoreReadError)
}
- pub fn delete_entry(&self, entry: Entry) -> Result<()> {
- if !entry.is_in_diary(self.name) {
- return Err(DE::new(DEK::EntryNotInDiary, None));
- }
- let id = entry.get_location().clone();
- drop(entry);
-
- self.store.delete(id)
- .map_err(|e| DE::new(DEK::StoreWriteError, Some(Box::new(e))))
- }
-
- pub fn get_youngest_entry(&self) -> Option<Result<Entry>> {
- match self.entries() {
+ fn get_youngest_entry_id(&self, diary_name: &str) -> Option<Result<DiaryId>> {
+ match Diary::entries(self, diary_name) {
Err(e) => Some(Err(e)),
Ok(entries) => {
- entries.sorted_by(|a, b| {
- match (a, b) {
- (&Ok(ref a), &Ok(ref b)) => {
- let a : NaiveDateTime = a.diary_id().into();
- let b : NaiveDateTime = b.diary_id().into();
-
- a.cmp(&b)
- },
-
- (&Ok(_), &Err(ref e)) => {
- trace_error(e);
- Ordering::Less
- },
- (&Err(ref e), &Ok(_)) => {
- trace_error(e);
- Ordering::Greater
- },
- (&Err(ref e1), &Err(ref e2)) => {
- trace_error(e1);
- trace_error(e2);
- Ordering::Equal
- },
- }
- }).into_iter().next()
+ entries
+ .map(|e| e.and_then(|e| e.diary_id()))
+ .sorted_by(|a, b| {
+ match (a, b) {
+ (&Ok(ref a), &Ok(ref b)) => {
+ let a : NaiveDateTime = a.clone().into();
+ let b : NaiveDateTime = b.clone().into();
+
+ a.cmp(&b)
+ },
+
+ (&Ok(_), &Err(ref e)) => {
+ trace_error(e);
+ Ordering::Less
+ },
+ (&Err(ref e), &Ok(_)) => {
+ trace_error(e);
+ Ordering::Greater
+ },
+ (&Err(ref e1), &Err(ref e2)) => {
+ trace_error(e1);
+ trace_error(e2);
+ Ordering::Equal
+ },
+ }
+ })
+ .into_iter()
+ //.map(|sidres| sidres.map(|sid| DiaryId::from_storeid(&sid)))
+ .next()
}
}
}
- pub fn name(&self) -> &'a str {
- &self.name
+ /// Get all diary names
+ fn diary_names(&self) -> Result<DiaryNameIterator> {
+ self.retrieve_for_module("diary")
+ .map_err_into(DEK::StoreReadError)
+ .map(DiaryNameIterator::new)
}
+
}
diff --git a/lib/domain/libimagdiary/src/entry.rs b/lib/domain/libimagdiary/src/entry.rs
index 0148b59d..2da96199 100644
--- a/lib/domain/libimagdiary/src/entry.rs
+++ b/lib/domain/libimagdiary/src/entry.rs
@@ -17,74 +17,24 @@
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//
-use std::ops::Deref;
-use std::ops::DerefMut;
-
-use libimagstore::store::FileLockEntry;