// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. //! This example shows you how to define ops in Rust and then call them from //! JavaScript. use deno_core::*; /// An op for summing an array of numbers. The op-layer automatically /// deserializes inputs and serializes the returned Result & value. #[op2] fn op_sum(#[serde] nums: Vec) -> Result { // Sum inputs let sum = nums.iter().fold(0.0, |a, v| a + v); // return as a Result Ok(sum) } fn main() { // Build a deno_core::Extension providing custom ops let ext = Extension { name: "my_ext", ops: std::borrow::Cow::Borrowed(&[op_sum::DECL]), ..Default::default() }; // Initialize a runtime instance let mut runtime = JsRuntime::new(RuntimeOptions { extensions: vec![ext], ..Default::default() }); // Now we see how to invoke the op we just defined. The runtime automatically // contains a Deno.core object with several functions for interacting with it. // You can find its definition in core.js. runtime .execute_script( "", r#" // Print helper function, calling Deno.core.print() function print(value) { Deno.core.print(value.toString()+"\n"); } const arr = [1, 2, 3]; print("The sum of"); print(arr); print("is"); print(Deno.core.ops.op_sum(arr)); // And incorrect usage try { print(Deno.core.ops.op_sum(0)); } catch(e) { print('Exception:'); print(e); } "#, ) .unwrap(); }