PorygonSharp/PorygonSharp/EvaluateResult.cs

54 lines
1.5 KiB
C#

using System;
using System.Runtime.InteropServices;
using System.Text;
using PorygonSharp.EvalValues;
namespace PorygonSharp
{
internal struct EvaluateResult : IDisposable
{
[StructLayout(LayoutKind.Sequential)]
private struct EvaluateResultInternal
{
public readonly IntPtr Value;
public readonly byte Result;
public readonly IntPtr ErrorMessage;
public readonly long ErrorSize;
}
private readonly IntPtr _ptr;
private readonly EvaluateResultInternal _internal;
public EvaluateResult(IntPtr ptr)
{
_ptr = ptr;
_internal = Marshal.PtrToStructure<EvaluateResultInternal>(ptr);
}
public EvalValue GetValue()
{
return new EvalValue(_internal.Value);
}
public bool IsSuccess()
{
return _internal.Result == 0;
}
public string GetError()
{
var nameArr = new byte[_internal.ErrorSize];
for (var i = 0; i < _internal.ErrorSize; i++)
nameArr[i] = Marshal.ReadByte(_internal.ErrorMessage, i);
return $"Error length: {_internal.ErrorSize}" + Encoding.UTF8.GetString(nameArr);
}
public void Dispose()
{
Marshal.FreeHGlobal(_ptr);
}
[DllImport("PorygonLang", EntryPoint = "GetResultError", CallingConvention = CallingConvention.Cdecl)]
private static extern string GetErrorMessage(IntPtr ptr);
}
}