diff --git a/Cargo.toml b/Cargo.toml index d7a69c6..fb4a1c0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ rust-version = "1.64.0" [workspace] members = [ "rrule", - "rrule-debugger", + "rrule-debugger" ] # These are the 2 packages to mainly work on. diff --git a/rrule/Cargo.toml b/rrule/Cargo.toml index 0dc56dc..a5fb982 100644 --- a/rrule/Cargo.toml +++ b/rrule/Cargo.toml @@ -21,10 +21,12 @@ regex = { version = "1.5.5", default-features = false, features = ["perf", "std" clap = { version = "4.1.9", optional = true, features = ["derive"] } thiserror = "1.0.30" serde_with = { version = "2.3.1", optional = true } +wasm-bindgen = { version="0.2.85", optional = true } [dev-dependencies] serde_json = "1.0.80" orig_serde = { package = "serde", version = "1.0.137", default-features = false } +wasm-bindgen-test = "0.3.13" [[bin]] name = "rrule" @@ -43,4 +45,10 @@ cli-tool = ["clap"] serde = ["serde_with", "chrono/serde", "chrono-tz/serde"] # Allows EXRULE's to be used in the `RRuleSet`. -exrule = [] \ No newline at end of file +exrule = [] + +# Allows to use WASM +wasm = ["dep:wasm-bindgen"] + +[lib] +crate-type = ["cdylib", "rlib"] diff --git a/rrule/Makefile b/rrule/Makefile new file mode 100644 index 0000000..8781a7d --- /dev/null +++ b/rrule/Makefile @@ -0,0 +1,14 @@ +install-wasm-pack: + curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh + +build-wasm-nodejs: + wasm-pack build --target nodejs --features "wasm" + +test-wasm-on-nodejs: + node examples/wasm/nodejs/app.js + +build-wasm-web: + wasm-pack build --target web --features "wasm" + +test-wasm-on-web-browser: + npx http-server -o /examples/wasm/web/index.html \ No newline at end of file diff --git a/rrule/examples/wasm/nodejs/app.js b/rrule/examples/wasm/nodejs/app.js new file mode 100644 index 0000000..3f05ffd --- /dev/null +++ b/rrule/examples/wasm/nodejs/app.js @@ -0,0 +1,21 @@ +const { get_all_date_recurrences } = require('../../../pkg/rrule.js'); + +const http = require('http'); +const url = require('url'); +const hostname = '127.0.0.1'; +const port = 3000; + +const server = http.createServer((req, res) => { + const queryObject = url.parse(req.url,true).query; + res.statusCode = 200; + res.setHeader('Content-Type', 'text/plain'); + + const rule_set = "DTSTART:20120201T093000Z\nRRULE:FREQ=DAILY;COUNT=3"; + const data = get_all_date_recurrences(rule_set, 100); + console.log(data); + res.end(data.toString()); +}); + +server.listen(port, hostname, () => { + console.log(`Server running at http://${hostname}:${port}/`); +}); \ No newline at end of file diff --git a/rrule/examples/wasm/web/index.html b/rrule/examples/wasm/web/index.html new file mode 100644 index 0000000..ea857bf --- /dev/null +++ b/rrule/examples/wasm/web/index.html @@ -0,0 +1,23 @@ + + +
+ + + + + + + + + \ No newline at end of file diff --git a/rrule/src/lib.rs b/rrule/src/lib.rs index 1fbdc91..057b17b 100644 --- a/rrule/src/lib.rs +++ b/rrule/src/lib.rs @@ -99,6 +99,8 @@ mod iter; mod parser; mod tests; mod validator; +#[cfg(feature = "wasm")] +mod wasm; pub use crate::core::{Frequency, NWeekday, RRule, RRuleResult, RRuleSet, Tz}; pub use crate::core::{Unvalidated, Validated}; diff --git a/rrule/src/wasm/mod.rs b/rrule/src/wasm/mod.rs new file mode 100644 index 0000000..385c358 --- /dev/null +++ b/rrule/src/wasm/mod.rs @@ -0,0 +1,29 @@ +use wasm_bindgen::prelude::*; + +use crate::{RRuleSet, RRuleError}; + +/// Get all recurrences of the rrule +/// +/// # Arguments +/// +/// * `rule_set` - List of rrules +/// +/// * `limit` - Limit must be set in order to prevent infinite loops +#[wasm_bindgen] +pub fn get_all_date_recurrences(rule_set: &str, limit: Option