rrule-rust 2.0.0-next.1 → 2.0.0-next.3

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 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
46
  "branches": ["+([0-9])?(.{+([0-9]),x}).x", "master", {"name": "next", "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
- # Default enable napi4 feature, see https://nodejs.org/api/n-api.html#node-api-version-matrix
12
- napi = { version = "2.11.1", default-features = false, features = ["napi4"] }
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.11.0", features = ["exrule"] }
16
+ rrule = { version = "0.12.0", features = ["exrule"] }
16
17
 
17
18
  [build-dependencies]
18
19
  napi-build = "2.0.1"
@@ -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(1679428740000, 'UTC').addRrule(rrule);
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(1679428740000, 'Pacific/Kiritimati').addRrule(
38
- rrule,
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,25 +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
- export interface NWeekday {
25
- /**
26
- * If set, this represents the nth occurrence of the weekday.
27
- * Otherwise it represents every occurrence of the weekday.
28
- *
29
- * A negative value represents nth occurrence from the end.
30
- */
31
- n?: number
32
- weekday: Weekday
33
- }
34
15
  export const enum Month {
35
16
  January = 0,
36
17
  February = 1,
@@ -45,7 +26,25 @@ export const enum Month {
45
26
  November = 10,
46
27
  December = 11
47
28
  }
48
- export type JsRRule = RRule
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
+ }
49
48
  export class RRule {
50
49
  constructor(frequency: Frequency)
51
50
  static parse(str: string): RRule
@@ -62,11 +61,11 @@ export class RRule {
62
61
  get byWeekno(): Array<number>
63
62
  get byYearday(): Array<number>
64
63
  get weekstart(): Weekday
65
- get until(): number | null
64
+ get until(): RRuleDateTime | null
66
65
  toString(): string
67
66
  setInterval(interval: number): this
68
67
  setCount(count: number): this
69
- setByWeekday(weekdays: readonly Array<NWeekday | Weekday>): this
68
+ setByWeekday(weekdays: ReadonlyArray<NWeekday | Weekday>): this
70
69
  setByHour(hours: ReadonlyArray<number>): this
71
70
  setByMinute(minutes: ReadonlyArray<number>): this
72
71
  setBySecond(seconds: ReadonlyArray<number>): this
@@ -76,27 +75,48 @@ export class RRule {
76
75
  setByWeekno(weekNumbers: ReadonlyArray<number>): this
77
76
  setByYearday(days: ReadonlyArray<number>): this
78
77
  setWeekstart(day: Weekday): this
79
- setUntil(timestamp: number): this
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
80
94
  }
81
- export type JsRRuleSet = RRuleSet
82
95
  export class RRuleSet {
83
- constructor(dtstart: number, tzid: string)
96
+ constructor(dtstart: RRuleDateTime | Date)
84
97
  static parse(str: string): RRuleSet
85
98
  toString(): string
86
99
  addRrule(jsRrule: RRule): this
87
100
  addExrule(jsRrule: RRule): this
88
- addExdate(timestamp: number): this
89
- addRdate(timestamp: number): this
90
- get dtstart(): number
91
- get tzid(): string
101
+ addExdate(dateTime: RRuleDateTime | Date): this
102
+ addRdate(dateTime: RRuleDateTime | Date): this
103
+ get dtstart(): RRuleDateTime
92
104
  getRrules(): Array<RRule>
93
105
  getExrules(): Array<RRule>
94
- getExdates(): Array<number>
95
- getRdates(): Array<number>
96
- all(limit?: number | undefined | null): number[]
97
- between(after: number, before: number, inclusive?: boolean | undefined | null): number[]
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>
98
110
  occurrences(): Occurrences
99
111
  }
100
112
  export class Occurrences {
101
- [Symbol.iterator](): Iterator<number, void, void>
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
102
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, Weekday, Month, RRule, RRuleSet, Occurrences } = nativeBinding
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": "2.0.0-next.1",
3
+ "version": "2.0.0-next.3",
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",
@@ -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": "2.0.0-next.1",
92
- "@rrule-rust/lib-darwin-x64": "2.0.0-next.1",
93
- "@rrule-rust/lib-linux-x64-gnu": "2.0.0-next.1",
94
- "@rrule-rust/lib-darwin-arm64": "2.0.0-next.1",
95
- "@rrule-rust/lib-android-arm64": "2.0.0-next.1",
96
- "@rrule-rust/lib-linux-arm64-gnu": "2.0.0-next.1",
97
- "@rrule-rust/lib-linux-arm64-musl": "2.0.0-next.1",
98
- "@rrule-rust/lib-win32-arm64-msvc": "2.0.0-next.1",
99
- "@rrule-rust/lib-linux-arm-gnueabihf": "2.0.0-next.1",
100
- "@rrule-rust/lib-linux-x64-musl": "2.0.0-next.1",
101
- "@rrule-rust/lib-freebsd-x64": "2.0.0-next.1",
102
- "@rrule-rust/lib-win32-ia32-msvc": "2.0.0-next.1",
103
- "@rrule-rust/lib-android-arm-eabi": "2.0.0-next.1",
104
- "@rrule-rust/lib-darwin-universal": "2.0.0-next.1"
89
+ "@rrule-rust/lib-win32-x64-msvc": "2.0.0-next.3",
90
+ "@rrule-rust/lib-darwin-x64": "2.0.0-next.3",
91
+ "@rrule-rust/lib-linux-x64-gnu": "2.0.0-next.3",
92
+ "@rrule-rust/lib-darwin-arm64": "2.0.0-next.3",
93
+ "@rrule-rust/lib-android-arm64": "2.0.0-next.3",
94
+ "@rrule-rust/lib-linux-arm64-gnu": "2.0.0-next.3",
95
+ "@rrule-rust/lib-linux-arm64-musl": "2.0.0-next.3",
96
+ "@rrule-rust/lib-win32-arm64-msvc": "2.0.0-next.3",
97
+ "@rrule-rust/lib-linux-arm-gnueabihf": "2.0.0-next.3",
98
+ "@rrule-rust/lib-linux-x64-musl": "2.0.0-next.3",
99
+ "@rrule-rust/lib-freebsd-x64": "2.0.0-next.3",
100
+ "@rrule-rust/lib-win32-ia32-msvc": "2.0.0-next.3",
101
+ "@rrule-rust/lib-android-arm-eabi": "2.0.0-next.3",
102
+ "@rrule-rust/lib-darwin-universal": "2.0.0-next.3"
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
+ }
@@ -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
+ }
@@ -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
+ }