RSCG – Sera.Union
| name | Sera.Union |
| nuget | https://www.nuget.org/packages/Sera.Union/ |
| link | https://github.com/sera-net/Sera.Union |
| author | Sera |
Generate tagged union
This is how you can use Sera.Union .
The code that you start with is
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Sera.Union" Version="0.7.0" />
</ItemGroup>
</Project>
The code that you will use is
using UnionTypesDemo;
Console.WriteLine("Save or not");
var data = SaveToDatabase.Save(0);
Console.WriteLine(data.IsNotFound);
data = SaveToDatabase.Save(1);
if(data.IsOk)
{
Console.WriteLine(data.Tag);
Console.WriteLine(data.Ok);
}
The code that is generated is
// <auto-generated/>
#nullable enable
using Sera.TaggedUnion;
namespace UnionTypesDemo {
public partial struct ResultSave
: global::Sera.TaggedUnion.ITaggedUnion
,global::System.IEquatable<ResultSave>
,global::System.IComparable<ResultSave>
#if NET7_0_OR_GREATER
,global::System.Numerics.IEqualityOperators<ResultSave,ResultSave,bool>
,global::System.Numerics.IComparisonOperators<ResultSave,ResultSave,bool>
#endif
{
private __impl_ _impl;
private ResultSave(__impl_ _impl) { this._impl = _impl; }
public readonly Tags Tag
{
[global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
get => this._impl._tag;
}
public enum Tags : byte
{
Ok = 1,
NotFound = 2,
}
[global::System.Runtime.CompilerServices.CompilerGenerated]
private struct __impl_
{
public __unmanaged_ _unmanaged_;
public readonly Tags _tag;
[global::System.Runtime.CompilerServices.CompilerGenerated]
[global::System.Runtime.InteropServices.StructLayout(global::System.Runtime.InteropServices.LayoutKind.Explicit)]
internal struct __unmanaged_
{
[global::System.Runtime.InteropServices.FieldOffset(0)]
public int _0;
}
public __impl_(Tags _tag)
{
global::System.Runtime.CompilerServices.Unsafe.SkipInit(out this._unmanaged_);
this._tag = _tag;
}
}
[global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
public static ResultSave MakeOk(int value)
{
var _impl = new __impl_(Tags.Ok);
_impl._unmanaged_._0 = value;
return new ResultSave(_impl);
}
[global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
public static ResultSave MakeNotFound()
{
var _impl = new __impl_(Tags.NotFound);
return new ResultSave(_impl);
}
public readonly bool IsOk
{
[global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
get => this._impl._tag == Tags.Ok;
}
public readonly bool IsNotFound
{
[global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
get => this._impl._tag == Tags.NotFound;
}
public int Ok
{
[global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
readonly get => !this.IsOk ? default! : this._impl._unmanaged_._0!;
[global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
set { if (this.IsOk) { this._impl._unmanaged_._0 = value; } }
}
[global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
public readonly bool Equals(ResultSave other) => this.Tag != other.Tag ? false : this.Tag switch
{
Tags.Ok => global::System.Collections.Generic.EqualityComparer<int>.Default.Equals(this.Ok,other.Ok),
_ => true,
};
[global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
public readonly override int GetHashCode() => this.Tag switch
{
Tags.Ok => global::System.HashCode.Combine(this.Tag,this.Ok),
_ => global::System.HashCode.Combine(this.Tag),
};
[global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
public readonly override bool Equals(object? obj) => obj is ResultSave other && Equals(other);
[global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
public static bool operator ==(ResultSave left,ResultSave right) => Equals(left,right);
[global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
public static bool operator !=(ResultSave left,ResultSave right) => !Equals(left,right);
[global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
public readonly int CompareTo(ResultSave other) => this.Tag != other.Tag ? global::System.Collections.Generic.Comparer<Tags>.Default.Compare(this.Tag,other.Tag) : this.Tag switch
{
Tags.Ok => global::System.Collections.Generic.Comparer<int>.Default.Compare(this.Ok,other.Ok),
_ => 0,
};
[global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
public static bool operator <(ResultSave left,ResultSave right) => left.CompareTo(right) < 0;
[global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
public static bool operator >(ResultSave left,ResultSave right) => left.CompareTo(right) > 0;
[global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
public static bool operator <=(ResultSave left,ResultSave right) => left.CompareTo(right) <= 0;
[global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
public static bool operator >=(ResultSave left,ResultSave right) => left.CompareTo(right) >= 0;
[global::System.Runtime.CompilerServices.MethodImpl(global::System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
public readonly override string ToString() => this.Tag switch
{
Tags.Ok => $"{nameof(ResultSave)}.{nameof(Tags.Ok)} {{ {this.Ok} }}",
Tags.NotFound => $"{nameof(ResultSave)}.{nameof(Tags.NotFound)}",
_ => nameof(ResultSave),
};
}
} // namespace UnionTypesDemo
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/Sera.Union
Leave a Reply