RSCG – Sera.Union
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