rrule-rust 1.2.0 → 2.0.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.releaserc +3 -3
- package/Cargo.toml +4 -3
- package/benchmark/index.ts +6 -4
- package/index.d.ts +55 -25
- package/index.js +4 -2
- package/package.json +17 -19
- package/src/js/frequency.rs +40 -0
- package/src/js/month.rs +56 -0
- package/src/js/n_weekday.rs +36 -0
- package/src/js/rrule.rs +275 -0
- package/src/js/rrule_datetime.rs +128 -0
- package/src/js/rrule_set.rs +258 -0
- package/src/js/rrule_timezone.rs +52 -0
- package/src/js/weekday.rs +40 -0
- package/src/js.rs +17 -0
- package/src/lib.rs +1 -662
package/.releaserc
CHANGED
|
@@ -39,9 +39,9 @@
|
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
],
|
|
42
|
-
"@semantic-release/github",
|
|
43
42
|
"@semantic-release/npm",
|
|
44
|
-
"@semantic-release/git"
|
|
43
|
+
"@semantic-release/git",
|
|
44
|
+
"@semantic-release/github"
|
|
45
45
|
],
|
|
46
|
-
"branches": ["+([0-9])?(.{+([0-9]),x}).x", "master", {"name": "next", "prerelease": true}]
|
|
46
|
+
"branches": ["+([0-9])?(.{+([0-9]),x}).x", "master", {"name": "next", "prerelease": true}, {"name": "alpha", "prerelease": true}]
|
|
47
47
|
}
|
package/Cargo.toml
CHANGED
|
@@ -8,11 +8,12 @@ crate-type = ["cdylib"]
|
|
|
8
8
|
|
|
9
9
|
[dependencies]
|
|
10
10
|
chrono = "0.4.24"
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
chrono-tz = "0.8.5"
|
|
12
|
+
# Default enable napi5 feature, see https://nodejs.org/api/n-api.html#node-api-version-matrix
|
|
13
|
+
napi = { version = "2.11.1", default-features = false, features = ["napi5"] }
|
|
13
14
|
napi-derive = "2.11.0"
|
|
14
15
|
replace_with = "0.1.7"
|
|
15
|
-
rrule = { version = "0.
|
|
16
|
+
rrule = { version = "0.12.0", features = ["exrule"] }
|
|
16
17
|
|
|
17
18
|
[build-dependencies]
|
|
18
19
|
napi-build = "2.0.1"
|
package/benchmark/index.ts
CHANGED
|
@@ -8,7 +8,9 @@ b.suite(
|
|
|
8
8
|
const rrule = new rust.RRule(rust.Frequency.Daily)
|
|
9
9
|
.setCount(30)
|
|
10
10
|
.setInterval(1);
|
|
11
|
-
const set = new rust.RRuleSet(
|
|
11
|
+
const set = new rust.RRuleSet(
|
|
12
|
+
new rust.RRuleDateTime(new Date(1679428740000), 'UTC'),
|
|
13
|
+
).addRrule(rrule);
|
|
12
14
|
|
|
13
15
|
set.all();
|
|
14
16
|
}),
|
|
@@ -34,9 +36,9 @@ b.suite(
|
|
|
34
36
|
const rrule = new rust.RRule(rust.Frequency.Daily)
|
|
35
37
|
.setCount(30)
|
|
36
38
|
.setInterval(1);
|
|
37
|
-
const set = new rust.RRuleSet(
|
|
38
|
-
|
|
39
|
-
);
|
|
39
|
+
const set = new rust.RRuleSet(
|
|
40
|
+
new rust.RRuleDateTime(new Date(1679428740000), 'Pacific/Kiritimati'),
|
|
41
|
+
).addRrule(rrule);
|
|
40
42
|
|
|
41
43
|
set.all();
|
|
42
44
|
}),
|
package/index.d.ts
CHANGED
|
@@ -12,15 +12,6 @@ export const enum Frequency {
|
|
|
12
12
|
Minutely = 5,
|
|
13
13
|
Secondly = 6
|
|
14
14
|
}
|
|
15
|
-
export const enum Weekday {
|
|
16
|
-
Monday = 0,
|
|
17
|
-
Tuesday = 1,
|
|
18
|
-
Wednesday = 2,
|
|
19
|
-
Thursday = 3,
|
|
20
|
-
Friday = 4,
|
|
21
|
-
Saturday = 5,
|
|
22
|
-
Sunday = 6
|
|
23
|
-
}
|
|
24
15
|
export const enum Month {
|
|
25
16
|
January = 0,
|
|
26
17
|
February = 1,
|
|
@@ -35,14 +26,32 @@ export const enum Month {
|
|
|
35
26
|
November = 10,
|
|
36
27
|
December = 11
|
|
37
28
|
}
|
|
38
|
-
export
|
|
29
|
+
export interface NWeekday {
|
|
30
|
+
/**
|
|
31
|
+
* If set, this represents the nth occurrence of the weekday.
|
|
32
|
+
* Otherwise it represents every occurrence of the weekday.
|
|
33
|
+
*
|
|
34
|
+
* A negative value represents nth occurrence from the end.
|
|
35
|
+
*/
|
|
36
|
+
n?: number
|
|
37
|
+
weekday: Weekday
|
|
38
|
+
}
|
|
39
|
+
export const enum Weekday {
|
|
40
|
+
Monday = 0,
|
|
41
|
+
Tuesday = 1,
|
|
42
|
+
Wednesday = 2,
|
|
43
|
+
Thursday = 3,
|
|
44
|
+
Friday = 4,
|
|
45
|
+
Saturday = 5,
|
|
46
|
+
Sunday = 6
|
|
47
|
+
}
|
|
39
48
|
export class RRule {
|
|
40
49
|
constructor(frequency: Frequency)
|
|
41
50
|
static parse(str: string): RRule
|
|
42
51
|
get frequency(): Frequency
|
|
43
52
|
get interval(): number
|
|
44
53
|
get count(): number | null
|
|
45
|
-
get byWeekday():
|
|
54
|
+
get byWeekday(): NWeekday[]
|
|
46
55
|
get byHour(): Array<number>
|
|
47
56
|
get byMinute(): Array<number>
|
|
48
57
|
get bySecond(): Array<number>
|
|
@@ -52,11 +61,11 @@ export class RRule {
|
|
|
52
61
|
get byWeekno(): Array<number>
|
|
53
62
|
get byYearday(): Array<number>
|
|
54
63
|
get weekstart(): Weekday
|
|
55
|
-
get until():
|
|
64
|
+
get until(): RRuleDateTime | null
|
|
56
65
|
toString(): string
|
|
57
66
|
setInterval(interval: number): this
|
|
58
67
|
setCount(count: number): this
|
|
59
|
-
setByWeekday(weekdays: ReadonlyArray<Weekday>): this
|
|
68
|
+
setByWeekday(weekdays: ReadonlyArray<NWeekday | Weekday>): this
|
|
60
69
|
setByHour(hours: ReadonlyArray<number>): this
|
|
61
70
|
setByMinute(minutes: ReadonlyArray<number>): this
|
|
62
71
|
setBySecond(seconds: ReadonlyArray<number>): this
|
|
@@ -66,27 +75,48 @@ export class RRule {
|
|
|
66
75
|
setByWeekno(weekNumbers: ReadonlyArray<number>): this
|
|
67
76
|
setByYearday(days: ReadonlyArray<number>): this
|
|
68
77
|
setWeekstart(day: Weekday): this
|
|
69
|
-
setUntil(
|
|
78
|
+
setUntil(dateTime: RRuleDateTime | Date): this
|
|
79
|
+
}
|
|
80
|
+
export class RRuleDateTime {
|
|
81
|
+
constructor(date: Date | number, timezone?: string | undefined | null)
|
|
82
|
+
get timestamp(): number
|
|
83
|
+
get timezone(): RRuleTimezone
|
|
84
|
+
get day(): number
|
|
85
|
+
get month(): number
|
|
86
|
+
get year(): number
|
|
87
|
+
get hour(): number
|
|
88
|
+
get minute(): number
|
|
89
|
+
get second(): number
|
|
90
|
+
get millisecond(): number
|
|
91
|
+
get toString(): string
|
|
92
|
+
toDate(): Date
|
|
93
|
+
toUtcDate(): Date
|
|
70
94
|
}
|
|
71
|
-
export type JsRRuleSet = RRuleSet
|
|
72
95
|
export class RRuleSet {
|
|
73
|
-
constructor(dtstart:
|
|
96
|
+
constructor(dtstart: RRuleDateTime | Date)
|
|
74
97
|
static parse(str: string): RRuleSet
|
|
75
98
|
toString(): string
|
|
76
99
|
addRrule(jsRrule: RRule): this
|
|
77
100
|
addExrule(jsRrule: RRule): this
|
|
78
|
-
addExdate(
|
|
79
|
-
addRdate(
|
|
80
|
-
get dtstart():
|
|
81
|
-
get tzid(): string
|
|
101
|
+
addExdate(dateTime: RRuleDateTime | Date): this
|
|
102
|
+
addRdate(dateTime: RRuleDateTime | Date): this
|
|
103
|
+
get dtstart(): RRuleDateTime
|
|
82
104
|
getRrules(): Array<RRule>
|
|
83
105
|
getExrules(): Array<RRule>
|
|
84
|
-
getExdates(): Array<
|
|
85
|
-
getRdates(): Array<
|
|
86
|
-
all(limit?: number | undefined | null):
|
|
87
|
-
between(after:
|
|
106
|
+
getExdates(): Array<RRuleDateTime>
|
|
107
|
+
getRdates(): Array<RRuleDateTime>
|
|
108
|
+
all(limit?: number | undefined | null): Array<RRuleDateTime>
|
|
109
|
+
between(after: RRuleDateTime | Date, before: RRuleDateTime | Date, inclusive?: boolean | undefined | null): Array<RRuleDateTime>
|
|
88
110
|
occurrences(): Occurrences
|
|
89
111
|
}
|
|
90
112
|
export class Occurrences {
|
|
91
|
-
[Symbol.iterator](): Iterator<
|
|
113
|
+
[Symbol.iterator](): Iterator<RRuleDateTime, void, void>
|
|
114
|
+
}
|
|
115
|
+
export class RRuleTimezone {
|
|
116
|
+
constructor(tz: string)
|
|
117
|
+
/**
|
|
118
|
+
* The name of the timezone. If the timezone is local, it will return "Local".
|
|
119
|
+
*/
|
|
120
|
+
get name(): string
|
|
121
|
+
get isLocal(): boolean
|
|
92
122
|
}
|
package/index.js
CHANGED
|
@@ -252,11 +252,13 @@ if (!nativeBinding) {
|
|
|
252
252
|
throw new Error(`Failed to load native binding`)
|
|
253
253
|
}
|
|
254
254
|
|
|
255
|
-
const { Frequency,
|
|
255
|
+
const { Frequency, Month, RRule, RRuleDateTime, RRuleSet, Occurrences, RRuleTimezone, Weekday } = nativeBinding
|
|
256
256
|
|
|
257
257
|
module.exports.Frequency = Frequency
|
|
258
|
-
module.exports.Weekday = Weekday
|
|
259
258
|
module.exports.Month = Month
|
|
260
259
|
module.exports.RRule = RRule
|
|
260
|
+
module.exports.RRuleDateTime = RRuleDateTime
|
|
261
261
|
module.exports.RRuleSet = RRuleSet
|
|
262
262
|
module.exports.Occurrences = Occurrences
|
|
263
|
+
module.exports.RRuleTimezone = RRuleTimezone
|
|
264
|
+
module.exports.Weekday = Weekday
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rrule-rust",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0-alpha.2",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"types": "index.d.ts",
|
|
6
6
|
"keywords": [
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
"@typescript-eslint/eslint-plugin": "^5.50.0",
|
|
47
47
|
"@typescript-eslint/parser": "^5.50.0",
|
|
48
48
|
"benny": "^3.7.1",
|
|
49
|
+
"conventional-changelog-conventionalcommits": "^7.0.2",
|
|
49
50
|
"eslint": "^8.33.0",
|
|
50
51
|
"eslint-config-prettier": "^8.6.0",
|
|
51
52
|
"eslint-plugin-eslint-comments": "^3.2.0",
|
|
@@ -75,7 +76,7 @@
|
|
|
75
76
|
"artifacts": "napi artifacts",
|
|
76
77
|
"build": "napi build --platform --release --js-package-name @rrule-rust/lib",
|
|
77
78
|
"build:debug": "napi build --platform",
|
|
78
|
-
"prepublishOnly": "napi prepublish -
|
|
79
|
+
"prepublishOnly": "napi prepublish --skip-gh-release",
|
|
79
80
|
"test": "jest",
|
|
80
81
|
"universal": "napi universal",
|
|
81
82
|
"version": "napi version",
|
|
@@ -84,23 +85,20 @@
|
|
|
84
85
|
"lint:fix": "cargo fmt --all && yarn lint --fix",
|
|
85
86
|
"lint:fix-staged": "lint-staged"
|
|
86
87
|
},
|
|
87
|
-
"dependencies": {
|
|
88
|
-
"conventional-changelog-conventionalcommits": "^7.0.2"
|
|
89
|
-
},
|
|
90
88
|
"optionalDependencies": {
|
|
91
|
-
"@rrule-rust/lib-win32-x64-msvc": "
|
|
92
|
-
"@rrule-rust/lib-darwin-x64": "
|
|
93
|
-
"@rrule-rust/lib-linux-x64-gnu": "
|
|
94
|
-
"@rrule-rust/lib-darwin-arm64": "
|
|
95
|
-
"@rrule-rust/lib-android-arm64": "
|
|
96
|
-
"@rrule-rust/lib-linux-arm64-gnu": "
|
|
97
|
-
"@rrule-rust/lib-linux-arm64-musl": "
|
|
98
|
-
"@rrule-rust/lib-win32-arm64-msvc": "
|
|
99
|
-
"@rrule-rust/lib-linux-arm-gnueabihf": "
|
|
100
|
-
"@rrule-rust/lib-linux-x64-musl": "
|
|
101
|
-
"@rrule-rust/lib-freebsd-x64": "
|
|
102
|
-
"@rrule-rust/lib-win32-ia32-msvc": "
|
|
103
|
-
"@rrule-rust/lib-android-arm-eabi": "
|
|
104
|
-
"@rrule-rust/lib-darwin-universal": "
|
|
89
|
+
"@rrule-rust/lib-win32-x64-msvc": "2.0.0-alpha.2",
|
|
90
|
+
"@rrule-rust/lib-darwin-x64": "2.0.0-alpha.2",
|
|
91
|
+
"@rrule-rust/lib-linux-x64-gnu": "2.0.0-alpha.2",
|
|
92
|
+
"@rrule-rust/lib-darwin-arm64": "2.0.0-alpha.2",
|
|
93
|
+
"@rrule-rust/lib-android-arm64": "2.0.0-alpha.2",
|
|
94
|
+
"@rrule-rust/lib-linux-arm64-gnu": "2.0.0-alpha.2",
|
|
95
|
+
"@rrule-rust/lib-linux-arm64-musl": "2.0.0-alpha.2",
|
|
96
|
+
"@rrule-rust/lib-win32-arm64-msvc": "2.0.0-alpha.2",
|
|
97
|
+
"@rrule-rust/lib-linux-arm-gnueabihf": "2.0.0-alpha.2",
|
|
98
|
+
"@rrule-rust/lib-linux-x64-musl": "2.0.0-alpha.2",
|
|
99
|
+
"@rrule-rust/lib-freebsd-x64": "2.0.0-alpha.2",
|
|
100
|
+
"@rrule-rust/lib-win32-ia32-msvc": "2.0.0-alpha.2",
|
|
101
|
+
"@rrule-rust/lib-android-arm-eabi": "2.0.0-alpha.2",
|
|
102
|
+
"@rrule-rust/lib-darwin-universal": "2.0.0-alpha.2"
|
|
105
103
|
}
|
|
106
104
|
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
use napi_derive::napi;
|
|
2
|
+
|
|
3
|
+
#[napi(js_name = "Frequency")]
|
|
4
|
+
pub enum Frequency {
|
|
5
|
+
Yearly,
|
|
6
|
+
Monthly,
|
|
7
|
+
Weekly,
|
|
8
|
+
Daily,
|
|
9
|
+
Hourly,
|
|
10
|
+
Minutely,
|
|
11
|
+
Secondly,
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
impl From<rrule::Frequency> for Frequency {
|
|
15
|
+
fn from(freq: rrule::Frequency) -> Self {
|
|
16
|
+
match freq {
|
|
17
|
+
rrule::Frequency::Daily => Frequency::Daily,
|
|
18
|
+
rrule::Frequency::Hourly => Frequency::Hourly,
|
|
19
|
+
rrule::Frequency::Minutely => Frequency::Minutely,
|
|
20
|
+
rrule::Frequency::Monthly => Frequency::Monthly,
|
|
21
|
+
rrule::Frequency::Secondly => Frequency::Secondly,
|
|
22
|
+
rrule::Frequency::Weekly => Frequency::Weekly,
|
|
23
|
+
rrule::Frequency::Yearly => Frequency::Yearly,
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
impl Into<rrule::Frequency> for Frequency {
|
|
29
|
+
fn into(self) -> rrule::Frequency {
|
|
30
|
+
match self {
|
|
31
|
+
Frequency::Daily => rrule::Frequency::Daily,
|
|
32
|
+
Frequency::Hourly => rrule::Frequency::Hourly,
|
|
33
|
+
Frequency::Minutely => rrule::Frequency::Minutely,
|
|
34
|
+
Frequency::Monthly => rrule::Frequency::Monthly,
|
|
35
|
+
Frequency::Secondly => rrule::Frequency::Secondly,
|
|
36
|
+
Frequency::Weekly => rrule::Frequency::Weekly,
|
|
37
|
+
Frequency::Yearly => rrule::Frequency::Yearly,
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
package/src/js/month.rs
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
use napi_derive::napi;
|
|
2
|
+
|
|
3
|
+
#[napi(js_name = "Month")]
|
|
4
|
+
pub enum Month {
|
|
5
|
+
January,
|
|
6
|
+
February,
|
|
7
|
+
March,
|
|
8
|
+
April,
|
|
9
|
+
May,
|
|
10
|
+
June,
|
|
11
|
+
July,
|
|
12
|
+
August,
|
|
13
|
+
September,
|
|
14
|
+
October,
|
|
15
|
+
November,
|
|
16
|
+
December,
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
impl From<&u8> for Month {
|
|
20
|
+
fn from(month: &u8) -> Self {
|
|
21
|
+
match month {
|
|
22
|
+
0 => Month::January,
|
|
23
|
+
1 => Month::February,
|
|
24
|
+
2 => Month::March,
|
|
25
|
+
3 => Month::April,
|
|
26
|
+
4 => Month::May,
|
|
27
|
+
5 => Month::June,
|
|
28
|
+
6 => Month::July,
|
|
29
|
+
7 => Month::August,
|
|
30
|
+
8 => Month::September,
|
|
31
|
+
9 => Month::October,
|
|
32
|
+
10 => Month::November,
|
|
33
|
+
11 => Month::December,
|
|
34
|
+
_ => panic!("Unknown month index: {}", month),
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
impl Into<chrono::Month> for Month {
|
|
40
|
+
fn into(self) -> chrono::Month {
|
|
41
|
+
match self {
|
|
42
|
+
Month::January => chrono::Month::January,
|
|
43
|
+
Month::February => chrono::Month::February,
|
|
44
|
+
Month::March => chrono::Month::March,
|
|
45
|
+
Month::April => chrono::Month::April,
|
|
46
|
+
Month::May => chrono::Month::May,
|
|
47
|
+
Month::June => chrono::Month::June,
|
|
48
|
+
Month::July => chrono::Month::July,
|
|
49
|
+
Month::August => chrono::Month::August,
|
|
50
|
+
Month::September => chrono::Month::September,
|
|
51
|
+
Month::October => chrono::Month::October,
|
|
52
|
+
Month::November => chrono::Month::November,
|
|
53
|
+
Month::December => chrono::Month::December,
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
use super::weekday::Weekday;
|
|
2
|
+
use napi_derive::napi;
|
|
3
|
+
|
|
4
|
+
#[napi(object, js_name = "NWeekday")]
|
|
5
|
+
pub struct NWeekday {
|
|
6
|
+
/// If set, this represents the nth occurrence of the weekday.
|
|
7
|
+
/// Otherwise it represents every occurrence of the weekday.
|
|
8
|
+
///
|
|
9
|
+
/// A negative value represents nth occurrence from the end.
|
|
10
|
+
pub n: Option<i16>,
|
|
11
|
+
pub weekday: Weekday,
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
impl From<rrule::NWeekday> for NWeekday {
|
|
15
|
+
fn from(nday: rrule::NWeekday) -> Self {
|
|
16
|
+
match nday {
|
|
17
|
+
rrule::NWeekday::Every(weekday) => NWeekday {
|
|
18
|
+
n: None,
|
|
19
|
+
weekday: Weekday::from(weekday),
|
|
20
|
+
},
|
|
21
|
+
rrule::NWeekday::Nth(n, weekday) => NWeekday {
|
|
22
|
+
n: Some(n),
|
|
23
|
+
weekday: weekday.into(),
|
|
24
|
+
},
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
impl Into<rrule::NWeekday> for NWeekday {
|
|
30
|
+
fn into(self) -> rrule::NWeekday {
|
|
31
|
+
match self.n {
|
|
32
|
+
Some(n) => rrule::NWeekday::Nth(n, self.weekday.into()),
|
|
33
|
+
None => rrule::NWeekday::Every(self.weekday.into()),
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
package/src/js/rrule.rs
ADDED
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
use super::{Frequency, Month, NWeekday, RRuleDateTime, Weekday};
|
|
2
|
+
use chrono::DateTime;
|
|
3
|
+
use napi::{bindgen_prelude::Array, Either, Env};
|
|
4
|
+
use napi_derive::napi;
|
|
5
|
+
use replace_with::replace_with_or_abort;
|
|
6
|
+
|
|
7
|
+
#[napi(js_name = "RRule")]
|
|
8
|
+
pub struct RRule {
|
|
9
|
+
rrule: rrule::RRule<rrule::Unvalidated>,
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
#[napi]
|
|
13
|
+
impl RRule {
|
|
14
|
+
#[napi(constructor)]
|
|
15
|
+
pub fn new(frequency: Frequency) -> Self {
|
|
16
|
+
let rrule = rrule::RRule::new(frequency.into());
|
|
17
|
+
|
|
18
|
+
RRule { rrule }
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
#[napi(factory, ts_return_type = "RRule")]
|
|
22
|
+
pub fn parse(str: String) -> napi::Result<Self> {
|
|
23
|
+
let rrule: rrule::RRule<rrule::Unvalidated> = str
|
|
24
|
+
.parse()
|
|
25
|
+
.map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?;
|
|
26
|
+
|
|
27
|
+
Ok(RRule { rrule })
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
#[napi(getter)]
|
|
31
|
+
pub fn frequency(&self) -> napi::Result<Frequency> {
|
|
32
|
+
Ok(Frequency::from(self.rrule.get_freq()))
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
#[napi(getter)]
|
|
36
|
+
pub fn interval(&self) -> napi::Result<u16> {
|
|
37
|
+
Ok(self.rrule.get_interval())
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
#[napi(getter)]
|
|
41
|
+
pub fn count(&self) -> napi::Result<Option<u32>> {
|
|
42
|
+
Ok(self.rrule.get_count())
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
#[napi(getter, ts_return_type = "NWeekday[]")]
|
|
46
|
+
pub fn by_weekday(&self) -> Vec<NWeekday> {
|
|
47
|
+
return self
|
|
48
|
+
.rrule
|
|
49
|
+
.get_by_weekday()
|
|
50
|
+
.iter()
|
|
51
|
+
.map(|nday| NWeekday::from(*nday))
|
|
52
|
+
.collect();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
#[napi(getter)]
|
|
56
|
+
pub fn by_hour(&self) -> napi::Result<Vec<u8>> {
|
|
57
|
+
Ok(self.rrule.get_by_hour().to_vec())
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
#[napi(getter)]
|
|
61
|
+
pub fn by_minute(&self) -> napi::Result<Vec<u8>> {
|
|
62
|
+
Ok(self.rrule.get_by_minute().to_vec())
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
#[napi(getter)]
|
|
66
|
+
pub fn by_second(&self) -> napi::Result<Vec<u8>> {
|
|
67
|
+
Ok(self.rrule.get_by_second().to_vec())
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
#[napi(getter)]
|
|
71
|
+
pub fn by_monthday(&self) -> napi::Result<Vec<i8>> {
|
|
72
|
+
Ok(self.rrule.get_by_month_day().to_vec())
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
#[napi(getter)]
|
|
76
|
+
pub fn by_setpos(&self) -> napi::Result<Vec<i32>> {
|
|
77
|
+
Ok(self.rrule.get_by_set_pos().to_vec())
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
#[napi(getter, ts_return_type = "Month[]")]
|
|
81
|
+
pub fn by_month(&self, env: Env) -> napi::Result<Array> {
|
|
82
|
+
let months = self.rrule.get_by_month();
|
|
83
|
+
let mut arr = env.create_array(0)?;
|
|
84
|
+
|
|
85
|
+
for month in months.iter() {
|
|
86
|
+
arr.insert(Month::from(month))?;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
Ok(arr)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
#[napi(getter)]
|
|
93
|
+
pub fn by_weekno(&self) -> napi::Result<Vec<i8>> {
|
|
94
|
+
Ok(self.rrule.get_by_week_no().to_vec())
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
#[napi(getter)]
|
|
98
|
+
pub fn by_yearday(&self) -> napi::Result<Vec<i16>> {
|
|
99
|
+
Ok(self.rrule.get_by_year_day().to_vec())
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
#[napi(getter)]
|
|
103
|
+
pub fn weekstart(&self) -> napi::Result<Weekday> {
|
|
104
|
+
Ok(Weekday::from(self.rrule.get_week_start()))
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
#[napi(getter)]
|
|
108
|
+
pub fn until(&self) -> napi::Result<Option<RRuleDateTime>> {
|
|
109
|
+
Ok(match self.rrule.get_until() {
|
|
110
|
+
Some(until) => Some(RRuleDateTime::new_with_date_time(until.clone())),
|
|
111
|
+
None => None,
|
|
112
|
+
})
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
#[napi]
|
|
116
|
+
pub fn to_string(&self) -> napi::Result<String> {
|
|
117
|
+
Ok(self.rrule.to_string())
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
#[napi]
|
|
121
|
+
pub fn set_interval(&mut self, interval: u16) -> napi::Result<&Self> {
|
|
122
|
+
replace_with_or_abort(&mut self.rrule, |self_| self_.interval(interval));
|
|
123
|
+
|
|
124
|
+
Ok(self)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
#[napi]
|
|
128
|
+
pub fn set_count(&mut self, count: u32) -> napi::Result<&Self> {
|
|
129
|
+
replace_with_or_abort(&mut self.rrule, |self_| self_.count(count));
|
|
130
|
+
|
|
131
|
+
Ok(self)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
#[napi]
|
|
135
|
+
pub fn set_by_weekday(
|
|
136
|
+
&mut self,
|
|
137
|
+
#[napi(ts_arg_type = "ReadonlyArray<NWeekday | Weekday>")] weekdays: Vec<
|
|
138
|
+
Either<NWeekday, Weekday>,
|
|
139
|
+
>,
|
|
140
|
+
) -> napi::Result<&Self> {
|
|
141
|
+
let by_weekday = weekdays
|
|
142
|
+
.into_iter()
|
|
143
|
+
.map(|weekday| match weekday {
|
|
144
|
+
Either::A(nday) => nday.into(),
|
|
145
|
+
Either::B(weekday) => rrule::NWeekday::Every(weekday.into()),
|
|
146
|
+
})
|
|
147
|
+
.collect();
|
|
148
|
+
|
|
149
|
+
replace_with_or_abort(&mut self.rrule, |self_| self_.by_weekday(by_weekday));
|
|
150
|
+
|
|
151
|
+
Ok(self)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
#[napi]
|
|
155
|
+
pub fn set_by_hour(
|
|
156
|
+
&mut self,
|
|
157
|
+
#[napi(ts_arg_type = "ReadonlyArray<number>")] hours: Vec<u8>,
|
|
158
|
+
) -> napi::Result<&Self> {
|
|
159
|
+
replace_with_or_abort(&mut self.rrule, |self_| self_.by_hour(hours));
|
|
160
|
+
|
|
161
|
+
Ok(self)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
#[napi]
|
|
165
|
+
pub fn set_by_minute(
|
|
166
|
+
&mut self,
|
|
167
|
+
#[napi(ts_arg_type = "ReadonlyArray<number>")] minutes: Vec<u8>,
|
|
168
|
+
) -> napi::Result<&Self> {
|
|
169
|
+
replace_with_or_abort(&mut self.rrule, |self_| self_.by_minute(minutes));
|
|
170
|
+
|
|
171
|
+
Ok(self)
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
#[napi]
|
|
175
|
+
pub fn set_by_second(
|
|
176
|
+
&mut self,
|
|
177
|
+
#[napi(ts_arg_type = "ReadonlyArray<number>")] seconds: Vec<u8>,
|
|
178
|
+
) -> napi::Result<&Self> {
|
|
179
|
+
replace_with_or_abort(&mut self.rrule, |self_| self_.by_second(seconds));
|
|
180
|
+
|
|
181
|
+
Ok(self)
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
#[napi]
|
|
185
|
+
pub fn set_by_monthday(
|
|
186
|
+
&mut self,
|
|
187
|
+
#[napi(ts_arg_type = "ReadonlyArray<number>")] days: Vec<i8>,
|
|
188
|
+
) -> napi::Result<&Self> {
|
|
189
|
+
replace_with_or_abort(&mut self.rrule, |self_| self_.by_month_day(days));
|
|
190
|
+
|
|
191
|
+
Ok(self)
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
#[napi]
|
|
195
|
+
pub fn set_by_setpos(
|
|
196
|
+
&mut self,
|
|
197
|
+
#[napi(ts_arg_type = "ReadonlyArray<number>")] poses: Vec<i32>,
|
|
198
|
+
) -> napi::Result<&Self> {
|
|
199
|
+
replace_with_or_abort(&mut self.rrule, |self_| self_.by_set_pos(poses));
|
|
200
|
+
|
|
201
|
+
Ok(self)
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
#[napi]
|
|
205
|
+
pub fn set_by_month(
|
|
206
|
+
&mut self,
|
|
207
|
+
#[napi(ts_arg_type = "ReadonlyArray<Month>")] months: Array,
|
|
208
|
+
) -> napi::Result<&Self> {
|
|
209
|
+
let mut vec: Vec<chrono::Month> = Vec::new();
|
|
210
|
+
|
|
211
|
+
for i in 0..months.len() {
|
|
212
|
+
let month: Month = months.get(i).unwrap().unwrap();
|
|
213
|
+
|
|
214
|
+
vec.push(month.into());
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
replace_with_or_abort(&mut self.rrule, |self_| self_.by_month(&vec));
|
|
218
|
+
|
|
219
|
+
Ok(self)
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
#[napi]
|
|
223
|
+
pub fn set_by_weekno(
|
|
224
|
+
&mut self,
|
|
225
|
+
#[napi(ts_arg_type = "ReadonlyArray<number>")] week_numbers: Vec<i8>,
|
|
226
|
+
) -> napi::Result<&Self> {
|
|
227
|
+
replace_with_or_abort(&mut self.rrule, |self_| self_.by_week_no(week_numbers));
|
|
228
|
+
|
|
229
|
+
Ok(self)
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
#[napi]
|
|
233
|
+
pub fn set_by_yearday(
|
|
234
|
+
&mut self,
|
|
235
|
+
#[napi(ts_arg_type = "ReadonlyArray<number>")] days: Vec<i16>,
|
|
236
|
+
) -> napi::Result<&Self> {
|
|
237
|
+
replace_with_or_abort(&mut self.rrule, |self_| self_.by_year_day(days));
|
|
238
|
+
|
|
239
|
+
Ok(self)
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
#[napi]
|
|
243
|
+
pub fn set_weekstart(&mut self, day: Weekday) -> napi::Result<&Self> {
|
|
244
|
+
replace_with_or_abort(&mut self.rrule, |self_| self_.week_start(day.into()));
|
|
245
|
+
|
|
246
|
+
Ok(self)
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
#[napi]
|
|
250
|
+
pub fn set_until(
|
|
251
|
+
&mut self,
|
|
252
|
+
date_time: napi::Either<&RRuleDateTime, napi::JsDate>,
|
|
253
|
+
) -> napi::Result<&Self> {
|
|
254
|
+
let date_time = RRuleDateTime::from(date_time);
|
|
255
|
+
replace_with_or_abort(&mut self.rrule, |self_| self_.until(date_time.into()));
|
|
256
|
+
|
|
257
|
+
Ok(self)
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
pub fn validate(&self, dt_start: DateTime<rrule::Tz>) -> napi::Result<rrule::RRule> {
|
|
261
|
+
return Ok(
|
|
262
|
+
self
|
|
263
|
+
.rrule
|
|
264
|
+
.clone()
|
|
265
|
+
.validate(dt_start)
|
|
266
|
+
.map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?,
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
impl From<rrule::RRule<rrule::Unvalidated>> for RRule {
|
|
272
|
+
fn from(rrule: rrule::RRule<rrule::Unvalidated>) -> Self {
|
|
273
|
+
Self { rrule }
|
|
274
|
+
}
|
|
275
|
+
}
|