Skip to content

Commit 74c1a48

Browse files
authored
Add Map Extension Method to Support Mapping from Result<T> to Result (#213)
1 parent 2ebaed8 commit 74c1a48

File tree

2 files changed

+159
-0
lines changed

2 files changed

+159
-0
lines changed

src/Ardalis.Result/ResultExtensions.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,5 +334,39 @@ private static Result HandleNonSuccessStatus<TSource>(Result<TSource> result)
334334
_ => throw new NotSupportedException($"Result {result.Status} conversion is not supported."),
335335
};
336336
}
337+
338+
/// <summary>
339+
/// Transforms a Result's type from a source type to a non-generic Result type.
340+
/// </summary>
341+
/// <typeparam name="TSource"></typeparam>
342+
/// <param name="result"></param>
343+
/// <returns></returns>
344+
/// <exception cref="NotSupportedException"></exception>
345+
public static Result Map<TSource>(this Result<TSource> result)
346+
{
347+
switch (result.Status)
348+
{
349+
case ResultStatus.Ok: return Result.Success();
350+
case ResultStatus.NotFound: return result.Errors.Any()
351+
? Result.NotFound(result.Errors.ToArray())
352+
: Result.NotFound();
353+
case ResultStatus.Unauthorized: return result.Errors.Any()
354+
? Result.Unauthorized(result.Errors.ToArray())
355+
: Result.Unauthorized();
356+
case ResultStatus.Forbidden: return result.Errors.Any()
357+
? Result.Forbidden(result.Errors.ToArray())
358+
: Result.Forbidden();
359+
case ResultStatus.Invalid: return Result.Invalid(result.ValidationErrors);
360+
case ResultStatus.Error: return Result.Error(new ErrorList(result.Errors.ToArray(), result.CorrelationId));
361+
case ResultStatus.Conflict: return result.Errors.Any()
362+
? Result.Conflict(result.Errors.ToArray())
363+
: Result.Conflict();
364+
case ResultStatus.CriticalError: return Result.CriticalError(result.Errors.ToArray());
365+
case ResultStatus.Unavailable: return Result.Unavailable(result.Errors.ToArray());
366+
case ResultStatus.NoContent: return Result.NoContent();
367+
default:
368+
throw new NotSupportedException($"Result {result.Status} conversion is not supported.");
369+
}
370+
}
337371
}
338372
}
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
using FluentAssertions;
2+
using FluentAssertions.Execution;
3+
using System;
4+
using System.Linq;
5+
using Xunit;
6+
7+
namespace Ardalis.Result.UnitTests;
8+
9+
public class ResultGenericToVoidMap
10+
{
11+
[Fact]
12+
public void ShouldProduceSuccess()
13+
{
14+
var result = Result<int>.Success(1);
15+
16+
var actual = result.Map();
17+
18+
actual.Status.Should().Be(ResultStatus.Ok);
19+
}
20+
21+
[Fact]
22+
public void ShouldProduceNotFound()
23+
{
24+
var result = Result<int>.NotFound();
25+
26+
var actual = result.Map();
27+
28+
actual.Status.Should().Be(ResultStatus.NotFound);
29+
}
30+
31+
[Fact]
32+
public void ShouldProduceUnauthorized()
33+
{
34+
var result = Result<int>.Unauthorized();
35+
36+
var actual = result.Map();
37+
38+
actual.Status.Should().Be(ResultStatus.Unauthorized);
39+
}
40+
41+
[Fact]
42+
public void ShouldProduceForbidden()
43+
{
44+
var result = Result<int>.Forbidden();
45+
46+
var actual = result.Map();
47+
48+
actual.Status.Should().Be(ResultStatus.Forbidden);
49+
}
50+
51+
[Fact]
52+
public void ShouldProduceInvalid()
53+
{
54+
var result = Result<int>.Invalid(new ValidationError());
55+
56+
var actual = result.Map();
57+
58+
actual.Status.Should().Be(ResultStatus.Invalid);
59+
}
60+
61+
[Fact]
62+
public void ShouldProduceError()
63+
{
64+
var result = Result<int>.Error();
65+
66+
var actual = result.Map();
67+
68+
actual.Status.Should().Be(ResultStatus.Error);
69+
}
70+
71+
[Fact]
72+
public void ShouldProduceErrorWhenConstructedWithErrorList()
73+
{
74+
string correlationId = Guid.NewGuid().ToString();
75+
string errorMessage = "Error occured 💥";
76+
var result = Result<int>.Error(new ErrorList([errorMessage], correlationId));
77+
78+
var actual = result.Map();
79+
80+
using var assertionScope = new AssertionScope();
81+
actual.Status.Should().Be(ResultStatus.Error);
82+
actual.CorrelationId.Should().Be(correlationId);
83+
actual.Errors.Single().Should().Be(errorMessage);
84+
}
85+
86+
[Fact]
87+
public void ShouldProduceConflict()
88+
{
89+
var result = Result<int>.Conflict();
90+
91+
var actual = result.Map();
92+
93+
actual.Status.Should().Be(ResultStatus.Conflict);
94+
}
95+
96+
[Fact]
97+
public void ShouldProduceCriticalError()
98+
{
99+
var result = Result<int>.CriticalError();
100+
101+
var actual = result.Map();
102+
103+
actual.Status.Should().Be(ResultStatus.CriticalError);
104+
}
105+
106+
[Fact]
107+
public void ShouldProduceUnavailable()
108+
{
109+
var result = Result<int>.Unavailable();
110+
111+
var actual = result.Map();
112+
113+
actual.Status.Should().Be(ResultStatus.Unavailable);
114+
}
115+
116+
[Fact]
117+
public void ShouldProduceNoContent()
118+
{
119+
var result = Result<int>.NoContent();
120+
121+
var actual = result.Map();
122+
123+
actual.Status.Should().Be(ResultStatus.NoContent);
124+
}
125+
}

0 commit comments

Comments
 (0)