interoptopus_csharp 0.16.3

The C# backend for Interoptopus.
Documentation
using System;
using My.Company;
using My.Company.Common;
using Xunit;
using Interop = My.Company.Interop;

public class TestPatternResult
{
    [Fact]
    public void pattern_result_1()
    {
        var x = new ResultUintError();
        Interop.pattern_result_1(x).AsOk();
    }

    [Fact]
    public void pattern_result_2()
    {
        var result = Interop.pattern_result_2();
        Assert.True(result.IsOk);
    }

    [Fact]
    public void pattern_result_3()
    {
        Assert.True(Interop.pattern_result_3(ResultVoidError.Ok).IsOk);
        Assert.Equal(ResultVoidError.Ok, Interop.pattern_result_3(ResultVoidError.Ok));
        Assert.Equal(ResultVoidError.Null, Interop.pattern_result_3(ResultVoidError.Null));
    }

    [Fact]
    public void pattern_result_4()
    {
        Assert.True(Interop.pattern_result_4(ResultVoidVoid.Ok).IsOk);
    }

    [Fact]
    public void pattern_string_5()
    {
        var w = new UseString { s1 = "hello".Utf8(), s2 = "world".Utf8() };
        var result = Interop.pattern_string_5(w);
        var ok = result.AsOk();
        Assert.Equal("hello", ok.s1.String);
        Assert.Equal("world", ok.s2.String);
    }

    [Fact]
    public void pattern_result_interface()
    {
        var result = Interop.pattern_result_2();
        IResult<Unit, Error> resultInterface = result;
        Assert.True(resultInterface.IsOk);
        Assert.False(resultInterface.IsErr);
        Assert.False(resultInterface.IsPanic);
        Assert.False(resultInterface.IsNull);

        resultInterface.AsOk();
        Assert.Throws<EnumException>(() => resultInterface.AsErr());
    }

    [Fact]
    public void pattern_result_custom_matches()
    {
        var resultVoidVoid = ResultVoidVoid.Ok;
        var resultVoidError = Interop.pattern_result_2();
        var resultUIntError = ResultUintError.Ok(42);

        var match1 = my_match(resultVoidVoid, v => v.ToString(), e => e.ToString());
        var match2 = my_match(resultVoidError, v => v.ToString(), e => e.ToString());
        var match3 = my_match(resultUIntError, v => v.ToString(), e => e.ToString());

        Assert.Equal("()", match1);
        Assert.Equal("()", match2);
        Assert.Equal("42", match3);
    }

    private static TResult my_match<T, TErr, TResult>(
        IResult<T, TErr> res,
        Func<T, TResult> okMatcher,
        Func<TErr, TResult> errMatcher
    )
    {
        if (res.IsOk)
            return okMatcher(res.AsOk());
        if (res.IsErr)
            return errMatcher(res.AsErr());
        throw res.ExceptionForVariant();
    }
}