1mod common;23use jrsonnet_evaluator::{4 error::Result,5 function::{builtin, builtin::Builtin, CallLocation, FuncVal},6 tb,7 typed::Typed,8 ContextBuilder, State, Thunk, Val,9};10use jrsonnet_gcmodule::Cc;11use jrsonnet_stdlib::StateExt;1213#[builtin]14fn a() -> Result<u32> {15 Ok(1)16}1718#[test]19fn basic_function() -> Result<()> {20 let a: a = a {};21 let v = u32::from_untyped(a.call(22 ContextBuilder::dangerous_empty_state().build(),23 CallLocation::native(),24 &(),25 )?)?;2627 ensure_eq!(v, 1);28 Ok(())29}3031#[builtin]32fn native_add(a: u32, b: u32) -> Result<u32> {33 Ok(a + b)34}3536#[test]37fn call_from_code() -> Result<()> {38 let s = State::default();39 s.with_stdlib();40 s.add_global(41 "nativeAdd".into(),42 Thunk::evaluated(Val::Func(FuncVal::StaticBuiltin(native_add::INST))),43 );4445 let v = s.evaluate_snippet(46 "snip".to_owned(),47 "48 assert nativeAdd(1, 2) == 3;49 assert nativeAdd(100, 200) == 300;50 null51 ",52 )?;53 ensure_val_eq!(v, Val::Null);54 Ok(())55}5657#[builtin(fields(58 a: u3259))]60fn curried_add(this: &curried_add, b: u32) -> Result<u32> {61 Ok(this.a + b)62}6364#[builtin]65fn curry_add(a: u32) -> Result<FuncVal> {66 Ok(FuncVal::Builtin(Cc::new(tb!(curried_add { a }))))67}6869#[test]70fn nonstatic_builtin() -> Result<()> {71 let s = State::default();72 s.with_stdlib();73 s.add_global(74 "curryAdd".into(),75 Thunk::evaluated(Val::Func(FuncVal::StaticBuiltin(curry_add::INST))),76 );7778 let v = s.evaluate_snippet(79 "snip".to_owned(),80 "81 local a = curryAdd(1);82 local b = curryAdd(4);8384 assert a(2) == 3;85 assert a(200) == 201;8687 assert b(2) == 6;88 assert b(200) == 204;89 null90 ",91 )?;92 ensure_val_eq!(v, Val::Null);93 Ok(())94}