Universe

An extended CBOR encoder for the Typst plugin system.

This library provides a CBOR encoder with extended support for Typst types, along with corresponding Rust types and deserialization, enabling seamless data exchange between Typst and Rust WASM plugins.

Usage

Note: The versions used in Typst and Rust MUST match exactly.

Rust:

Add typwire to your Rust project like this:

cargo add typwire
use serde::Deserialize;
use typwire::{Angle, Color, DateTime, FromBytes as _};
use wasm_minimal_protocol::*;

initiate_protocol!();

#[derive(Deserialize)]
struct Custom {
    angle: Angle,
    color: Color,
    datetime: DateTime,
}

#[wasm_func]
fn custom_fn(arg: &[u8]) -> Result<Vec<u8>, String> {
    let custom = Custom::from_bytes(arg)?;

    // ...

    Ok(vec![])
}

Typst:

#import "@preview/typwire:0.1.0"

#let custom-plugin = plugin("custom_plugin.wasm")

#let custom = (
    "angle": 90deg,
    "color": red,
    "datetime": datetime.today(),
)

#let encoded = typwire.cbor.encode(custom)

#custom-plugin.custom_fn(encoded)

Supported types

  • ✅ int
  • ✅ float
  • ✅ bytes
  • ✅ str
  • ✅ bool
  • ✅ content
  • ✅ none
  • ✅ array
  • ✅ dictionary
  • ✅ angle
  • ✅ length
  • ✅ ratio
  • ✅ color
  • ✅ gradient
  • ✅ datetime
  • ✅ duration
  • ✅ version
  • ✅ type
  • ❌ fraction
  • ❌ direction
  • ❌ relative
  • ❌ decimal

Missing features

  • Color conversion in Rust
  • Dynamic Value type that includes all Typst types
  • Decoding from plugin
  • Static Gradient defaults
  • Support for all types