mirror of
https://github.com/microsoft/regorus.git
synced 2026-08-05 02:16:11 +00:00
* FFI bindings Generate C FFI as well as C# FFI Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com> * Regorus C binding Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com> * C# binding Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com> * Golang binding Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com> --------- Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
170 lines
3.4 KiB
C#
170 lines
3.4 KiB
C#
using System.Text;
|
|
|
|
namespace Regorus
|
|
{
|
|
public class Exception : System.Exception
|
|
{
|
|
public Exception(string? message) : base(message) {}
|
|
}
|
|
|
|
public class Engine : ICloneable
|
|
{
|
|
unsafe private RegorusFFI.RegorusEngine* E;
|
|
public Engine()
|
|
{
|
|
unsafe
|
|
{
|
|
E = RegorusFFI.API.regorus_engine_new();
|
|
}
|
|
}
|
|
|
|
public object Clone()
|
|
{
|
|
var clone = (Engine)this.MemberwiseClone();
|
|
unsafe
|
|
{
|
|
clone.E = RegorusFFI.API.regorus_engine_clone(E);
|
|
}
|
|
return clone;
|
|
|
|
}
|
|
|
|
public void AddPolicy(string path, string rego)
|
|
{
|
|
var pathBytes = Encoding.UTF8.GetBytes(path);
|
|
var regoBytes = Encoding.UTF8.GetBytes(rego);
|
|
|
|
unsafe
|
|
{
|
|
fixed (byte* pathPtr = pathBytes)
|
|
{
|
|
fixed(byte* regoPtr = regoBytes)
|
|
{
|
|
CheckAndDropResult(RegorusFFI.API.regorus_engine_add_policy(E, pathPtr, regoPtr));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void AddPolicyFromFile(string path)
|
|
{
|
|
var pathBytes = Encoding.UTF8.GetBytes(path);
|
|
|
|
unsafe
|
|
{
|
|
fixed (byte* pathPtr = pathBytes)
|
|
{
|
|
CheckAndDropResult(RegorusFFI.API.regorus_engine_add_policy_from_file(E, pathPtr));
|
|
}
|
|
}
|
|
}
|
|
|
|
public void AddDataJson(string data)
|
|
{
|
|
var dataBytes = Encoding.UTF8.GetBytes(data);
|
|
|
|
unsafe
|
|
{
|
|
fixed (byte* dataPtr = dataBytes)
|
|
{
|
|
CheckAndDropResult(RegorusFFI.API.regorus_engine_add_data_json(E, dataPtr));
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
public void AddDataFromJsonFile(string path)
|
|
{
|
|
var pathBytes = Encoding.UTF8.GetBytes(path);
|
|
|
|
unsafe
|
|
{
|
|
fixed (byte* pathPtr = pathBytes)
|
|
{
|
|
CheckAndDropResult(RegorusFFI.API.regorus_engine_add_data_from_json_file(E, pathPtr));
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
public void SetInputJson(string input)
|
|
{
|
|
var inputBytes = Encoding.UTF8.GetBytes(input);
|
|
|
|
unsafe
|
|
{
|
|
fixed (byte* inputPtr = inputBytes)
|
|
{
|
|
CheckAndDropResult(RegorusFFI.API.regorus_engine_set_input_json(E, inputPtr));
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
public void SetInputFromJsonFile(string path)
|
|
{
|
|
var pathBytes = Encoding.UTF8.GetBytes(path);
|
|
|
|
unsafe
|
|
{
|
|
fixed (byte* pathPtr = pathBytes)
|
|
{
|
|
CheckAndDropResult(RegorusFFI.API.regorus_engine_set_input_from_json_file(E, pathPtr));
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
public string EvalQuery(string query)
|
|
{
|
|
var queryBytes = Encoding.UTF8.GetBytes(query);
|
|
|
|
var resultJson = "";
|
|
unsafe
|
|
{
|
|
fixed (byte* queryPtr = queryBytes)
|
|
{
|
|
var result = RegorusFFI.API.regorus_engine_eval_query(E, queryPtr);
|
|
if (result.status == RegorusFFI.RegorusStatus.RegorusStatusOk) {
|
|
if (result.output is not null) {
|
|
resultJson = System.Runtime.InteropServices.Marshal.PtrToStringUTF8((IntPtr)result.output);
|
|
}
|
|
RegorusFFI.API.regorus_result_drop(result);
|
|
} else {
|
|
CheckAndDropResult(result);
|
|
}
|
|
|
|
}
|
|
}
|
|
if (resultJson is not null) {
|
|
return resultJson;
|
|
} else {
|
|
return "";
|
|
}
|
|
}
|
|
|
|
~Engine()
|
|
{
|
|
unsafe
|
|
{
|
|
RegorusFFI.API.regorus_engine_drop(E);
|
|
}
|
|
}
|
|
|
|
|
|
void CheckAndDropResult(RegorusFFI.RegorusResult result)
|
|
{
|
|
if (result.status != RegorusFFI.RegorusStatus.RegorusStatusOk) {
|
|
unsafe {
|
|
var message = System.Runtime.InteropServices.Marshal.PtrToStringUTF8((IntPtr)result.error_message);
|
|
var ex = new Exception(message);
|
|
RegorusFFI.API.regorus_result_drop(result);
|
|
throw ex;
|
|
}
|
|
}
|
|
RegorusFFI.API.regorus_result_drop(result);
|
|
}
|
|
|
|
}
|
|
}
|