Skip to content

Commit

Permalink
Update bindings to include newer APIs
Browse files Browse the repository at this point in the history
- Java
- Python
- WASM

`arc` feature is turned on for all bindings
Use pretty string instead of colored string.

Signed-off-by: Anand Krishnamoorthi <[email protected]>
  • Loading branch information
anakrish committed May 25, 2024
1 parent 33fe9d5 commit 084b2fe
Show file tree
Hide file tree
Showing 20 changed files with 655 additions and 138 deletions.
1 change: 1 addition & 0 deletions .github/workflows/test-wasm.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,5 @@ jobs:
run: |
cd bindings/wasm
wasm-pack build --target nodejs --release
wasm-pack test --release --node
node test.js
5 changes: 4 additions & 1 deletion bindings/java/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,11 @@ keywords = ["interpreter", "opa", "policy-as-code", "rego"]
[lib]
crate-type = ["cdylib"]

[features]
default = ["regorus/std", "regorus/full-opa"]

[dependencies]
anyhow = "1.0"
serde_json = "1.0.112"
jni = "0.21.1"
regorus = { path = "../.." }
regorus = { path = "../..", default-features = false, features = ["arc"] }
22 changes: 19 additions & 3 deletions bindings/java/Test.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,31 @@
public class Test {
public static void main(String[] args) {
try (Engine engine = new Engine()) {
engine.addPolicy(
var pkg = engine.addPolicy(
"hello.rego",
"package test\nmessage = concat(\", \", [input.message, data.message])"
"package test\nx=1\nmessage = concat(\", \", [input.message, data.message])"
);
System.out.println("Loaded package " + pkg);


engine.addDataJson("{\"message\":\"World!\"}");
engine.setInputJson("{\"message\":\"Hello\"}");
String resJson = engine.evalQuery("data.test.message");

// Evaluate query.
String resJson = engine.evalQuery("data.test.message");
System.out.println(resJson);

// Enable coverage.
engine.setEnableCoverage(true);

// Evaluate rule.
String valueJson = engine.evalRule("data.test.message");
System.out.println(valueJson);

var coverage = engine.getCoverageReport();
System.out.println(coverage);

System.out.println(engine.getCoverageReportPretty());
}
}
}
72 changes: 68 additions & 4 deletions bindings/java/com_microsoft_regorus_Engine.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

175 changes: 167 additions & 8 deletions bindings/java/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,37 @@ pub extern "system" fn Java_com_microsoft_regorus_Engine_nativeNewEngine(
Box::into_raw(Box::new(engine)) as jlong
}

#[no_mangle]
pub extern "system" fn Java_com_microsoft_regorus_Engine_nativeClone(
_env: JNIEnv,
_class: JClass,
engine_ptr: jlong,
) -> jlong {
let engine = unsafe { &mut *(engine_ptr as *mut Engine) };
let c = engine.clone();
Box::into_raw(Box::new(c)) as jlong
}

#[no_mangle]
pub extern "system" fn Java_com_microsoft_regorus_Engine_nativeAddPolicy(
env: JNIEnv,
_class: JClass,
engine_ptr: jlong,
path: JString,
rego: JString,
) {
let _ = throw_err(env, |env| {
) -> jstring {
let res = throw_err(env, |env| {
let engine = unsafe { &mut *(engine_ptr as *mut Engine) };
let path: String = env.get_string(&path)?.into();
let rego: String = env.get_string(&rego)?.into();
engine.add_policy(path, rego)?;
Ok(())
let pkg = env.new_string(engine.add_policy(path, rego)?)?;
Ok(pkg.into_raw())
});

match res {
Ok(val) => val,
Err(_) => JObject::null().into_raw(),
}
}

#[no_mangle]
Expand All @@ -40,13 +56,37 @@ pub extern "system" fn Java_com_microsoft_regorus_Engine_nativeAddPolicyFromFile
_class: JClass,
engine_ptr: jlong,
path: JString,
) {
let _ = throw_err(env, |env| {
) -> jstring {
let res = throw_err(env, |env| {
let engine = unsafe { &mut *(engine_ptr as *mut Engine) };
let path: String = env.get_string(&path)?.into();
engine.add_policy_from_file(path)?;
Ok(())
let pkg = env.new_string(engine.add_policy_from_file(path)?)?;
Ok(pkg.into_raw())
});

match res {
Ok(val) => val,
Err(_) => JObject::null().into_raw(),
}
}

#[no_mangle]
pub extern "system" fn Java_com_microsoft_regorus_Engine_nativeGetPackages(
env: JNIEnv,
_class: JClass,
engine_ptr: jlong,
) -> jstring {
let res = throw_err(env, |env| {
let engine = unsafe { &mut *(engine_ptr as *mut Engine) };
let packages = engine.get_packages()?;
let packages_json = env.new_string(serde_json::to_string_pretty(&packages)?)?;
Ok(packages_json.into_raw())
});

match res {
Ok(val) => val,
Err(_) => JObject::null().into_raw(),
}
}

#[no_mangle]
Expand Down Expand Up @@ -143,6 +183,125 @@ pub extern "system" fn Java_com_microsoft_regorus_Engine_nativeEvalQuery(
}
}

#[no_mangle]
pub extern "system" fn Java_com_microsoft_regorus_Engine_nativeEvalRule(
env: JNIEnv,
_class: JClass,
engine_ptr: jlong,
rule: JString,
) -> jstring {
let res = throw_err(env, |env| {
let engine = unsafe { &mut *(engine_ptr as *mut Engine) };
let rule: String = env.get_string(&rule)?.into();
let value = engine.eval_rule(rule)?;
let output = env.new_string(value.to_json_str()?)?;
Ok(output.into_raw())
});

match res {
Ok(val) => val,
Err(_) => JObject::null().into_raw(),
}
}

#[no_mangle]
pub extern "system" fn Java_com_microsoft_regorus_Engine_nativeSetEnableCoverage(
env: JNIEnv,
_class: JClass,
engine_ptr: jlong,
enable: bool,
) {
let _ = throw_err(env, |_| {
let engine = unsafe { &mut *(engine_ptr as *mut Engine) };
engine.set_enable_coverage(enable);
Ok(())
});
}

#[no_mangle]
pub extern "system" fn Java_com_microsoft_regorus_Engine_nativeGetCoverageReport(
env: JNIEnv,
_class: JClass,
engine_ptr: jlong,
) -> jstring {
let res = throw_err(env, |env| {
let engine = unsafe { &mut *(engine_ptr as *mut Engine) };
let report = engine.get_coverage_report()?;
let output = env.new_string(serde_json::to_string_pretty(&report)?)?;
Ok(output.into_raw())
});

match res {
Ok(val) => val,
Err(_) => JObject::null().into_raw(),
}
}

#[no_mangle]
pub extern "system" fn Java_com_microsoft_regorus_Engine_nativeGetCoverageReportPretty(
env: JNIEnv,
_class: JClass,
engine_ptr: jlong,
) -> jstring {
let res = throw_err(env, |env| {
let engine = unsafe { &mut *(engine_ptr as *mut Engine) };
let report = engine.get_coverage_report()?.to_pretty_string()?;
let output = env.new_string(&report)?;
Ok(output.into_raw())
});

match res {
Ok(val) => val,
Err(_) => JObject::null().into_raw(),
}
}

#[no_mangle]
pub extern "system" fn Java_com_microsoft_regorus_Engine_nativeClearCoverageData(
env: JNIEnv,
_class: JClass,
engine_ptr: jlong,
) {
let _ = throw_err(env, |_| {
let engine = unsafe { &mut *(engine_ptr as *mut Engine) };
engine.clear_coverage_data();
Ok(())
});
}

#[no_mangle]
pub extern "system" fn Java_com_microsoft_regorus_Engine_nativeSetGatherPrints(
env: JNIEnv,
_class: JClass,
engine_ptr: jlong,
b: bool,
) {
let _ = throw_err(env, |_| {
let engine = unsafe { &mut *(engine_ptr as *mut Engine) };
engine.set_gather_prints(b);
Ok(())
});
}

#[no_mangle]
pub extern "system" fn Java_com_microsoft_regorus_Engine_nativeTakePrints(
env: JNIEnv,
_class: JClass,
engine_ptr: jlong,
) -> jstring {
let res = throw_err(env, |env| {
let engine = unsafe { &mut *(engine_ptr as *mut Engine) };
let prints = engine.take_prints()?;
let output = env.new_string(serde_json::to_string_pretty(&prints)?)?;
Ok(output.into_raw())
});

match res {
Ok(val) => val,
Err(_) => JObject::null().into_raw(),
}
}

#[no_mangle]
pub unsafe extern "system" fn Java_com_microsoft_regorus_Engine_nativeDestroyEngine(
_env: JNIEnv,
Expand Down
Loading

0 comments on commit 084b2fe

Please sign in to comment.