summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/error.rs5
-rw-r--r--src/lib.rs1
-rw-r--r--src/matcher.rs37
3 files changed, 43 insertions, 0 deletions
diff --git a/src/error.rs b/src/error.rs
index d450146..39d482f 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -33,6 +33,11 @@ error_chain! {
display("The passed argument is not an amount: {:?}", tt)
}
+ ArgumentErrorNotAMoment(name: &'static str) {
+ description("Argument Error: Not a moment TimeType object")
+ display("The passed argument is not a moment, but a {}", name)
+ }
+
CannotCalculateEndOfYearOn(tt: TimeType) {
description("Argument Error: Cannot calculate end-of-year")
display("Argument Error: Cannot calculate end-of-year on a {:?}", tt)
diff --git a/src/lib.rs b/src/lib.rs
index 60bcfc1..e861ccd 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -7,5 +7,6 @@ pub mod iter;
pub mod result;
pub mod timetype;
pub mod indicator;
+pub mod matcher;
mod util;
diff --git a/src/matcher.rs b/src/matcher.rs
new file mode 100644
index 0000000..1482b68
--- /dev/null
+++ b/src/matcher.rs
@@ -0,0 +1,37 @@
+
+use chrono::Datelike;
+
+use error::KairosError as KE;
+use error::KairosErrorKind as KEK;
+use error::Result;
+use indicator::Day;
+use indicator::Month;
+use timetype::TimeType;
+
+/// A trait to extend indicator::* to be able to match them with a TimeType object
+pub trait Matcher {
+ fn matches(&self, tt: &TimeType) -> Result<bool>;
+}
+
+impl Matcher for Day {
+
+ fn matches(&self, tt: &TimeType) -> Result<bool> {
+ let this : ::chrono::Weekday = self.clone().into();
+ tt.get_moment()
+ .map(|mom| this == mom.weekday())
+ .ok_or(KE::from_kind(KEK::ArgumentErrorNotAMoment(tt.name())))
+ }
+}
+
+impl Matcher for Month {
+
+ fn matches(&self, tt: &TimeType) -> Result<bool> {
+ let this : u32 = self.clone().into();
+ tt.get_moment()
+ .map(|mom| this == mom.month())
+ .ok_or(KE::from_kind(KEK::ArgumentErrorNotAMoment(tt.name())))
+ }
+
+}
+
+