viewpoint-js
Compile-time validated JavaScript macro for Viewpoint.
This crate provides a js! macro that validates JavaScript syntax at compile time,
similar to how serde_json::json! validates JSON. This catches JavaScript syntax
errors early, before they reach the browser.
Features
- Compile-time validation: JavaScript syntax errors are caught during compilation
- Value interpolation: Embed Rust expressions using
#{expr}syntax (quoted/escaped) - Raw interpolation: Inject pre-built JavaScript using
@{expr}syntax (unquoted) - Zero runtime overhead: Static strings when no interpolation is used
- Clear error messages: Points to the exact location of syntax errors
Usage
Add to your Cargo.toml:
[]
= "0.2"
= "0.2" # Required for interpolation
Simple Expressions
use js;
// Returns &'static str
let code = js!;
let code = js!;
let code = js!;
Value Interpolation
Use #{expr} to embed Rust values into JavaScript (properly quoted and escaped):
use js;
use ToJsValue;
let selector = ".my-class";
let code = js!;
// Produces: "document.querySelector(\".my-class\")"
let count = 42;
let code = js!;
// Produces: "Array(42).fill(0)"
Raw Interpolation
Use @{expr} to inject pre-built JavaScript expressions directly (without quoting):
use js;
// Inject a JavaScript expression as-is
let selector_expr = "document.querySelectorAll('.item')";
let code = js!;
// Produces: "Array.from(document.querySelectorAll('.item'))"
// Useful for building complex JS with dynamic parts
let frame_access = get_frame_access_code;
let code = js!;
Mixing Both Interpolation Types
You can use both #{} and @{} in the same macro call:
use js;
let selector_expr = "document.body";
let attr_name = "data-id";
let code = js!;
// Produces: "document.body.setAttribute(\"data-id\", \"value\")"
Compile-Time Errors
Invalid JavaScript produces compile-time errors:
use js;
// This won't compile!
let code = js!
Supported Types for Interpolation
The following types implement ToJsValue:
- Integers:
i8,i16,i32,i64,i128,isize,u8,u16,u32,u64,u128,usize - Floats:
f32,f64(handlesNaN,Infinity,-Infinity) - Boolean:
bool - Strings:
String,&str(properly escaped) - Option:
Option<T>whereT: ToJsValue(produces value ornull) - JSON:
serde_json::Value(withjsonfeature)
Features
json- Enableserde_json::Valuesupport for interpolation
License
MIT