Skip to content

Commit

Permalink
Merge pull request #258 from lsndr/next
Browse files Browse the repository at this point in the history
Release v2.0.2
  • Loading branch information
lsndr authored Aug 11, 2024
2 parents 0aa37b8 + d00979b commit 50200fa
Show file tree
Hide file tree
Showing 15 changed files with 371 additions and 200 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/build-and-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -140,13 +140,13 @@ jobs:
- uses: actions/checkout@v4
- name: Build
id: build
uses: cross-platform-actions/action@v0.24.0
uses: cross-platform-actions/action@v0.25.0
env:
DEBUG: napi:*
RUSTUP_IO_THREADS: 1
with:
operating_system: freebsd
version: '13.2'
version: '14.1'
memory: 8G
cpu_count: 3
environment_variables: 'DEBUG RUSTUP_IO_THREADS'
Expand Down
28 changes: 14 additions & 14 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 6 additions & 6 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@ crate-type = ["cdylib"]
path = "lib/lib.rs"

[dependencies]
chrono = "0.4.24"
chrono-tz = "0.8.5"
indexmap = "2.2.6"
chrono = "0.4.19"
chrono-tz = "0.9.0"
indexmap = "2.3.0"
itertools = "0.13.0"
# Default enable napi5 feature, see https://nodejs.org/api/n-api.html#node-api-version-matrix
napi = { version = "2.16.6", default-features = false, features = ["napi5"] }
napi-derive = "2.16.5"
napi = { version = "2.16.8", default-features = false, features = ["napi5"] }
napi-derive = "2.16.10"
replace_with = "0.1.7"
rrule = { version = "0.12.0", features = ["exrule"] }
rrule = { version = "0.13.0", features = ["exrule"] }

[build-dependencies]
napi-build = "2.0.1"
Expand Down
14 changes: 14 additions & 0 deletions benchmark/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,20 @@ function suite(tzid: string) {

set.all();
}),
b.add('...RRuleSet (rust)', () => {
const rrule = new rust.RRule({
frequency: rust.Frequency.Daily,
count: 30,
interval: 1,
});
const set = new rust.RRuleSet({
dtstart: rust.DateTime.create(2023, 2, 21, 23, 59, 0, false),
tzid,
rrules: [rrule],
});

[...set];
}),
b.add('RRule.all() (node)', () => {
const rrule = new node.RRule({
freq: node.RRule.DAILY,
Expand Down
59 changes: 23 additions & 36 deletions lib/js/rrule_set.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ use crate::rrule::exdate::ExDate;
use crate::rrule::rdate::RDate;
use crate::rrule::{rrule, rrule_set};
use napi::bindgen_prelude::{Array, Reference, SharedReference};
use napi::iterator::Generator;
use napi::Env;
use napi_derive::napi;
use replace_with::replace_with_or_abort_and_return;
Expand Down Expand Up @@ -162,8 +161,11 @@ impl RRuleSet {

#[napi(ts_return_type = "number[]")]
pub fn all(&self, limit: Option<i32>) -> napi::Result<Vec<i64>> {
let iterator = self.rrule_set.iterator();
let iter = iterator.into_iter().map(|date| (&date).into());
let iterator = self
.rrule_set
.iterator()
.map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?;
let iter = iterator.map(|date| (&date).into());

if let Some(limit) = limit {
return Ok(iter.take(limit as usize).collect());
Expand Down Expand Up @@ -215,10 +217,12 @@ impl RRuleSet {
.map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?
.timestamp_millis();

let iterator = self.rrule_set.iterator();
let iter = iterator.into_iter();
let iterator = self
.rrule_set
.iterator()
.map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?;

for date in iter {
for date in iterator {
let date_timestamp = date
.to_datetime(&timezone)
.map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?
Expand Down Expand Up @@ -258,46 +262,29 @@ impl RRuleSet {
}

#[napi]
pub fn iterator(&self) -> napi::Result<RRuleSetIterator> {
Ok(RRuleSetIterator {
iterator: self.rrule_set.iterator(),
})
pub fn iterator(&self, this: Reference<RRuleSet>, env: Env) -> napi::Result<RRuleSetIterator> {
let iterator = this.share_with(env, |set: &mut RRuleSet| {
Ok(
set
.rrule_set
.iterator()
.map_err(|e| napi::Error::new(napi::Status::GenericFailure, e))?,
)
})?;

Ok(RRuleSetIterator { iterator })
}
}

#[napi]
pub struct RRuleSetIterator {
iterator: rrule_set::RRuleSetIterator,
iterator: SharedReference<RRuleSet, rrule_set::RRuleSetIterator>,
}

#[napi]
impl RRuleSetIterator {
#[napi]
pub fn iterator(
&self,
this: Reference<RRuleSetIterator>,
env: Env,
) -> napi::Result<RRuleSetIteratorIterable> {
let iterator = this.share_with(env, |iter: &mut RRuleSetIterator| {
Ok(iter.iterator.into_iter())
})?;

Ok(RRuleSetIteratorIterable { iterator })
}
}

#[napi(iterator)]
pub struct RRuleSetIteratorIterable {
iterator: SharedReference<RRuleSetIterator, rrule_set::RRuleSetIteratorIterable<'static>>,
}

#[napi]
impl Generator for RRuleSetIteratorIterable {
type Yield = i64;
type Next = ();
type Return = ();

fn next(&mut self, _next: Option<Self::Next>) -> Option<Self::Yield> {
pub fn next(&mut self) -> Option<i64> {
self.iterator.next().map(|date: DateTime| (&date).into())
}
}
4 changes: 3 additions & 1 deletion lib/rrule/dtstart.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,9 @@ impl DtStart {

let tzid = match property.parameters().get("TZID") {
Some(value) => {
let tz: chrono_tz::Tz = value.parse()?;
let tz: chrono_tz::Tz = value
.parse()
.map_err(|_| format!("Invalid timezone: {}", value))?;

Some(tz)
}
Expand Down
4 changes: 3 additions & 1 deletion lib/rrule/exdate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,9 @@ impl ExDate {

let tzid = match property.parameters().get("TZID") {
Some(value) => {
let tz: chrono_tz::Tz = value.parse()?;
let tz: chrono_tz::Tz = value
.parse()
.map_err(|_| format!("Invalid timezone: {}", value))?;

Some(tz)
}
Expand Down
4 changes: 3 additions & 1 deletion lib/rrule/rdate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,9 @@ impl RDate {

let tzid = match property.parameters().get("TZID") {
Some(value) => {
let tz: chrono_tz::Tz = value.parse()?;
let tz: chrono_tz::Tz = value
.parse()
.map_err(|_| format!("Invalid timezone: {}", value))?;

Some(tz)
}
Expand Down
33 changes: 6 additions & 27 deletions lib/rrule/rrule_set.rs
Original file line number Diff line number Diff line change
Expand Up @@ -127,8 +127,10 @@ impl RRuleSet {
properties
}

pub fn iterator(&self) -> RRuleSetIterator {
RRuleSetIterator::new(&self)
pub fn iterator(&self) -> Result<RRuleSetIterator, String> {
Ok(RRuleSetIterator {
iter: self.to_rrule_set()?.into_iter(),
})
}

pub fn from_str(str: &str) -> Result<Self, String> {
Expand Down Expand Up @@ -227,33 +229,10 @@ impl ToRRuleSet for RRuleSet {
}

pub struct RRuleSetIterator {
rrule_set: rrule::RRuleSet,
}

impl RRuleSetIterator {
fn new(rrule_set: &RRuleSet) -> Self {
let rrule_set = rrule_set.to_rrule_set().unwrap();

Self { rrule_set }
}
}

impl<'a> IntoIterator for &'a RRuleSetIterator {
type Item = DateTime;
type IntoIter = RRuleSetIteratorIterable<'a>;

fn into_iter(self) -> Self::IntoIter {
RRuleSetIteratorIterable {
iter: self.rrule_set.into_iter(),
}
}
}

pub struct RRuleSetIteratorIterable<'a> {
iter: rrule::RRuleSetIter<'a>,
iter: rrule::RRuleSetIter,
}

impl<'a> Iterator for RRuleSetIteratorIterable<'a> {
impl<'a> Iterator for RRuleSetIterator {
type Item = DateTime;

fn next(&mut self) -> Option<Self::Item> {
Expand Down
Loading

0 comments on commit 50200fa

Please sign in to comment.