alef 0.84.0

Opinionated polyglot binding generator for Rust libraries
Documentation
// This file is auto-generated by alef. DO NOT EDIT.
#nullable enable

using System;

namespace {{ namespace }};

public class {{ class_name }} : Exception
{
    public int Code { get; }

    public {{ class_name }}(int code, string message) : base(message)
    {
        Code = code;
    }

    public {{ class_name }}(string message) : base(message)
    {
        Code = 0;
    }

    public {{ class_name }}(string message, Exception innerException) : base(message, innerException)
    {
        Code = 0;
    }

    /// <summary>
    /// Builds the concrete exception for the FFI's current thread-local last-error state,
    /// dispatching to the specific per-variant exception class when the message's prefix
    /// identifies a known variant. Every throw site across the generated binding funnels
    /// through here so a variant's identity is never lost to a bypassed dispatch.
    /// </summary>
    internal static Exception FromLastError(string fallbackMessage)
    {
        var code = NativeMethods.LastErrorCode();
        var ctxPtr = NativeMethods.LastErrorContext();
        var message = global::System.Runtime.InteropServices.Marshal.PtrToStringUTF8(ctxPtr) ?? fallbackMessage;
{% if has_base_error %}
{% for line in variant_dispatch_lines %}
{{ line }}
{% endfor %}
        if (code == 2) return new {{ base_exception_class }}(message);
{% endif %}
        return new {{ class_name }}(code, message);
    }
}