summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.toml2
-rw-r--r--src/lib.rs11
-rw-r--r--src/options.rs94
-rw-r--r--src/parse_options.rs3
-rw-r--r--src/rrulestr.rs78
-rw-r--r--src/yearinfo.rs15
-rw-r--r--tests/rrule.rs1
7 files changed, 102 insertions, 102 deletions
diff --git a/Cargo.toml b/Cargo.toml
index e2e20e5..c00d167 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -2,7 +2,7 @@
name = "rrule"
description = "A pure Rust (partial) implementation of recurrence rules as defined in the iCalendar RFC."
license = "MIT"
-version = "0.2.1"
+version = "0.2.2"
authors = ["Fredrik Meringdal"]
edition = "2018"
diff --git a/src/lib.rs b/src/lib.rs
index f56120c..61a5d00 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -11,15 +11,14 @@ mod iterinfo;
mod masks;
mod monthinfo;
mod poslist;
-mod rrulestr;
mod parse_options;
mod yearinfo;
mod options;
+mod rrulestr;
mod rrule;
mod rruleset;
-pub use rrulestr::build_rule;
-pub use rrule::RRule;
-pub use rruleset::RRuleSet;
-pub use options::{Frequenzy, ParsedOptions};
-pub use rrulestr::PartialOptions; \ No newline at end of file
+pub use crate::rrule::RRule;
+pub use crate::rruleset::RRuleSet;
+pub use crate::rrulestr::build_rule;
+pub use crate::options::{Frequenzy, ParsedOptions, PartialOptions}; \ No newline at end of file
diff --git a/src/options.rs b/src/options.rs
index a6736a8..e29d8fe 100644
--- a/src/options.rs
+++ b/src/options.rs
@@ -1,19 +1,5 @@
use chrono::prelude::*;
-#[derive(Debug)]
-pub struct YearInfo {
- pub yearlen: usize,
- pub nextyearlen: usize,
- pub yearordinal: isize,
- pub yearweekday: usize,
- pub mmask: Vec<usize>,
- pub mrange: Vec<usize>,
- pub mdaymask: Vec<isize>,
- pub nmdaymask: Vec<isize>,
- pub wdaymask: Vec<usize>,
- pub wnomask: Option<Vec<usize>>,
-}
-
#[derive(Debug, PartialEq, PartialOrd, Clone)]
pub enum Frequenzy {
Yearly = 0,
@@ -46,4 +32,84 @@ pub struct ParsedOptions {
pub bysecond: Vec<usize>,
pub bynweekday: Vec<Vec<isize>>,
pub byeaster: Option<isize>,
+}
+
+#[derive(Debug, Clone)]
+pub struct PartialOptions {
+ pub freq: Option<Frequenzy>,
+ pub interval: Option<usize>,
+ pub count: Option<u32>,
+ pub until: Option<DateTime<Utc>>,
+ pub tzid: Option<String>,
+ pub dtstart: Option<DateTime<Utc>>,
+ pub wkst: Option<usize>,
+ pub bysetpos: Option<Vec<isize>>,
+ pub bymonth: Option<Vec<usize>>,
+ pub bymonthday: Option<Vec<isize>>,
+ pub bynmonthday: Option<Vec<isize>>,
+ pub byyearday: Option<Vec<isize>>,
+ pub byweekno: Option<Vec<isize>>,
+ pub byweekday: Option<Vec<usize>>,
+ pub byhour: Option<Vec<usize>>,
+ pub byminute: Option<Vec<usize>>,
+ pub bysecond: Option<Vec<usize>>,
+ pub bynweekday: Option<Vec<Vec<isize>>>,
+ pub byeaster: Option<isize>,
+}
+
+impl PartialOptions {
+ pub fn new() -> Self {
+ Self {
+ freq: None,
+ interval: None,
+ count: None,
+ until: None,
+ tzid: None,
+ dtstart: None,
+ wkst: None,
+ bysetpos: None,
+ bymonth: None,
+ bymonthday: None,
+ bynmonthday: None,
+ byyearday: None,
+ byweekno: None,
+ byweekday: None,
+ byhour: None,
+ byminute: None,
+ bysecond: None,
+ bynweekday: None,
+ byeaster: None,
+ }
+ }
+
+ fn is_some_or_none<'a, T>(prop1: &'a Option<T>, prop2: &'a Option<T>) -> &'a Option<T> {
+ if prop2.is_some() {
+ return prop2;
+ }
+ prop1
+ }
+
+ pub fn concat(opt1: &Self, opt2: &Self) -> Self {
+ Self {
+ freq: Self::is_some_or_none(&opt1.freq, &opt2.freq).clone(),
+ interval: Self::is_some_or_none(&opt1.interval, &opt2.interval).clone(),
+ count: Self::is_some_or_none(&opt1.count, &opt2.count).clone(),
+ until: Self::is_some_or_none(&opt1.until, &opt2.until).clone(),
+ tzid: Self::is_some_or_none(&opt1.tzid, &opt2.tzid).clone(),
+ dtstart: Self::is_some_or_none(&opt1.dtstart, &opt2.dtstart).clone(),
+ wkst: Self::is_some_or_none(&opt1.wkst, &opt2.wkst).clone(),
+ bysetpos: Self::is_some_or_none(&opt1.bysetpos, &opt2.bysetpos).clone(),
+ bymonth: Self::is_some_or_none(&opt1.bymonth, &opt2.bymonth).clone(),
+ bymonthday: Self::is_some_or_none(&opt1.bymonthday, &opt2.bymonthday).clone(),
+ bynmonthday: Self::is_some_or_none(&opt1.bynmonthday, &opt2.bynmonthday).clone(),
+ byyearday: Self::is_some_or_none(&opt1.byyearday, &opt2.byyearday).clone(),
+ byweekno: Self::is_some_or_none(&opt1.byweekno, &opt2.byweekno).clone(),
+ byweekday: Self::is_some_or_none(&opt1.byweekday, &opt2.byweekday).clone(),
+ byhour: Self::is_some_or_none(&opt1.byhour, &opt2.byhour).clone(),
+ byminute: Self::is_some_or_none(&opt1.byminute, &opt2.byminute).clone(),
+ bysecond: Self::is_some_or_none(&opt1.bysecond, &opt2.bysecond).clone(),
+ bynweekday: Self::is_some_or_none(&opt1.bynweekday, &opt2.bynweekday).clone(),
+ byeaster: Self::is_some_or_none(&opt1.byeaster, &opt2.byeaster).clone(),
+ }
+ }
} \ No newline at end of file
diff --git a/src/parse_options.rs b/src/parse_options.rs
index 86c3f94..4071cbc 100644
--- a/src/parse_options.rs
+++ b/src/parse_options.rs
@@ -1,6 +1,5 @@
use chrono::prelude::*;
-use crate::rrulestr::PartialOptions;
-use crate::options::{ParsedOptions, Frequenzy};
+use crate::options::{ParsedOptions, Frequenzy, PartialOptions};
// TODO: make this method on partialoptions struct
pub fn parse_options(options: &PartialOptions) -> ParsedOptions {
diff --git a/src/rrulestr.rs b/src/rrulestr.rs
index 98db39a..c1bfc67 100644
--- a/src/rrulestr.rs
+++ b/src/rrulestr.rs
@@ -15,85 +15,7 @@ static DTSTART_RE: Lazy<Regex> =
static RRUle_RE: Lazy<Regex> = Lazy::new(|| Regex::new(r"(?m)^(?:RRULE|EXRULE):").unwrap());
-#[derive(Debug, Clone)]
-pub struct PartialOptions {
- pub freq: Option<Frequenzy>,
- pub interval: Option<usize>,
- pub count: Option<u32>,
- pub until: Option<DateTime<Utc>>,
- pub tzid: Option<String>,
- pub dtstart: Option<DateTime<Utc>>,
- pub wkst: Option<usize>,
- pub bysetpos: Option<Vec<isize>>,
- pub bymonth: Option<Vec<usize>>,
- pub bymonthday: Option<Vec<isize>>,
- pub bynmonthday: Option<Vec<isize>>,
- pub byyearday: Option<Vec<isize>>,
- pub byweekno: Option<Vec<isize>>,
- pub byweekday: Option<Vec<usize>>,
- pub byhour: Option<Vec<usize>>,
- pub byminute: Option<Vec<usize>>,
- pub bysecond: Option<Vec<usize>>,
- pub bynweekday: Option<Vec<Vec<isize>>>,
- pub byeaster: Option<isize>,
-}
-impl PartialOptions {
- pub fn new() -> Self {
- Self {
- freq: None,
- interval: None,
- count: None,
- until: None,
- tzid: None,
- dtstart: None,
- wkst: None,
- bysetpos: None,
- bymonth: None,
- bymonthday: None,
- bynmonthday: None,
- byyearday: None,
- byweekno: None,
- byweekday: None,
- byhour: None,
- byminute: None,
- bysecond: None,
- bynweekday: None,
- byeaster: None,
- }
- }
-
- fn is_some_or_none<'a, T>(prop1: &'a Option<T>, prop2: &'a Option<T>) -> &'a Option<T> {
- if prop2.is_some() {
- return prop2;
- }
- prop1
- }
-
- pub fn concat(opt1: &Self, opt2: &Self) -> Self {
- Self {
- freq: Self::is_some_or_none(&opt1.freq, &opt2.freq).clone(),
- interval: Self::is_some_or_none(&opt1.interval, &opt2.interval).clone(),
- count: Self::is_some_or_none(&opt1.count, &opt2.count).clone(),
- until: Self::is_some_or_none(&opt1.until, &opt2.until).clone(),
- tzid: Self::is_some_or_none(&opt1.tzid, &opt2.tzid).clone(),
- dtstart: Self::is_some_or_none(&opt1.dtstart, &opt2.dtstart).clone(),
- wkst: Self::is_some_or_none(&opt1.wkst, &opt2.wkst).clone(),
- bysetpos: Self::is_some_or_none(&opt1.bysetpos, &opt2.bysetpos).clone(),
- bymonth: Self::is_some_or_none(&opt1.bymonth, &opt2.bymonth).clone(),
- bymonthday: Self::is_some_or_none(&opt1.bymonthday, &opt2.bymonthday).clone(),
- bynmonthday: Self::is_some_or_none(&opt1.bynmonthday, &opt2.bynmonthday).clone(),
- byyearday: Self::is_some_or_none(&opt1.byyearday, &opt2.byyearday).clone(),
- byweekno: Self::is_some_or_none(&opt1.byweekno, &opt2.byweekno).clone(),
- byweekday: Self::is_some_or_none(&opt1.byweekday, &opt2.byweekday).clone(),
- byhour: Self::is_some_or_none(&opt1.byhour, &opt2.byhour).clone(),
- byminute: Self::is_some_or_none(&opt1.byminute, &opt2.byminute).clone(),
- bysecond: Self::is_some_or_none(&opt1.bysecond, &opt2.bysecond).clone(),
- bynweekday: Self::is_some_or_none(&opt1.bynweekday, &opt2.bynweekday).clone(),
- byeaster: Self::is_some_or_none(&opt1.byeaster, &opt2.byeaster).clone(),
- }
- }
-}
fn datestring_to_date(dt: &str) -> DateTime<Utc> {
let bits = DATESTR_RE.captures(dt).unwrap();
diff --git a/src/yearinfo.rs b/src/yearinfo.rs
index 8d7fd4b..9bc0906 100644
--- a/src/yearinfo.rs
+++ b/src/yearinfo.rs
@@ -3,6 +3,21 @@ use crate::options::*;
use chrono::prelude::*;
use chrono::DateTime;
+
+#[derive(Debug)]
+pub struct YearInfo {
+ pub yearlen: usize,
+ pub nextyearlen: usize,
+ pub yearordinal: isize,
+ pub yearweekday: usize,
+ pub mmask: Vec<usize>,
+ pub mrange: Vec<usize>,
+ pub mdaymask: Vec<isize>,
+ pub nmdaymask: Vec<isize>,
+ pub wdaymask: Vec<usize>,
+ pub wnomask: Option<Vec<usize>>,
+}
+
fn is_leap_year(year: i32) -> bool {
year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)
}
diff --git a/tests/rrule.rs b/tests/rrule.rs
index e23b270..6c5ffa3 100644
--- a/tests/rrule.rs
+++ b/tests/rrule.rs
@@ -4,7 +4,6 @@ extern crate rrule;
use chrono::prelude::*;
use chrono_tz::UTC;
-use rrule::options::*;
use rrule::{RRule, ParsedOptions, Frequenzy};
#[cfg(test)]