libimagentrydatetime: Move from error-chain to failure
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
This commit is contained in:
parent
f3e7f677b0
commit
a1c65603dc
9 changed files with 45 additions and 152 deletions
|
@ -21,10 +21,10 @@ maintenance = { status = "actively-developed" }
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
chrono = "0.4"
|
chrono = "0.4"
|
||||||
toml-query = "0.7"
|
toml-query = { git = "https://github.com/matthiasbeyer/toml-query", branch = "failure" }
|
||||||
lazy_static = "1"
|
lazy_static = "1"
|
||||||
toml = "0.4"
|
toml = "0.4"
|
||||||
error-chain = "0.12"
|
failure = "0.1"
|
||||||
|
|
||||||
libimagerror = { version = "0.9.0", path = "../../../lib/core/libimagerror" }
|
libimagerror = { version = "0.9.0", path = "../../../lib/core/libimagerror" }
|
||||||
libimagstore = { version = "0.9.0", path = "../../../lib/core/libimagstore" }
|
libimagstore = { version = "0.9.0", path = "../../../lib/core/libimagstore" }
|
||||||
|
|
|
@ -27,9 +27,7 @@ use libimagstore::storeid::StoreId;
|
||||||
|
|
||||||
use datepath::accuracy::Accuracy;
|
use datepath::accuracy::Accuracy;
|
||||||
use datepath::format::Format;
|
use datepath::format::Format;
|
||||||
use datepath::error::Result;
|
use failure::Fallible as Result;
|
||||||
use datepath::error::DatePathCompilerErrorKind as DPCEK;
|
|
||||||
use datepath::error::ResultExt;
|
|
||||||
|
|
||||||
pub struct DatePathCompiler {
|
pub struct DatePathCompiler {
|
||||||
accuracy : Accuracy,
|
accuracy : Accuracy,
|
||||||
|
@ -122,7 +120,6 @@ impl DatePathCompiler {
|
||||||
}
|
}
|
||||||
|
|
||||||
StoreId::new_baseless(PathBuf::from(s))
|
StoreId::new_baseless(PathBuf::from(s))
|
||||||
.chain_err(|| DPCEK::StoreIdBuildFailed)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,38 +0,0 @@
|
||||||
//
|
|
||||||
// imag - the personal information management suite for the commandline
|
|
||||||
// Copyright (C) 2015-2018 Matthias Beyer <mail@beyermatthias.de> and contributors
|
|
||||||
//
|
|
||||||
// This library is free software; you can redistribute it and/or
|
|
||||||
// modify it under the terms of the GNU Lesser General Public
|
|
||||||
// License as published by the Free Software Foundation; version
|
|
||||||
// 2.1 of the License.
|
|
||||||
//
|
|
||||||
// This library is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
// Lesser General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU Lesser General Public
|
|
||||||
// License along with this library; if not, write to the Free Software
|
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
//
|
|
||||||
|
|
||||||
error_chain! {
|
|
||||||
types {
|
|
||||||
DatePathCompilerError, DatePathCompilerErrorKind, ResultExt, Result;
|
|
||||||
}
|
|
||||||
|
|
||||||
errors {
|
|
||||||
UnknownDatePathCompilerError {
|
|
||||||
description("Unknown DatePathCompiler error")
|
|
||||||
display("Unknown DatePathCompiler error")
|
|
||||||
}
|
|
||||||
|
|
||||||
StoreIdBuildFailed {
|
|
||||||
description("Failed building StoreId object")
|
|
||||||
display("Failed building StoreId object")
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
|
|
||||||
pub mod accuracy;
|
pub mod accuracy;
|
||||||
pub mod compiler;
|
pub mod compiler;
|
||||||
pub mod error;
|
|
||||||
pub mod format;
|
pub mod format;
|
||||||
pub mod to_store_id;
|
pub mod to_store_id;
|
||||||
|
|
||||||
|
|
|
@ -18,9 +18,9 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
use chrono::naive::NaiveDateTime;
|
use chrono::naive::NaiveDateTime;
|
||||||
|
use failure::Fallible as Result;
|
||||||
|
|
||||||
use libimagstore::storeid::StoreId;
|
use libimagstore::storeid::StoreId;
|
||||||
use datepath::error::Result;
|
|
||||||
use datepath::compiler::DatePathCompiler;
|
use datepath::compiler::DatePathCompiler;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -24,10 +24,12 @@ use toml_query::read::TomlValueReadTypeExt;
|
||||||
use toml::Value;
|
use toml::Value;
|
||||||
|
|
||||||
use libimagstore::store::Entry;
|
use libimagstore::store::Entry;
|
||||||
|
use libimagerror::errors::ErrorMsg as EM;
|
||||||
|
|
||||||
use error::DateErrorKind as DEK;
|
use failure::Error;
|
||||||
use error::DateError as DE;
|
use failure::Fallible as Result;
|
||||||
use error::*;
|
use failure::ResultExt;
|
||||||
|
use failure::err_msg;
|
||||||
use range::DateTimeRange;
|
use range::DateTimeRange;
|
||||||
|
|
||||||
pub trait EntryDate {
|
pub trait EntryDate {
|
||||||
|
@ -55,16 +57,18 @@ impl EntryDate for Entry {
|
||||||
self.get_header_mut()
|
self.get_header_mut()
|
||||||
.delete(&DATE_HEADER_LOCATION)
|
.delete(&DATE_HEADER_LOCATION)
|
||||||
.map(|_| ())
|
.map(|_| ())
|
||||||
.chain_err(|| DEK::DeleteDateError)
|
.context("Delete date error")
|
||||||
|
.map_err(Error::from)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_date(&self) -> Result<NaiveDateTime> {
|
fn read_date(&self) -> Result<NaiveDateTime> {
|
||||||
self.get_header()
|
self.get_header()
|
||||||
.read_string(&DATE_HEADER_LOCATION)
|
.read_string(&DATE_HEADER_LOCATION)
|
||||||
.chain_err(|| DEK::ReadDateError)?
|
.context("Error while reading date")?
|
||||||
.ok_or(DE::from_kind(DEK::ReadDateError))?
|
.ok_or_else(|| err_msg("Error reading date"))?
|
||||||
.parse::<NaiveDateTime>()
|
.parse::<NaiveDateTime>()
|
||||||
.chain_err(|| DEK::DateTimeParsingError)
|
.context("Datetime parse error")
|
||||||
|
.map_err(Error::from)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set a Date for this entry
|
/// Set a Date for this entry
|
||||||
|
@ -88,13 +92,16 @@ impl EntryDate for Entry {
|
||||||
|
|
||||||
self.get_header_mut()
|
self.get_header_mut()
|
||||||
.insert(&DATE_HEADER_LOCATION, Value::String(date))
|
.insert(&DATE_HEADER_LOCATION, Value::String(date))
|
||||||
|
.map_err(Error::from)
|
||||||
.map(|opt| opt.map(|stri| {
|
.map(|opt| opt.map(|stri| {
|
||||||
stri.as_str()
|
stri.as_str()
|
||||||
.ok_or(DE::from_kind(DEK::DateHeaderFieldTypeError))?
|
.ok_or_else(|| Error::from(EM::EntryHeaderTypeError))?
|
||||||
.parse::<NaiveDateTime>()
|
.parse::<NaiveDateTime>()
|
||||||
.chain_err(|| DEK::DateTimeParsingError)
|
.context("Datetime parse error")
|
||||||
|
.map_err(Error::from)
|
||||||
}))
|
}))
|
||||||
.chain_err(|| DEK::SetDateError)
|
.context("Error setting date")
|
||||||
|
.map_err(Error::from)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -110,30 +117,33 @@ impl EntryDate for Entry {
|
||||||
.get_header_mut()
|
.get_header_mut()
|
||||||
.delete(&DATE_RANGE_START_HEADER_LOCATION)
|
.delete(&DATE_RANGE_START_HEADER_LOCATION)
|
||||||
.map(|_| ())
|
.map(|_| ())
|
||||||
.chain_err(|| DEK::DeleteDateTimeRangeError)?;
|
.context("Delete Datetime range error")?;
|
||||||
|
|
||||||
self.get_header_mut()
|
self.get_header_mut()
|
||||||
.delete(&DATE_RANGE_END_HEADER_LOCATION)
|
.delete(&DATE_RANGE_END_HEADER_LOCATION)
|
||||||
.map(|_| ())
|
.map(|_| ())
|
||||||
.chain_err(|| DEK::DeleteDateTimeRangeError)
|
.context("Delete Datetime range error")
|
||||||
|
.map_err(Error::from)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_date_range(&self) -> Result<DateTimeRange> {
|
fn read_date_range(&self) -> Result<DateTimeRange> {
|
||||||
let start = self
|
let start = self
|
||||||
.get_header()
|
.get_header()
|
||||||
.read_string(&DATE_RANGE_START_HEADER_LOCATION)
|
.read_string(&DATE_RANGE_START_HEADER_LOCATION)
|
||||||
.chain_err(|| DEK::ReadDateTimeRangeError)?
|
.context("Error while reading Datetime range")?
|
||||||
.ok_or_else(|| DE::from_kind(DEK::ReadDateError))
|
.ok_or_else(|| err_msg("Error reading date"))
|
||||||
.and_then(str_to_ndt)?;
|
.and_then(str_to_ndt)?;
|
||||||
|
|
||||||
let end = self
|
let end = self
|
||||||
.get_header()
|
.get_header()
|
||||||
.read_string(&DATE_RANGE_START_HEADER_LOCATION)
|
.read_string(&DATE_RANGE_START_HEADER_LOCATION)
|
||||||
.chain_err(|| DEK::ReadDateTimeRangeError)?
|
.context("Error reading Datetime range")?
|
||||||
.ok_or_else(|| DE::from_kind(DEK::ReadDateError))
|
.ok_or_else(|| err_msg("Error reading date"))
|
||||||
.and_then(str_to_ndt)?;
|
.and_then(str_to_ndt)?;
|
||||||
|
|
||||||
DateTimeRange::new(start, end).chain_err(|| DEK::DateTimeRangeError)
|
DateTimeRange::new(start, end)
|
||||||
|
.context("Datetime Range error")
|
||||||
|
.map_err(Error::from)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set the date range
|
/// Set the date range
|
||||||
|
@ -153,18 +163,19 @@ impl EntryDate for Entry {
|
||||||
.get_header_mut()
|
.get_header_mut()
|
||||||
.insert(&DATE_RANGE_START_HEADER_LOCATION, Value::String(start))
|
.insert(&DATE_RANGE_START_HEADER_LOCATION, Value::String(start))
|
||||||
.map(|opt| opt.as_ref().map(val_to_ndt))
|
.map(|opt| opt.as_ref().map(val_to_ndt))
|
||||||
.chain_err(|| DEK::SetDateTimeRangeError)?;
|
.context("Error setting Datetime range")?;
|
||||||
|
|
||||||
let opt_old_end = self
|
let opt_old_end = self
|
||||||
.get_header_mut()
|
.get_header_mut()
|
||||||
.insert(&DATE_RANGE_END_HEADER_LOCATION, Value::String(end))
|
.insert(&DATE_RANGE_END_HEADER_LOCATION, Value::String(end))
|
||||||
.map(|opt| opt.as_ref().map(val_to_ndt))
|
.map(|opt| opt.as_ref().map(val_to_ndt))
|
||||||
.chain_err(|| DEK::SetDateTimeRangeError)?;
|
.context("Error setting Datetime range")?;
|
||||||
|
|
||||||
match (opt_old_start, opt_old_end) {
|
match (opt_old_start, opt_old_end) {
|
||||||
(Some(Ok(old_start)), Some(Ok(old_end))) => {
|
(Some(Ok(old_start)), Some(Ok(old_end))) => {
|
||||||
let dr = DateTimeRange::new(old_start, old_end)
|
let dr = DateTimeRange::new(old_start, old_end)
|
||||||
.chain_err(|| DEK::DateTimeRangeError);
|
.context("Error processing Datetime range")
|
||||||
|
.map_err(Error::from);
|
||||||
|
|
||||||
Ok(Some(dr))
|
Ok(Some(dr))
|
||||||
},
|
},
|
||||||
|
@ -181,15 +192,18 @@ impl EntryDate for Entry {
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn str_to_ndt(v: String) -> Result<NaiveDateTime> {
|
fn str_to_ndt(v: String) -> Result<NaiveDateTime> {
|
||||||
v.parse::<NaiveDateTime>().chain_err(|| DEK::DateTimeParsingError)
|
v.parse::<NaiveDateTime>()
|
||||||
|
.context("Error parsing Datetime")
|
||||||
|
.map_err(Error::from)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn val_to_ndt(v: &Value) -> Result<NaiveDateTime> {
|
fn val_to_ndt(v: &Value) -> Result<NaiveDateTime> {
|
||||||
v.as_str()
|
v.as_str()
|
||||||
.ok_or(DE::from_kind(DEK::DateHeaderFieldTypeError))?
|
.ok_or_else(|| Error::from(EM::EntryHeaderTypeError))?
|
||||||
.parse::<NaiveDateTime>()
|
.parse::<NaiveDateTime>()
|
||||||
.chain_err(|| DEK::DateTimeParsingError)
|
.context("Datetime parsing error")
|
||||||
|
.map_err(Error::from)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
|
@ -1,77 +0,0 @@
|
||||||
//
|
|
||||||
// imag - the personal information management suite for the commandline
|
|
||||||
// Copyright (C) 2015-2018 Matthias Beyer <mail@beyermatthias.de> and contributors
|
|
||||||
//
|
|
||||||
// This library is free software; you can redistribute it and/or
|
|
||||||
// modify it under the terms of the GNU Lesser General Public
|
|
||||||
// License as published by the Free Software Foundation; version
|
|
||||||
// 2.1 of the License.
|
|
||||||
//
|
|
||||||
// This library is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
// Lesser General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU Lesser General Public
|
|
||||||
// License along with this library; if not, write to the Free Software
|
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
||||||
//
|
|
||||||
|
|
||||||
error_chain! {
|
|
||||||
types {
|
|
||||||
DateError, DateErrorKind, ResultExt, Result;
|
|
||||||
}
|
|
||||||
|
|
||||||
errors {
|
|
||||||
DeleteDateError {
|
|
||||||
description("Error deleting date")
|
|
||||||
display("Error deleting date")
|
|
||||||
}
|
|
||||||
|
|
||||||
ReadDateError {
|
|
||||||
description("Error reading date")
|
|
||||||
display("Error reading date")
|
|
||||||
}
|
|
||||||
|
|
||||||
SetDateError {
|
|
||||||
description("Error setting date")
|
|
||||||
display("Error setting date")
|
|
||||||
}
|
|
||||||
|
|
||||||
DeleteDateTimeRangeError {
|
|
||||||
description("Error deleting date-time range")
|
|
||||||
display("Error deleting date-time range")
|
|
||||||
}
|
|
||||||
|
|
||||||
ReadDateTimeRangeError {
|
|
||||||
description("Error reading date-time range")
|
|
||||||
display("Error reading date-time range")
|
|
||||||
}
|
|
||||||
|
|
||||||
SetDateTimeRangeError {
|
|
||||||
description("Error setting date-time range")
|
|
||||||
display("Error setting date-time range")
|
|
||||||
}
|
|
||||||
|
|
||||||
DateTimeRangeError {
|
|
||||||
description("DateTime Range error")
|
|
||||||
display("DateTime Range error")
|
|
||||||
}
|
|
||||||
|
|
||||||
DateHeaderFieldTypeError {
|
|
||||||
description("Expected the header field in the entry to have type 'String', but have other type")
|
|
||||||
display("Expected the header field in the entry to have type 'String', but have other type")
|
|
||||||
}
|
|
||||||
|
|
||||||
DateTimeParsingError {
|
|
||||||
description("Error parsing DateTime")
|
|
||||||
display("Error parsing DateTime")
|
|
||||||
}
|
|
||||||
|
|
||||||
EndDateTimeBeforeStartDateTime {
|
|
||||||
description("End datetime is before start datetime")
|
|
||||||
display("End datetime is before start datetime")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -39,13 +39,12 @@
|
||||||
extern crate chrono;
|
extern crate chrono;
|
||||||
extern crate toml_query;
|
extern crate toml_query;
|
||||||
extern crate toml;
|
extern crate toml;
|
||||||
#[macro_use] extern crate error_chain;
|
extern crate failure;
|
||||||
|
|
||||||
extern crate libimagerror;
|
extern crate libimagerror;
|
||||||
extern crate libimagstore;
|
extern crate libimagstore;
|
||||||
|
|
||||||
pub mod datepath;
|
pub mod datepath;
|
||||||
pub mod datetime;
|
pub mod datetime;
|
||||||
pub mod error;
|
|
||||||
pub mod range;
|
pub mod range;
|
||||||
|
|
||||||
|
|
|
@ -19,9 +19,8 @@
|
||||||
|
|
||||||
use chrono::naive::NaiveDateTime;
|
use chrono::naive::NaiveDateTime;
|
||||||
|
|
||||||
use error::DateErrorKind as DEK;
|
use failure::Fallible as Result;
|
||||||
use error::DateError as DE;
|
use failure::err_msg;
|
||||||
use error::Result;
|
|
||||||
|
|
||||||
/// A Range between two dates
|
/// A Range between two dates
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||||
|
@ -40,7 +39,7 @@ impl DateTimeRange {
|
||||||
if start < end {
|
if start < end {
|
||||||
Ok(DateTimeRange(start, end))
|
Ok(DateTimeRange(start, end))
|
||||||
} else {
|
} else {
|
||||||
Err(DE::from_kind(DEK::EndDateTimeBeforeStartDateTime))
|
Err(err_msg("End date before start date"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue