diff --git a/src/AStar.Dev.Functional.Extensions/AStar.Dev.Functional.Extensions.csproj b/src/AStar.Dev.Functional.Extensions/AStar.Dev.Functional.Extensions.csproj index 1ea161b..f3fca29 100644 --- a/src/AStar.Dev.Functional.Extensions/AStar.Dev.Functional.Extensions.csproj +++ b/src/AStar.Dev.Functional.Extensions/AStar.Dev.Functional.Extensions.csproj @@ -18,14 +18,14 @@ LICENSE https://github.com/astar-development/astar-dev-functional-extensions/ Readme.md - Update. + Add a basic implementation of Result. True git https://github.com/astar-development/astar-dev-functional-extensions.git snupkg net9.0 AStar.Dev.Functional.Extensions - 0.1.0 + 0.2.0 diff --git a/src/AStar.Dev.Functional.Extensions/AStar.Dev.Functional.Extensions.xml b/src/AStar.Dev.Functional.Extensions/AStar.Dev.Functional.Extensions.xml index 034a31a..a502f77 100644 --- a/src/AStar.Dev.Functional.Extensions/AStar.Dev.Functional.Extensions.xml +++ b/src/AStar.Dev.Functional.Extensions/AStar.Dev.Functional.Extensions.xml @@ -112,6 +112,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The generic class contains the result for a successful method diff --git a/src/AStar.Dev.Functional.Extensions/Result.cs b/src/AStar.Dev.Functional.Extensions/Result.cs new file mode 100644 index 0000000..dfe3d50 --- /dev/null +++ b/src/AStar.Dev.Functional.Extensions/Result.cs @@ -0,0 +1,73 @@ +namespace AStar.Dev.Functional.Extensions; + + +/// +/// +/// +/// +/// +public readonly struct Result +{ + /// + /// + /// + public readonly TSuccess? Value { get; } + + /// + /// + /// + public readonly TError? Error { get; } + + /// + /// + /// + /// + /// + /// + private Result(TSuccess? successObject, TError? errorObject, bool isSuccess) + { + Value = successObject; + Error = errorObject; + this.IsSuccess = isSuccess; + } + + /// + /// + /// + public bool IsSuccess { get; } + + /// + /// + /// + public bool IsFailure => !IsSuccess; + +#pragma warning disable CA1000 + /// + /// + /// + /// + /// + public static Result Success(TSuccess value) => new(value, default, true); + + /// + /// + /// + /// + /// + public static Result Failure(TError error) => new(default, error, false); +#pragma warning restore CA1000 + + /// + /// + /// + /// + /// + public static implicit operator Result(TSuccess success) => new(success, default, true); + + /// + /// + /// + /// + /// + public static implicit operator Result(TError error) => new(default, error, false); +} diff --git a/test/AStar.Dev.Functional.Extensions.Tests.Unit/ResultShould.cs b/test/AStar.Dev.Functional.Extensions.Tests.Unit/ResultShould.cs new file mode 100644 index 0000000..0d8f4bb --- /dev/null +++ b/test/AStar.Dev.Functional.Extensions.Tests.Unit/ResultShould.cs @@ -0,0 +1,75 @@ +using JetBrains.Annotations; + +namespace AStar.Dev.Functional.Extensions; + +[TestSubject(typeof(Result<,>))] +public class ResultShould +{ + [Fact] + public void BeOfTypeStruct() => typeof(Result<,>).IsValueType.ShouldBeTrue(); + + [Fact] + public void BeImmutable() => typeof(Result<,>)?.DeclaringType?.Name.ShouldBe("sdsds"); + + [Fact] + public void ContainTwoGenericClassParameters() + { + var result = typeof(Result<,>).GetGenericArguments(); + + result.Length.ShouldBe(2); + } + + [Fact] + public void ContainTheIsSuccessFlagSetToFalseByDefault() + => new Result().IsSuccess.ShouldBeFalse(); + + [Fact] + public void ContainTheIsFailureFlagSetToTrueByDefault() + => new Result().IsFailure.ShouldBeTrue(); + + [Fact] + public void CreateSuccessResult() + { + var result = Result.Success("Some value here"); + + result.IsSuccess.ShouldBeTrue(); + result.Value.ShouldBe("Some value here"); + } + + [Fact] + public void CreateFailureResult() + { + var result = Result.Failure("Some value here"); + + result.IsSuccess.ShouldBeFalse(); + result.Value.ShouldBeNull(); + } + + [Fact] + public void CreateImplicitSuccessResult() + { + var result = ImplicitResult(false); + + result.IsSuccess.ShouldBeTrue(); + result.Value.ShouldBe("Some value here"); + } + + [Fact] + public void CreateImplicitFailureResult() + { + var result = ImplicitResult(true); + + result.IsSuccess.ShouldBeFalse(); + result.Value.ShouldBeNull(); + } + + private static Result ImplicitResult(bool fail) + { + if (!fail) + { + return "Some value here"; + } + + return -1; + } +}