RSCG – N.SourceGenerators.UnionTypes
| name | N.SourceGenerators.UnionTypes |
| nuget | https://www.nuget.org/packages/N.SourceGenerators.UnionTypes/ |
| link | https://github.com/Ne4to/N.SourceGenerators.UnionTypes |
| author | Alexey Sosnin |
Generating different union types
This is how you can use N.SourceGenerators.UnionTypes .
The code that you start with is
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="N.SourceGenerators.UnionTypes" Version="0.26.0" />
</ItemGroup>
<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
</PropertyGroup>
</Project>
The code that you will use is
using UnionTypesDemo; Console.WriteLine("Save or not"); var data = SaveToDatabase.Save(0); Console.WriteLine(data.IsValidationError); data = SaveToDatabase.Save(1); Console.WriteLine(data.IsSuccess);
using N.SourceGenerators.UnionTypes;
namespace UnionTypesDemo;
public record Success(int Value);
public record ValidationError(string Message);
[UnionType(typeof(Success))]
[UnionType(typeof(ValidationError))]
public partial class ResultSave
{
}
namespace UnionTypesDemo;
public class SaveToDatabase
{
public static ResultSave Save(int i)
{
if(i ==0)
{
return new ValidationError(" cannot save 0");
}
return new Success(i);
}
}
The code that is generated is
// <auto-generated>
// This code was generated by https://github.com/Ne4to/N.SourceGenerators.UnionTypes
// Feel free to open an issue
// </auto-generated>
#nullable enable
using System;
using System.Runtime.CompilerServices;
namespace N.SourceGenerators.UnionTypes
{
[AttributeUsage(AttributeTargets.GenericParameter,Inherited = false,AllowMultiple = false)]
internal sealed class GenericUnionTypeAttribute : Attribute
{
public string? Alias { get; set; }
public bool AllowNull { get; set; }
public object? TypeDiscriminator { get; set; }
}
}
// <auto-generated>
// This code was generated by https://github.com/Ne4to/N.SourceGenerators.UnionTypes
// Feel free to open an issue
// </auto-generated>
#nullable enable
using System;
using System.Runtime.CompilerServices;
namespace N.SourceGenerators.UnionTypes
{
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct,Inherited = false,AllowMultiple = false)]
internal sealed class JsonPolymorphicUnionAttribute : Attribute
{
public string? TypeDiscriminatorPropertyName { get; set; }
}
}
// <auto-generated>
// This code was generated by https://github.com/Ne4to/N.SourceGenerators.UnionTypes
// Feel free to open an issue
// </auto-generated>
#pragma warning disable
#nullable enable
namespace UnionTypesDemo
{
partial class ResultSave : System.IEquatable<ResultSave>
{
private readonly int _variantId;
private const int SuccessId = 1;
private readonly global::UnionTypesDemo.Success _success;
public bool IsSuccess => _variantId == SuccessId;
public global::UnionTypesDemo.Success AsSuccess
{
get
{
if (_variantId == SuccessId)
return _success;
throw new System.InvalidOperationException($"Unable convert to Success. Inner value is {ValueAlias} not Success.");
}
}
public ResultSave(global::UnionTypesDemo.Success success)
{
System.ArgumentNullException.ThrowIfNull(success);
_variantId = SuccessId;
_success = success;
}
public static implicit operator ResultSave(global::UnionTypesDemo.Success success) => new ResultSave(success);
public static explicit operator global::UnionTypesDemo.Success(ResultSave value)
{
if (value._variantId == SuccessId)
return value._success;
throw new System.InvalidOperationException($"Unable convert to Success. Inner value is {value.ValueAlias} not Success.");
}
public bool TryGetSuccess([System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out global::UnionTypesDemo.Success value)
{
if (_variantId == SuccessId)
{
value = _success;
return true;
}
else
{
value = default;
return false;
}
}
private const int ValidationErrorId = 2;
private readonly global::UnionTypesDemo.ValidationError _validationError;
public bool IsValidationError => _variantId == ValidationErrorId;
public global::UnionTypesDemo.ValidationError AsValidationError
{
get
{
if (_variantId == ValidationErrorId)
return _validationError;
throw new System.InvalidOperationException($"Unable convert to ValidationError. Inner value is {ValueAlias} not ValidationError.");
}
}
public ResultSave(global::UnionTypesDemo.ValidationError validationError)
{
System.ArgumentNullException.ThrowIfNull(validationError);
_variantId = ValidationErrorId;
_validationError = validationError;
}
public static implicit operator ResultSave(global::UnionTypesDemo.ValidationError validationError) => new ResultSave(validationError);
public static explicit operator global::UnionTypesDemo.ValidationError(ResultSave value)
{
if (value._variantId == ValidationErrorId)
return value._validationError;
throw new System.InvalidOperationException($"Unable convert to ValidationError. Inner value is {value.ValueAlias} not ValidationError.");
}
public bool TryGetValidationError([System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out global::UnionTypesDemo.ValidationError value)
{
if (_variantId == ValidationErrorId)
{
value = _validationError;
return true;
}
else
{
value = default;
return false;
}
}
public TOut Match<TOut>(global::System.Func<global::UnionTypesDemo.Success,TOut> matchSuccess,global::System.Func<global::UnionTypesDemo.ValidationError,TOut> matchValidationError)
{
if (_variantId == SuccessId)
return matchSuccess(_success);
if (_variantId == ValidationErrorId)
return matchValidationError(_validationError);
throw new System.InvalidOperationException("Inner type is unknown");
}
public async global::System.Threading.Tasks.Task<TOut> MatchAsync<TOut>(global::System.Func<global::UnionTypesDemo.Success,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task<TOut>> matchSuccess,global::System.Func<global::UnionTypesDemo.ValidationError,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task<TOut>> matchValidationError,global::System.Threading.CancellationToken ct)
{
if (_variantId == SuccessId)
return await matchSuccess(_success,ct).ConfigureAwait(false);
if (_variantId == ValidationErrorId)
return await matchValidationError(_validationError,ct).ConfigureAwait(false);
throw new System.InvalidOperationException("Inner type is unknown");
}
public void Switch(global::System.Action<global::UnionTypesDemo.Success> switchSuccess,global::System.Action<global::UnionTypesDemo.ValidationError> switchValidationError)
{
if (_variantId == SuccessId)
{
switchSuccess(_success);
return;
}
if (_variantId == ValidationErrorId)
{
switchValidationError(_validationError);
return;
}
throw new System.InvalidOperationException("Inner type is unknown");
}
public async global::System.Threading.Tasks.Task SwitchAsync(global::System.Func<global::UnionTypesDemo.Success,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task> switchSuccess,global::System.Func<global::UnionTypesDemo.ValidationError,global::System.Threading.CancellationToken,global::System.Threading.Tasks.Task> switchValidationError,global::System.Threading.CancellationToken ct)
{
if (_variantId == SuccessId)
{
await switchSuccess(_success,ct).ConfigureAwait(false);
return;
}
if (_variantId == ValidationErrorId)
{
await switchValidationError(_validationError,ct).ConfigureAwait(false);
return;
}
throw new System.InvalidOperationException("Inner type is unknown");
}
public global::System.Type ValueType
{
get
{
if (_variantId == SuccessId)
return typeof(global::UnionTypesDemo.Success);
if (_variantId == ValidationErrorId)
return typeof(global::UnionTypesDemo.ValidationError);
throw new System.InvalidOperationException("Inner type is unknown");
}
}
private string ValueAlias
{
get
{
if (_variantId == SuccessId)
return "Success";
if (_variantId == ValidationErrorId)
return "ValidationError";
throw new System.InvalidOperationException("Inner type is unknown");
}
}
public override int GetHashCode()
{
if (_variantId == SuccessId)
return _success.GetHashCode();
if (_variantId == ValidationErrorId)
return _validationError.GetHashCode();
throw new System.InvalidOperationException("Inner type is unknown");
}
public static bool operator ==(ResultSave? left,ResultSave? right)
{
return Equals(left,right);
}
public static bool operator !=(ResultSave? left,ResultSave? right)
{
return !Equals(left,right);
}
public bool Equals(ResultSave? other)
{
if (ReferenceEquals(null,other))
{
return false;
}
if (ReferenceEquals(this,other))
{
return true;
}
if (ValueType != other.ValueType)
{
return false;
}
if (_variantId == SuccessId)
return System.Collections.Generic.EqualityComparer<global::UnionTypesDemo.Success>.Default.Equals(_success,other._success);
if (_variantId == ValidationErrorId)
return System.Collections.Generic.EqualityComparer<global::UnionTypesDemo.ValidationError>.Default.Equals(_validationError,other._validationError);
throw new System.InvalidOperationException("Inner type is unknown");
}
public override string ToString()
{
if (_variantId == SuccessId)
return _success.ToString();
if (_variantId == ValidationErrorId)
return _validationError.ToString();
throw new System.InvalidOperationException("Inner type is unknown");
}
public override bool Equals(object? other)
{
if (ReferenceEquals(null,other))
{
return false;
}
if (ReferenceEquals(this,other))
{
return true;
}
if (other.GetType() != typeof(ResultSave))
{
return false;
}
return Equals((ResultSave)other);
}
}
}
#nullable enable
using System;
using System.Runtime.CompilerServices;
namespace N.SourceGenerators.UnionTypes
{
[AttributeUsage(AttributeTargets.Class,Inherited = false,AllowMultiple = true)]
sealed class UnionConverterAttribute : Attribute
{
public Type FromType { get; }
public Type ToType { get; }
public string? MethodName { get; }
public UnionConverterAttribute(Type fromType,Type toType,string? methodName = null)
{
FromType = fromType;
ToType = toType;
MethodName = methodName;
}
}
}
// <auto-generated>
// This code was generated by https://github.com/Ne4to/N.SourceGenerators.UnionTypes
// Feel free to open an issue
// </auto-generated>
#nullable enable
using System;
using System.Runtime.CompilerServices;
namespace N.SourceGenerators.UnionTypes
{
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct,Inherited = false,AllowMultiple = true)]
sealed class UnionConverterFromAttribute : Attribute
{
public Type FromType { get; }
public UnionConverterFromAttribute(Type fromType)
{
FromType = fromType;
}
}
}
// <auto-generated>
// This code was generated by https://github.com/Ne4to/N.SourceGenerators.UnionTypes
// Feel free to open an issue
// </auto-generated>
#nullable enable
using System;
using System.Runtime.CompilerServices;
namespace N.SourceGenerators.UnionTypes
{
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct,Inherited = false,AllowMultiple = true)]
sealed class UnionConverterToAttribute : Attribute
{
public Type ToType { get; }
public UnionConverterToAttribute(Type toType)
{
ToType = toType;
}
}
}
// <auto-generated>
// This code was generated by https://github.com/Ne4to/N.SourceGenerators.UnionTypes
// Feel free to open an issue
// </auto-generated>
#nullable enable
using System;
using System.Runtime.CompilerServices;
namespace N.SourceGenerators.UnionTypes
{
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct,Inherited = false,AllowMultiple = true)]
internal sealed class UnionTypeAttribute : Attribute
{
public Type Type { get; }
public string? Alias { get; }
public int Order { get; }
public bool AllowNull { get; set; }
public object? TypeDiscriminator { get; set; }
public UnionTypeAttribute(Type type,string? alias = null,[CallerLineNumber] int order = 0)
{
Type = type;
Alias = alias;
Order = order;
}
}
}
Code and pdf at
https://ignatandrei.github.io/RSCG_Examples/v2/docs/N.SourceGenerators.UnionTypes
Leave a Reply