Skip to content

Commit

Permalink
Add new derived types for clarity.
Browse files Browse the repository at this point in the history
olivegamestudio committed Aug 31, 2024
1 parent 67f4fa7 commit cffca7f
Showing 10 changed files with 117 additions and 71 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
.vs
bin
obj
*.user
17 changes: 17 additions & 0 deletions Utility.Result.Tests/ObjectResultTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using Musts;

namespace Utility;

public class ObjectResultTests
{
[Test]
public void Ok_Result_WithValue_Returns_Success()
{
ObjectResult<int> result = OkObjectResult<int>.Ok(99);

result.Value.MustBeEqual(99);
result.MustBeSuccess();
result.Error.MustBeNullOrEmpty();
result.ErrorCode.MustBeZero();
}
}
21 changes: 5 additions & 16 deletions Utility.Result.Tests/ResultTests.cs
Original file line number Diff line number Diff line change
@@ -10,10 +10,10 @@ public void OperatorAnd_Result_Returns_Success()
Result result = Result.Ok() && Result.Ok();
result.MustBeSuccess();

result = Result.Fail("Failed") && Result.Ok();
result = ErrorResult.Fail("Failed") && Result.Ok();
result.MustBeFailure();

result = Result.Ok() && Result.Fail("Failed");
result = Result.Ok() && ErrorResult.Fail("Failed");
result.MustBeFailure();
}

@@ -27,30 +27,19 @@ public void Ok_Result_Returns_Success()
result.ErrorCode.MustBeZero();
}

[Test]
public void Ok_Result_WithValue_Returns_Success()
{
Result<int> result = Result.Ok(99);

result.Value.MustBeEqual(99);
result.MustBeSuccess();
result.Error.MustBeNullOrEmpty();
result.ErrorCode.MustBeZero();
}

[Test]
public void Fail_Result_Returns_Failure()
{
Result result = Result.Fail("The operation failed because of ...");
Result result = ErrorResult.Fail("The operation failed because of ...");

result.MustBeFailure();
result.ErrorCode.MustBeZero();
result.ErrorCode.MustBeEqual(-1);
}

[Test]
public void Fail_Result_WithErrorCode_Returns_Failure()
{
Result result = Result.Fail("The operation failed because of ...", -1);
Result result = ErrorResult.Fail("The operation failed because of ...", -1);

result.MustBeFailure();
result.ErrorCode.MustBeEqual(-1);
6 changes: 6 additions & 0 deletions Utility.Result.lutconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<LUTConfig Version="1.0">
<Repository />
<ParallelBuilds>true</ParallelBuilds>
<ParallelTestRuns>true</ParallelTestRuns>
<TestCaseTimeout>180000</TestCaseTimeout>
</LUTConfig>
14 changes: 14 additions & 0 deletions Utility.Result/ErrorObjectResult.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace Utility;

public record ErrorObjectResult<T> : ObjectResult<T>
{
protected internal ErrorObjectResult(T value, string error, int errorCode) : base(value, false, error, errorCode)
{
Value = value;
}

public static ErrorObjectResult<T> Fail(string message, int errorCode = 0)
{
return new ErrorObjectResult<T>(default(T), message, errorCode);

Check warning on line 12 in Utility.Result/ErrorObjectResult.cs

GitHub Actions / build

Possible null reference argument for parameter 'value' in 'ErrorObjectResult<T>.ErrorObjectResult(T value, string error, int errorCode)'.

Check warning on line 12 in Utility.Result/ErrorObjectResult.cs

GitHub Actions / build

Possible null reference argument for parameter 'value' in 'ErrorObjectResult<T>.ErrorObjectResult(T value, string error, int errorCode)'.
}
}
27 changes: 27 additions & 0 deletions Utility.Result/ErrorResult.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
namespace Utility;

/// <summary>
/// Represents an error result with an associated error message and error code.
/// </summary>
public record ErrorResult : Result
{
/// <summary>
/// Initializes a new instance of the <see cref="ErrorResult"/> class.
/// </summary>
/// <param name="error">The error message associated with the result.</param>
/// <param name="errorCode">The error code associated with the result (optional).</param>
internal ErrorResult(string error, int errorCode = -1) : base(false, error, errorCode)
{
}

/// <summary>
/// Creates a failure result with the specified error message and error code.
/// </summary>
/// <param name="message">The error message.</param>
/// <param name="errorCode">The error code (optional).</param>
/// <returns>An error result.</returns>
public static ErrorResult Fail(string message, int errorCode = -1)
{
return new ErrorResult(message, errorCode);
}
}
11 changes: 11 additions & 0 deletions Utility.Result/ObjectResult.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace Utility;

public record ObjectResult<T> : Result
{
public T Value { get; set; }

protected internal ObjectResult(T value, bool success, string error, int errorCode) : base(success, error, errorCode)
{
Value = value;
}
}
14 changes: 14 additions & 0 deletions Utility.Result/OkObjectResult.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace Utility;

public record OkObjectResult<T> : ObjectResult<T>
{
protected internal OkObjectResult(T value) : base(value, true, string.Empty, 0)
{
Value = value;
}

public static OkObjectResult<T> Ok(T value)
{
return new OkObjectResult<T>(value);
}
}
14 changes: 14 additions & 0 deletions Utility.Result/OkResult.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace Utility;

/// <summary>
/// Represents a successful result with no associated value.
/// </summary>
public record OkResult : Result
{
/// <summary>
/// Initializes a new instance of the <see cref="OkResult"/> class.
/// </summary>
internal OkResult() : base(true)
{
}
}
63 changes: 8 additions & 55 deletions Utility.Result/Result.cs
Original file line number Diff line number Diff line change
@@ -88,69 +88,22 @@ protected Result(bool success, string error, int errorCode)
}

/// <summary>
/// Creates a failure result with the specified error message and error code.
/// </summary>
/// <param name="message">The error message.</param>
/// <param name="errorCode">The error code (optional).</param>
/// <returns>A failure result.</returns>
public static Result Fail(string message, int errorCode = 0)
{
return new Result(false, message, errorCode);
}

/// <summary>
/// Creates a failure result with the specified error message and error code.
/// Initializes a new instance of the <see cref="Result"/> class.
/// </summary>
/// <typeparam name="T">The type of the value associated with the result.</typeparam>
/// <param name="message">The error message.</param>
/// <param name="errorCode">The error code (optional).</param>
/// <returns>A failure result.</returns>
public static Result<T> Fail<T>(string message, int errorCode = 0)
/// <param name="success">A value indicating whether the result is a success.</param>
protected Result(bool success)
{
return new Result<T>(default(T), false, message, errorCode);
Success = success;
Error = string.Empty;
ErrorCode = 0;
}

/// <summary>
/// Creates a success result.
/// </summary>
/// <returns>A success result.</returns>
public static Result Ok()
{
return new Result(true, string.Empty, 0);
}

/// <summary>
/// Creates a success result with the specified value.
/// </summary>
/// <typeparam name="T">The type of the value associated with the result.</typeparam>
/// <param name="value">The value associated with the result.</param>
/// <returns>A success result.</returns>
public static Result<T> Ok<T>(T value)
{
return new Result<T>(value, true, string.Empty, 0);
}
}

/// <summary>
/// A result from a task which can be a success or failure, with an associated value.
/// </summary>
/// <typeparam name="T">The type of the value associated with the result.</typeparam>
public record Result<T> : Result
{
/// <summary>
/// Gets or sets the value associated with the result.
/// </summary>
public T Value { get; set; }

/// <summary>
/// Initializes a new instance of the <see cref="Result{T}"/> class.
/// </summary>
/// <param name="value">The value associated with the result.</param>
/// <param name="success">A value indicating whether the result is a success.</param>
/// <param name="error">The error message associated with the result.</param>
/// <param name="errorCode">The error code associated with the result.</param>
protected internal Result(T value, bool success, string error, int errorCode) : base(success, error, errorCode)
public static OkResult Ok()
{
Value = value;
return new OkResult();
}
}

0 comments on commit cffca7f

Please sign in to comment.