diff --git a/src/Ardalis.Result/ResultExtensions.cs b/src/Ardalis.Result/ResultExtensions.cs index c8fb2d1..571bfbe 100644 --- a/src/Ardalis.Result/ResultExtensions.cs +++ b/src/Ardalis.Result/ResultExtensions.cs @@ -334,5 +334,39 @@ private static Result HandleNonSuccessStatus(Result result) _ => throw new NotSupportedException($"Result {result.Status} conversion is not supported."), }; } + + /// + /// Transforms a Result's type from a source type to a non-generic Result type. + /// + /// + /// + /// + /// + public static Result Map(this Result result) + { + switch (result.Status) + { + case ResultStatus.Ok: return Result.Success(); + case ResultStatus.NotFound: return result.Errors.Any() + ? Result.NotFound(result.Errors.ToArray()) + : Result.NotFound(); + case ResultStatus.Unauthorized: return result.Errors.Any() + ? Result.Unauthorized(result.Errors.ToArray()) + : Result.Unauthorized(); + case ResultStatus.Forbidden: return result.Errors.Any() + ? Result.Forbidden(result.Errors.ToArray()) + : Result.Forbidden(); + case ResultStatus.Invalid: return Result.Invalid(result.ValidationErrors); + case ResultStatus.Error: return Result.Error(new ErrorList(result.Errors.ToArray(), result.CorrelationId)); + case ResultStatus.Conflict: return result.Errors.Any() + ? Result.Conflict(result.Errors.ToArray()) + : Result.Conflict(); + case ResultStatus.CriticalError: return Result.CriticalError(result.Errors.ToArray()); + case ResultStatus.Unavailable: return Result.Unavailable(result.Errors.ToArray()); + case ResultStatus.NoContent: return Result.NoContent(); + default: + throw new NotSupportedException($"Result {result.Status} conversion is not supported."); + } + } } } diff --git a/tests/Ardalis.Result.UnitTests/ResultGenericToVoidMap.cs b/tests/Ardalis.Result.UnitTests/ResultGenericToVoidMap.cs new file mode 100644 index 0000000..25e3d3f --- /dev/null +++ b/tests/Ardalis.Result.UnitTests/ResultGenericToVoidMap.cs @@ -0,0 +1,125 @@ +using FluentAssertions; +using FluentAssertions.Execution; +using System; +using System.Linq; +using Xunit; + +namespace Ardalis.Result.UnitTests; + +public class ResultGenericToVoidMap +{ + [Fact] + public void ShouldProduceSuccess() + { + var result = Result.Success(1); + + var actual = result.Map(); + + actual.Status.Should().Be(ResultStatus.Ok); + } + + [Fact] + public void ShouldProduceNotFound() + { + var result = Result.NotFound(); + + var actual = result.Map(); + + actual.Status.Should().Be(ResultStatus.NotFound); + } + + [Fact] + public void ShouldProduceUnauthorized() + { + var result = Result.Unauthorized(); + + var actual = result.Map(); + + actual.Status.Should().Be(ResultStatus.Unauthorized); + } + + [Fact] + public void ShouldProduceForbidden() + { + var result = Result.Forbidden(); + + var actual = result.Map(); + + actual.Status.Should().Be(ResultStatus.Forbidden); + } + + [Fact] + public void ShouldProduceInvalid() + { + var result = Result.Invalid(new ValidationError()); + + var actual = result.Map(); + + actual.Status.Should().Be(ResultStatus.Invalid); + } + + [Fact] + public void ShouldProduceError() + { + var result = Result.Error(); + + var actual = result.Map(); + + actual.Status.Should().Be(ResultStatus.Error); + } + + [Fact] + public void ShouldProduceErrorWhenConstructedWithErrorList() + { + string correlationId = Guid.NewGuid().ToString(); + string errorMessage = "Error occured 💥"; + var result = Result.Error(new ErrorList([errorMessage], correlationId)); + + var actual = result.Map(); + + using var assertionScope = new AssertionScope(); + actual.Status.Should().Be(ResultStatus.Error); + actual.CorrelationId.Should().Be(correlationId); + actual.Errors.Single().Should().Be(errorMessage); + } + + [Fact] + public void ShouldProduceConflict() + { + var result = Result.Conflict(); + + var actual = result.Map(); + + actual.Status.Should().Be(ResultStatus.Conflict); + } + + [Fact] + public void ShouldProduceCriticalError() + { + var result = Result.CriticalError(); + + var actual = result.Map(); + + actual.Status.Should().Be(ResultStatus.CriticalError); + } + + [Fact] + public void ShouldProduceUnavailable() + { + var result = Result.Unavailable(); + + var actual = result.Map(); + + actual.Status.Should().Be(ResultStatus.Unavailable); + } + + [Fact] + public void ShouldProduceNoContent() + { + var result = Result.NoContent(); + + var actual = result.Map(); + + actual.Status.Should().Be(ResultStatus.NoContent); + } +}