Rhai is a lightweight, high-performance scripting language designed for embedding in Rust applications. MoFA uses Rhai for runtime plugins, workflow orchestration, and dynamic business rules.
// Iterate over arraylet items = ["apple", "banana", "cherry"];for item in items { print(item);}// Iterate over rangefor i in 0..10 { print(i); // 0 to 9}// Inclusive rangefor i in 0..=10 { print(i); // 0 to 10}// Iterate with indexfor (i, item) in items.enumerate() { print(`${i}: ${item}`);}
// Simple functionfn greet(name) { "Hello, " + name + "!"}// Function with multiple parametersfn add(a, b) { a + b}// Function with default behaviorfn multiply(a, b) { if b == () { b = 1; // Default value } a * b}// Recursive functionfn factorial(n) { if n <= 1 { 1 } else { n * factorial(n - 1) }}// Function returning objectfn create_user(name, age) { #{ name: name, age: age, created_at: now() }}
// Throw errorsfn validate_age(age) { if age < 0 { throw "Age cannot be negative"; } if age > 150 { throw "Age is unrealistic"; } age}// Try-catch patternfn safe_divide(a, b) { if b == 0 { return (); } a / b}let result = safe_divide(10, 0);if result == () { print("Division by zero");} else { print(`Result: ${result}`);}
// Calculator toollet a = params.a;let b = params.b;let op = params.operation;let result = if op == "add" { a + b }else if op == "sub" { a - b }else if op == "mul" { a * b }else if op == "div" { if b == 0.0 { throw "Division by zero"; } a / b}else if op == "pow" { let r = 1.0; for i in 0..b.to_int() { r *= a; } r}else { throw "Unknown operation: " + op; };#{ operation: op, a: a, b: b, result: result, expression: `${a} ${op} ${b} = ${result}`}
let text = params.text;let ops = params.operations;for op in ops { if op == "trim" { text = trim(text); } else if op == "upper" { text = upper(text); } else if op == "lower" { text = lower(text); } else if op == "reverse" { let chars = text.chars(); let reversed = ""; for i in range(0, chars.len()) { reversed = chars[chars.len() - 1 - i] + reversed; } text = reversed; }}#{ original: params.text, processed: text, operations: ops}
// Pipeline functionsfn filter_active(items) { let result = []; for item in items { if item.active { result.push(item); } } result}fn enrich_items(items) { let result = []; for item in items { item.enriched_at = now(); item.score = calculate_score(item); result.push(item); } result}fn sort_by_score(items) { // Simple bubble sort let arr = items; let len = arr.len(); for i in 0..len { for j in 0..(len - i - 1) { if arr[j].score < arr[j + 1].score { let temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } arr}// Execute pipelinefn execute(input) { let data = parse_json(input); let filtered = filter_active(data.items); let enriched = enrich_items(filtered); let sorted = sort_by_score(enriched); to_json(#{ items: sorted, count: sorted.len(), processed_at: now() })}
fn process_order(order) { // Validate first if order.items.len() == 0 { throw "Order must have items"; } if order.total <= 0 { throw "Invalid order total"; } // Then process // ...}