Skip to content

Repository files navigation

RustyJS

Write JavaScript with Rust's mental model.

What's inside

  • Impl — Rust-style traits. Struct (data) is separated from Impl (behavior), and implementations are stamped onto classes at load time. No prototype chain crawling.
  • Result / Optionstd::result::Result and std::option::Option in JavaScript. Use the core only, or opt into extensions one by one.

Install

pnpm add @alex6357/rustyjs

Entry points

// The root entry has everything: impl, result, option, and all builtin
// extensions. Use it if you want all of rustyjs.
import { err, initImpl, none, ok, some } from "@alex6357/rustyjs";

// If you only need one part, import it on demand.
import { initImpl } from "@alex6357/rustyjs/impl";
import { ok } from "@alex6357/rustyjs/result";
import { some } from "@alex6357/rustyjs/option";

Quick look

Traits:

import { initImpl } from "@alex6357/rustyjs/impl";

const { STATE, ImplFor } = initImpl();

// Trait
interface TraitHasName {
  readonly name: string;
}

// Class is still the entry point.
// The interface mixin lets the language server know what methods are available.
interface Dog extends TraitHasName {}
class Dog {
  constructor(name: string) {
    STATE.init(this, { name });
  }
}

// Implementation block, i.e. `impl TraitHasName for Dog`
@ImplFor(Dog)
class ImplHasNameForDog implements TraitHasName {
  get name() {
    return STATE.get(this).name;
  }
}

new Dog("Buddy").name; // "Buddy"

Result and Option:

import { err, ok, wrap } from "@alex6357/rustyjs/result";
import { none, some } from "@alex6357/rustyjs/option";

ok(21)
  .map((x) => x * 2)
  .unwrap(); // 42
err("boom").unwrapOr(0); // 0
wrap(() => JSON.parse("nope")).isErr(); // true
some(21)
  .map((x) => x * 2)
  .unwrap(); // 42

Documentation

Build and test

# Build
pnpm build
# Test
pnpm test

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.

About

Introduce Rust traits to JavaScript

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages