1mod common;23use jrsonnet_evaluator::{4 ContextBuilder, ContextInitializer, FileImportResolver, Result, State, Thunk, Val,5 function::{CallLocation, FuncVal, builtin, builtin::Builtin},6 parser::Source,7 trace::PathResolver,8 typed::FromUntyped,9};10use jrsonnet_gcmodule::Trace;11use jrsonnet_stdlib::ContextInitializer as StdContextInitializer;1213#[builtin]14fn a() -> u32 {15 116}1718#[test]19fn basic_function() -> Result<()> {20 let a: a = a {};21 let v = u32::from_untyped(a.call(CallLocation::native(), &[])?)?;2223 ensure_eq!(v, 1);24 Ok(())25}2627#[builtin]28fn native_add(a: u32, b: u32) -> u32 {29 a + b30}31#[derive(Trace)]32struct NativeAddContextInitializer;33impl ContextInitializer for NativeAddContextInitializer {34 fn populate(&self, _for_file: Source, builder: &mut ContextBuilder) {35 builder.bind("nativeAdd", Thunk::evaluated(Val::function(native_add {})));36 }3738 fn as_any(&self) -> &dyn std::any::Any {39 self40 }41}4243#[test]44fn call_from_code() -> Result<()> {45 let mut s = State::builder();46 s.context_initializer((47 StdContextInitializer::new(PathResolver::new_cwd_fallback()),48 NativeAddContextInitializer,49 ))50 .import_resolver(FileImportResolver::default());51 let s = s.build();5253 let v = s.evaluate_snippet(54 "snip".to_owned(),55 "56 assert nativeAdd(1, 2) == 3;57 assert nativeAdd(100, 200) == 300;58 null59 ",60 )?;61 ensure_val_eq!(v, Val::Null);62 Ok(())63}6465#[builtin(fields(66 a: u3267))]68fn curried_add(this: &curried_add, b: u32) -> u32 {69 this.a + b70}7172#[builtin]73fn curry_add(a: u32) -> FuncVal {74 FuncVal::builtin(curried_add { a })75}76#[derive(Trace)]77struct CurryAddContextInitializer;78impl ContextInitializer for CurryAddContextInitializer {79 fn populate(&self, _for_file: Source, builder: &mut ContextBuilder) {80 builder.bind("curryAdd", Thunk::evaluated(Val::function(curry_add {})));81 }8283 fn as_any(&self) -> &dyn std::any::Any {84 self85 }86}8788#[test]89fn nonstatic_builtin() -> Result<()> {90 let mut s = State::builder();91 s.context_initializer((92 StdContextInitializer::new(PathResolver::new_cwd_fallback()),93 CurryAddContextInitializer,94 ))95 .import_resolver(FileImportResolver::default());96 let s = s.build();9798 let v = s.evaluate_snippet(99 "snip".to_owned(),100 "101 local a = curryAdd(1);102 local b = curryAdd(4);103104 assert a(2) == 3;105 assert a(200) == 201;106107 assert b(2) == 6;108 assert b(200) == 204;109 null110 ",111 )?;112 ensure_val_eq!(v, Val::Null);113 Ok(())114}