diff --git a/README.md b/README.md
index 39ce4b3..73000f3 100644
--- a/README.md
+++ b/README.md
@@ -2,8 +2,8 @@
[](https://www.nuget.org/packages/StevanFreeborn.Results)
[](https://www.nuget.org/packages/StevanFreeborn.Results)
-[](https://github.com/StevanFreeborn/stevanfreeborn.results/actions/workflows/ci.yaml)
-[](https://opensource.org/licenses/MIT)
+[](https://github.com/StevanFreeborn/stevanfreeborn.results/actions/workflows/ci.yaml)
+[](./LICENSE.md)
A minimalistic, AOT-compatible Result type library with support for custom error types, for railway-oriented programming and functional error handling in .NET.
diff --git a/src/.editorconfig b/src/.editorconfig
index a834286..3ae1c72 100644
--- a/src/.editorconfig
+++ b/src/.editorconfig
@@ -1,5 +1,4 @@
[*.cs]
dotnet_diagnostic.CA1031.severity = none
-dotnet_diagnostic.CA1510.severity = none
dotnet_diagnostic.CA2225.severity = none
\ No newline at end of file
diff --git a/src/StevanFreeborn.Results/Result.cs b/src/StevanFreeborn.Results/Result.cs
index d64262f..65529ea 100644
--- a/src/StevanFreeborn.Results/Result.cs
+++ b/src/StevanFreeborn.Results/Result.cs
@@ -53,15 +53,23 @@ namespace StevanFreeborn.Results
/// Thrown when func or errorHandler is null.
public static Result Try(Func func, Func errorHandler) where TError : IError
{
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(func);
+#else
if (func is null)
{
throw new ArgumentNullException(nameof(func));
}
+#endif
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(errorHandler);
+#else
if (errorHandler is null)
{
throw new ArgumentNullException(nameof(errorHandler));
}
+#endif
try
{
@@ -142,10 +150,14 @@ namespace StevanFreeborn.Results
/// Thrown when mapper is null.
public Result Map(Func mapper)
{
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(mapper);
+#else
if (mapper is null)
{
throw new ArgumentNullException(nameof(mapper));
}
+#endif
return IsSuccess ? Result.Ok(mapper(Value)) : Result.Fail(Error);
}
@@ -158,10 +170,14 @@ namespace StevanFreeborn.Results
/// Thrown when mapper is null.
public Result MapError(Func mapper) where TNewError : IError
{
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(mapper);
+#else
if (mapper is null)
{
throw new ArgumentNullException(nameof(mapper));
}
+#endif
return IsFailure ? Result.Fail(mapper(Error)) : Result.Ok(Value);
}
@@ -175,10 +191,14 @@ namespace StevanFreeborn.Results
/// Thrown when binder is null.
public Result Bind(Func> binder)
{
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(binder);
+#else
if (binder is null)
{
throw new ArgumentNullException(nameof(binder));
}
+#endif
return IsSuccess ? binder(Value) : Result.Fail(Error);
}
@@ -193,15 +213,23 @@ namespace StevanFreeborn.Results
/// Thrown when onSuccess or onFailure is null.
public TResult Match(Func onSuccess, Func onFailure)
{
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(onSuccess);
+#else
if (onSuccess is null)
{
throw new ArgumentNullException(nameof(onSuccess));
}
+#endif
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(onFailure);
+#else
if (onFailure is null)
{
throw new ArgumentNullException(nameof(onFailure));
}
+#endif
return IsSuccess ? onSuccess(Value) : onFailure(Error);
}
@@ -214,15 +242,23 @@ namespace StevanFreeborn.Results
/// Thrown when onSuccess or onFailure is null.
public void Match(Action onSuccess, Action onFailure)
{
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(onSuccess);
+#else
if (onSuccess is null)
{
throw new ArgumentNullException(nameof(onSuccess));
}
+#endif
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(onFailure);
+#else
if (onFailure is null)
{
throw new ArgumentNullException(nameof(onFailure));
}
+#endif
if (IsSuccess)
{
@@ -242,10 +278,14 @@ namespace StevanFreeborn.Results
/// Thrown when action is null.
public Result Map(Action action)
{
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(action);
+#else
if (action is null)
{
throw new ArgumentNullException(nameof(action));
}
+#endif
if (IsSuccess)
{
@@ -262,10 +302,14 @@ namespace StevanFreeborn.Results
/// Thrown when action is null.
public Result Map(Action action)
{
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(action);
+#else
if (action is null)
{
throw new ArgumentNullException(nameof(action));
}
+#endif
if (IsSuccess)
{
diff --git a/src/StevanFreeborn.Results/ResultAsyncExtensions.cs b/src/StevanFreeborn.Results/ResultAsyncExtensions.cs
index ee5ed71..eeff219 100644
--- a/src/StevanFreeborn.Results/ResultAsyncExtensions.cs
+++ b/src/StevanFreeborn.Results/ResultAsyncExtensions.cs
@@ -19,15 +19,23 @@ namespace StevanFreeborn.Results
public static async Task> MapAsync(this Result result, Func> mapper)
where TError : IError
{
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(result);
+#else
if (result is null)
{
throw new ArgumentNullException(nameof(result));
}
+#endif
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(mapper);
+#else
if (mapper is null)
{
throw new ArgumentNullException(nameof(mapper));
}
+#endif
return result.IsSuccess ? await mapper(result.Value).ConfigureAwait(false) : result.Error;
}
@@ -46,15 +54,23 @@ namespace StevanFreeborn.Results
where TError : IError
where TNewError : IError
{
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(result);
+#else
if (result is null)
{
throw new ArgumentNullException(nameof(result));
}
+#endif
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(mapper);
+#else
if (mapper is null)
{
throw new ArgumentNullException(nameof(mapper));
}
+#endif
return result.IsFailure ? await mapper(result.Error).ConfigureAwait(false) : Result.Ok(result.Value);
}
@@ -70,15 +86,23 @@ namespace StevanFreeborn.Results
public static async Task> MapAsync(this Result result, Func onSuccess)
where TError : IError
{
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(result);
+#else
if (result is null)
{
throw new ArgumentNullException(nameof(result));
}
+#endif
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(onSuccess);
+#else
if (onSuccess is null)
{
throw new ArgumentNullException(nameof(onSuccess));
}
+#endif
if (result.IsSuccess)
{
@@ -99,15 +123,23 @@ namespace StevanFreeborn.Results
public static async Task> BindAsync(this Result result, Func>> onSuccess)
where TError : IError
{
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(result);
+#else
if (result is null)
{
throw new ArgumentNullException(nameof(result));
}
+#endif
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(onSuccess);
+#else
if (onSuccess is null)
{
throw new ArgumentNullException(nameof(onSuccess));
}
+#endif
return result.IsSuccess ? await onSuccess(result.Value).ConfigureAwait(false) : result;
}
@@ -125,20 +157,32 @@ namespace StevanFreeborn.Results
public static async Task MatchAsync(this Result result, Func> onSuccess, Func> onFailure)
where TError : IError
{
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(result);
+#else
if (result is null)
{
throw new ArgumentNullException(nameof(result));
}
+#endif
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(onSuccess);
+#else
if (onSuccess is null)
{
throw new ArgumentNullException(nameof(onSuccess));
}
+#endif
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(onFailure);
+#else
if (onFailure is null)
{
throw new ArgumentNullException(nameof(onFailure));
}
+#endif
return result.IsSuccess
? await onSuccess(result.Value).ConfigureAwait(false)
@@ -164,15 +208,23 @@ namespace StevanFreeborn.Results
/// Thrown when action or errorHandler is null.
public static async Task> TryAsync(Func action, Func errorHandler)
{
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(action);
+#else
if (action is null)
{
throw new ArgumentNullException(nameof(action));
}
+#endif
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(errorHandler);
+#else
if (errorHandler is null)
{
throw new ArgumentNullException(nameof(errorHandler));
}
+#endif
try
{
@@ -198,15 +250,23 @@ namespace StevanFreeborn.Results
public static async Task> BindAsync(this Result result, Func>> binder)
where TError : IError
{
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(result);
+#else
if (result is null)
{
throw new ArgumentNullException(nameof(result));
}
+#endif
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(binder);
+#else
if (binder is null)
{
throw new ArgumentNullException(nameof(binder));
}
+#endif
return result.IsSuccess ? await binder(result.Value).ConfigureAwait(false) : Result.Fail(result.Error);
}
@@ -225,20 +285,32 @@ namespace StevanFreeborn.Results
public static async Task MatchAsync(this Result result, Func> onSuccess, Func> onFailure)
where TError : IError
{
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(result);
+#else
if (result is null)
{
throw new ArgumentNullException(nameof(result));
}
+#endif
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(onSuccess);
+#else
if (onSuccess is null)
{
throw new ArgumentNullException(nameof(onSuccess));
}
+#endif
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(onFailure);
+#else
if (onFailure is null)
{
throw new ArgumentNullException(nameof(onFailure));
}
+#endif
return result.IsSuccess
? await onSuccess(result.Value).ConfigureAwait(false)
@@ -266,15 +338,23 @@ namespace StevanFreeborn.Results
/// Thrown when func or errorHandler is null.
public static async Task> TryAsync(Func> func, Func errorHandler)
{
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(func);
+#else
if (func is null)
{
throw new ArgumentNullException(nameof(func));
}
+#endif
+#if NET6_0_OR_GREATER
+ ArgumentNullException.ThrowIfNull(errorHandler);
+#else
if (errorHandler is null)
{
throw new ArgumentNullException(nameof(errorHandler));
}
+#endif
try
{
diff --git a/src/StevanFreeborn.Results/StevanFreeborn.Results.csproj b/src/StevanFreeborn.Results/StevanFreeborn.Results.csproj
index 1284e54..38d36a9 100644
--- a/src/StevanFreeborn.Results/StevanFreeborn.Results.csproj
+++ b/src/StevanFreeborn.Results/StevanFreeborn.Results.csproj
@@ -21,6 +21,9 @@
README.md
LICENSE.md
+
+ true
+
diff --git a/tests/StevanFreeborn.Results.Tests/ErrorTests.cs b/tests/StevanFreeborn.Results.Tests/ErrorTests.cs
index 132d790..1242fca 100644
--- a/tests/StevanFreeborn.Results.Tests/ErrorTests.cs
+++ b/tests/StevanFreeborn.Results.Tests/ErrorTests.cs
@@ -61,4 +61,4 @@ public class ErrorTests
await Assert.That(error).IsAssignableTo();
}
-}
+}
\ No newline at end of file
diff --git a/tests/StevanFreeborn.Results.Tests/ResultAsyncExtensionsTests.cs b/tests/StevanFreeborn.Results.Tests/ResultAsyncExtensionsTests.cs
index 91621b9..cdf5762 100644
--- a/tests/StevanFreeborn.Results.Tests/ResultAsyncExtensionsTests.cs
+++ b/tests/StevanFreeborn.Results.Tests/ResultAsyncExtensionsTests.cs
@@ -196,4 +196,4 @@ public class ResultAsyncExtensionsTests
await Assert.That(result.IsFailure).IsTrue();
await Assert.That(result.Error.Code).IsEqualTo("custom");
}
-}
+}
\ No newline at end of file
diff --git a/tests/StevanFreeborn.Results.Tests/ResultTTests.cs b/tests/StevanFreeborn.Results.Tests/ResultTTests.cs
index b3b5ec9..0415972 100644
--- a/tests/StevanFreeborn.Results.Tests/ResultTTests.cs
+++ b/tests/StevanFreeborn.Results.Tests/ResultTTests.cs
@@ -200,4 +200,4 @@ public class ResultTTests
await Assert.That(result.IsFailure).IsTrue();
await Assert.That(result.Error.Code).IsEqualTo("custom");
}
-}
+}
\ No newline at end of file
diff --git a/tests/StevanFreeborn.Results.Tests/ResultTests.cs b/tests/StevanFreeborn.Results.Tests/ResultTests.cs
index 93a2396..ef7e42c 100644
--- a/tests/StevanFreeborn.Results.Tests/ResultTests.cs
+++ b/tests/StevanFreeborn.Results.Tests/ResultTests.cs
@@ -16,7 +16,7 @@ public class ResultTests
{
var error = new Error("code", "message");
var result = Result.Fail(error);
-
+
await Assert.That(result.IsSuccess).IsFalse();
await Assert.That(result.IsFailure).IsTrue();
await Assert.That(result.Error).IsEqualTo(error);
@@ -163,4 +163,4 @@ public class ResultTests
await Assert.That(result.IsFailure).IsTrue();
await Assert.That(result.Error.Code).IsEqualTo("custom");
}
-}
+}
\ No newline at end of file