regorus 0.1.3

A fast, lightweight Rego (OPA policy language) interpreter
Documentation
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);		    
	}

    }
}