From 296bea5fcbdf94d6ebf2d392ec2bba0903c4d3f5 Mon Sep 17 00:00:00 2001 From: Quinn Dougherty Date: Mon, 15 Aug 2022 16:49:55 -0700 Subject: [PATCH] init wasm stuff --- packages/squiggle-lang/src/rust/.gitignore | 6 ++ packages/squiggle-lang/src/rust/Cargo.toml | 40 ++++++++++++ packages/squiggle-lang/src/rust/README.md | 69 ++++++++++++++++++++ packages/squiggle-lang/src/rust/src/lib.rs | 23 +++++++ packages/squiggle-lang/src/rust/src/utils.rs | 10 +++ packages/squiggle-lang/src/rust/tests/web.rs | 13 ++++ packages/squiggle-lang/src/shell.nix | 15 +++++ 7 files changed, 176 insertions(+) create mode 100644 packages/squiggle-lang/src/rust/.gitignore create mode 100644 packages/squiggle-lang/src/rust/Cargo.toml create mode 100644 packages/squiggle-lang/src/rust/README.md create mode 100644 packages/squiggle-lang/src/rust/src/lib.rs create mode 100644 packages/squiggle-lang/src/rust/src/utils.rs create mode 100644 packages/squiggle-lang/src/rust/tests/web.rs create mode 100644 packages/squiggle-lang/src/shell.nix diff --git a/packages/squiggle-lang/src/rust/.gitignore b/packages/squiggle-lang/src/rust/.gitignore new file mode 100644 index 00000000..4e301317 --- /dev/null +++ b/packages/squiggle-lang/src/rust/.gitignore @@ -0,0 +1,6 @@ +/target +**/*.rs.bk +Cargo.lock +bin/ +pkg/ +wasm-pack.log diff --git a/packages/squiggle-lang/src/rust/Cargo.toml b/packages/squiggle-lang/src/rust/Cargo.toml new file mode 100644 index 00000000..b6eef03b --- /dev/null +++ b/packages/squiggle-lang/src/rust/Cargo.toml @@ -0,0 +1,40 @@ +[package] +name = "rust" +version = "0.1.0" +authors = ["Quinn Dougherty "] +edition = "2018" +[package.metadata.wasm-pack.profile] +dev.wasm-opt = false +profiling.wasm-opt = false +release.wasm-opt = false + +[lib] +crate-type = ["cdylib", "rlib"] + +[features] +default = ["console_error_panic_hook"] + +[dependencies] +getrandom = { version = "0.2", features = ["js"] } +rand_distr = "0.4.3" +wasm-bindgen = "0.2.63" + +# The `console_error_panic_hook` crate provides better debugging of panics by +# logging them with `console.error`. This is great for development, but requires +# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for +# code size when deploying. +console_error_panic_hook = { version = "0.1.6", optional = true } + +# `wee_alloc` is a tiny allocator for wasm that is only ~1K in code size +# compared to the default allocator's ~10K. It is slower than the default +# allocator, however. +# +# Unfortunately, `wee_alloc` requires nightly Rust when targeting wasm for now. +wee_alloc = { version = "0.4.5", optional = true } + +[dev-dependencies] +wasm-bindgen-test = "0.3.13" + +[profile.release] +# Tell `rustc` to optimize for small code size. +opt-level = "s" diff --git a/packages/squiggle-lang/src/rust/README.md b/packages/squiggle-lang/src/rust/README.md new file mode 100644 index 00000000..1e4617a6 --- /dev/null +++ b/packages/squiggle-lang/src/rust/README.md @@ -0,0 +1,69 @@ +
+ +

wasm-pack-template

+ + A template for kick starting a Rust and WebAssembly project using wasm-pack. + +

+ Build Status +

+ +

+ Tutorial + | + Chat +

+ + Built with 🦀🕸 by The Rust and WebAssembly Working Group +
+ +## About + +[**📚 Read this template tutorial! 📚**][template-docs] + +This template is designed for compiling Rust libraries into WebAssembly and +publishing the resulting package to NPM. + +Be sure to check out [other `wasm-pack` tutorials online][tutorials] for other +templates and usages of `wasm-pack`. + +[tutorials]: https://rustwasm.github.io/docs/wasm-pack/tutorials/index.html +[template-docs]: https://rustwasm.github.io/docs/wasm-pack/tutorials/npm-browser-packages/index.html + +## 🚴 Usage + +### 🐑 Use `cargo generate` to Clone this Template + +[Learn more about `cargo generate` here.](https://github.com/ashleygwilliams/cargo-generate) + +``` +cargo generate --git https://github.com/rustwasm/wasm-pack-template.git --name my-project +cd my-project +``` + +### 🛠️ Build with `wasm-pack build` + +``` +wasm-pack build +``` + +### 🔬 Test in Headless Browsers with `wasm-pack test` + +``` +wasm-pack test --headless --firefox +``` + +### 🎁 Publish to NPM with `wasm-pack publish` + +``` +wasm-pack publish +``` + +## 🔋 Batteries Included + +* [`wasm-bindgen`](https://github.com/rustwasm/wasm-bindgen) for communicating + between WebAssembly and JavaScript. +* [`console_error_panic_hook`](https://github.com/rustwasm/console_error_panic_hook) + for logging panic messages to the developer console. +* [`wee_alloc`](https://github.com/rustwasm/wee_alloc), an allocator optimized + for small code size. diff --git a/packages/squiggle-lang/src/rust/src/lib.rs b/packages/squiggle-lang/src/rust/src/lib.rs new file mode 100644 index 00000000..68383b95 --- /dev/null +++ b/packages/squiggle-lang/src/rust/src/lib.rs @@ -0,0 +1,23 @@ +mod utils; + +use wasm_bindgen::prelude::*; + +// When the `wee_alloc` feature is enabled, use `wee_alloc` as the global +// allocator. +#[cfg(feature = "wee_alloc")] +#[global_allocator] +static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; + +#[wasm_bindgen] +extern { + fn alert(s: &str); +} + + +// implement monte carlo in rust +// + +#[wasm_bindgen] +pub fn greet() { + alert("Hello, rust!"); +} diff --git a/packages/squiggle-lang/src/rust/src/utils.rs b/packages/squiggle-lang/src/rust/src/utils.rs new file mode 100644 index 00000000..b1d7929d --- /dev/null +++ b/packages/squiggle-lang/src/rust/src/utils.rs @@ -0,0 +1,10 @@ +pub fn set_panic_hook() { + // When the `console_error_panic_hook` feature is enabled, we can call the + // `set_panic_hook` function at least once during initialization, and then + // we will get better error messages if our code ever panics. + // + // For more details see + // https://github.com/rustwasm/console_error_panic_hook#readme + #[cfg(feature = "console_error_panic_hook")] + console_error_panic_hook::set_once(); +} diff --git a/packages/squiggle-lang/src/rust/tests/web.rs b/packages/squiggle-lang/src/rust/tests/web.rs new file mode 100644 index 00000000..de5c1daf --- /dev/null +++ b/packages/squiggle-lang/src/rust/tests/web.rs @@ -0,0 +1,13 @@ +//! Test suite for the Web and headless browsers. + +#![cfg(target_arch = "wasm32")] + +extern crate wasm_bindgen_test; +use wasm_bindgen_test::*; + +wasm_bindgen_test_configure!(run_in_browser); + +#[wasm_bindgen_test] +fn pass() { + assert_eq!(1 + 1, 2); +} diff --git a/packages/squiggle-lang/src/shell.nix b/packages/squiggle-lang/src/shell.nix new file mode 100644 index 00000000..8a283bc7 --- /dev/null +++ b/packages/squiggle-lang/src/shell.nix @@ -0,0 +1,15 @@ +{ pkgs ? import {} }: + +with pkgs; + +mkShell { + buildInputs = [ + wasm-pack + cargo-generate + nodePackages.npm + rustup + cargo + pkg-config + openssl + ]; +}