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;
+ }
+}