#nullable enable using System; using System.Diagnostics.CodeAnalysis; namespace Barotrauma { public abstract class Result where TSuccess: notnull where TFailure: notnull { public abstract bool IsSuccess { get; } public bool IsFailure => !IsSuccess; public static Success Success(TSuccess value) => new Success(value); public static Failure Failure(TFailure error) => new Failure(error); public abstract bool TryUnwrapSuccess([NotNullWhen(returnValue: true)] out TSuccess? value); public abstract bool TryUnwrapFailure([NotNullWhen(returnValue: true)] out TFailure? value); public abstract override string ToString(); public static (Func> Success, Func> Failure) GetFactoryMethods() => (Success, Failure); public static implicit operator Result(Result.UnspecifiedSuccess unspecifiedSuccess) => Success(unspecifiedSuccess.Value); public static implicit operator Result(Result.UnspecifiedFailure unspecifiedFailure) => Failure(unspecifiedFailure.Value); public void Match(Action success, Action failure) { if (TryUnwrapSuccess(out var successValue)) { success(successValue); } if (TryUnwrapFailure(out var failureValue)) { failure(failureValue); } } } public sealed class Success : Result where TSuccess: notnull where TFailure: notnull { public readonly TSuccess Value; public override bool IsSuccess => true; public override bool TryUnwrapSuccess([MaybeNullWhen(returnValue: false)] out TSuccess value) { value = Value; return true; } public override bool TryUnwrapFailure([MaybeNullWhen(returnValue: false)] out TFailure value) { value = default; return false; } public override string ToString() => $"Success<{typeof(TSuccess).NameWithGenerics()}, {typeof(TFailure).NameWithGenerics()}>({Value})"; public Success(TSuccess value) { Value = value; } } public sealed class Failure : Result where TSuccess: notnull where TFailure: notnull { public readonly TFailure Error; public override bool IsSuccess => false; public override bool TryUnwrapSuccess([MaybeNullWhen(returnValue: false)] out TSuccess value) { value = default; return false; } public override bool TryUnwrapFailure([MaybeNullWhen(returnValue: false)] out TFailure value) { value = Error; return true; } public override string ToString() => $"Failure<{typeof(TSuccess).NameWithGenerics()}, {typeof(TFailure).NameWithGenerics()}>({Error})"; public Failure(TFailure error) { Error = error; } } public static class Result { public readonly ref struct UnspecifiedSuccess where TSuccess : notnull { internal readonly TSuccess Value; internal UnspecifiedSuccess(TSuccess value) { Value = value; } } public readonly ref struct UnspecifiedFailure where TFailure : notnull { internal readonly TFailure Value; internal UnspecifiedFailure(TFailure value) { Value = value; } } public static UnspecifiedSuccess Success(TSuccess value) where TSuccess : notnull => new UnspecifiedSuccess(value); public static UnspecifiedFailure Failure(TFailure value) where TFailure : notnull => new UnspecifiedFailure(value); } }