Skip to content

Commit 51f2b90

Browse files
Update Error usage to utilize ErrorList record with ErrorMessages and CorrelationId (#173)
* Update Error usage to take in a strongly typed wrapper class, ErrorList, for ErrorMessages and CorrelationId * Add default value for simpler usage of Error method * Add XML comments --------- Co-authored-by: Steve Smith <[email protected]>
1 parent 54b5de8 commit 51f2b90

File tree

9 files changed

+52
-42
lines changed

9 files changed

+52
-42
lines changed

src/Ardalis.Result/ErrorList.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System.Collections.Generic;
2+
3+
namespace Ardalis.Result;
4+
5+
/// <summary>
6+
/// A wrapper class for a list of error messages and an optional CorrelationId.
7+
/// </summary>
8+
/// <param name="ErrorMessages"></param>
9+
/// <param name="CorrelationId"></param>
10+
public record ErrorList(IEnumerable<string> ErrorMessages, string? CorrelationId);

src/Ardalis.Result/Result.Void.cs

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -53,28 +53,15 @@ public static Result<T> Success<T>(T value, string successMessage)
5353
/// Represents an error that occurred during the execution of the service.
5454
/// Error messages may be provided and will be exposed via the Errors property.
5555
/// </summary>
56-
/// <param name="errorMessages">A list of string error messages.</param>
57-
/// <returns>A Result</returns>
58-
public new static Result Error(params string[] errorMessages)
59-
{
60-
return new Result(ResultStatus.Error) { Errors = errorMessages };
61-
}
62-
63-
/// <summary>
64-
/// Represents an error that occurred during the execution of the service.
65-
/// Sets the CorrelationId property to the provided value
66-
/// Error messages may be provided and will be exposed via the Errors property.
67-
/// </summary>
68-
/// <param name="correlationId">Sets the CorrelationId property.</param>
69-
/// <param name="errorMessages">A list of string error messages.</param>
56+
/// <param name="error">An optional instance of ErrorList with list of string error messages and CorrelationId.</param>
7057
/// <returns>A Result</returns>
71-
public static Result ErrorWithCorrelationId(string correlationId, params string[] errorMessages)
58+
public new static Result Error(ErrorList error = null)
7259
{
73-
return new Result(ResultStatus.Error)
74-
{
75-
CorrelationId = correlationId,
76-
Errors = errorMessages
77-
};
60+
return new Result(ResultStatus.Error)
61+
{
62+
CorrelationId = error?.CorrelationId ?? string.Empty,
63+
Errors = error?.ErrorMessages ?? []
64+
};
7865
}
7966

8067
/// <summary>

src/Ardalis.Result/Result.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Linq;
34
using System.Text.Json.Serialization;
45

56
namespace Ardalis.Result
@@ -133,11 +134,15 @@ public static Result<T> Created(T value, string location)
133134
/// Represents an error that occurred during the execution of the service.
134135
/// Error messages may be provided and will be exposed via the Errors property.
135136
/// </summary>
136-
/// <param name="errorMessages">A list of string error messages.</param>
137+
/// <param name="error">An optional instance of ErrorList with list of string error messages and CorrelationId.</param>
137138
/// <returns>A Result<typeparamref name="T"/></returns>
138-
public static Result<T> Error(params string[] errorMessages)
139+
public static Result<T> Error(ErrorList error = null)
139140
{
140-
return new Result<T>(ResultStatus.Error) { Errors = errorMessages };
141+
return new Result<T>(ResultStatus.Error)
142+
{
143+
CorrelationId = error?.CorrelationId ?? string.Empty,
144+
Errors = error?.ErrorMessages ?? []
145+
};
141146
}
142147

143148
/// <summary>

src/Ardalis.Result/ResultExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public static Result<TDestination> Map<TSource, TDestination>(this Result<TSourc
2828
case ResultStatus.Unauthorized: return Result<TDestination>.Unauthorized();
2929
case ResultStatus.Forbidden: return Result<TDestination>.Forbidden();
3030
case ResultStatus.Invalid: return Result<TDestination>.Invalid(result.ValidationErrors);
31-
case ResultStatus.Error: return Result<TDestination>.Error(result.Errors.ToArray());
31+
case ResultStatus.Error: return Result<TDestination>.Error(new ErrorList(result.Errors.ToArray(), result.CorrelationId));
3232
case ResultStatus.Conflict: return result.Errors.Any()
3333
? Result<TDestination>.Conflict(result.Errors.ToArray())
3434
: Result<TDestination>.Conflict();

tests/Ardalis.Result.UnitTests/PagedResultConstructor.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using FluentAssertions;
2+
using System;
23
using System.Collections.Generic;
34
using System.Linq;
45
using Xunit;
@@ -94,12 +95,14 @@ public void InitializesStatusToErrorGivenErrorFactoryCall()
9495
public void InitializesStatusToErrorAndSetsErrorMessageGivenErrorFactoryCall()
9596
{
9697
string errorMessage = "Something bad happened.";
98+
string correlationId = Guid.NewGuid().ToString();
9799
var result = Result<object>
98-
.Error(errorMessage)
100+
.Error(new([errorMessage], correlationId))
99101
.ToPagedResult(_pagedInfo);
100102

101103
Assert.Equal(ResultStatus.Error, result.Status);
102-
Assert.Equal(errorMessage, result.Errors.First());
104+
Assert.Equal(errorMessage, result.Errors.Single());
105+
Assert.Equal(correlationId, result.CorrelationId);
103106
Assert.Equal(_pagedInfo, result.PagedInfo);
104107
}
105108

tests/Ardalis.Result.UnitTests/ResultConstructor.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using FluentAssertions;
2+
using System;
23
using System.Collections.Generic;
34
using System.Linq;
45
using Xunit;
@@ -7,6 +8,10 @@ namespace Ardalis.Result.UnitTests;
78

89
public class ResultConstructor
910
{
11+
private class TestObject
12+
{
13+
}
14+
1015
[Fact]
1116
public void InitializesStronglyTypedStringValue()
1217
{
@@ -34,10 +39,6 @@ public void InitializesStronglyTypedObjectValue()
3439
Assert.Equal(expectedObject, result.Value);
3540
}
3641

37-
private class TestObject
38-
{
39-
}
40-
4142
[Fact]
4243
public void InitializesValueToNullGivenNullConstructorArgument()
4344
{
@@ -134,10 +135,12 @@ public void InitializesStatusToErrorGivenErrorFactoryCall()
134135
public void InitializesStatusToErrorAndSetsErrorMessageGivenErrorFactoryCall()
135136
{
136137
string errorMessage = "Something bad happened.";
137-
var result = Result<object>.Error(errorMessage);
138+
string correlationId = Guid.NewGuid().ToString();
139+
var result = Result<object>.Error(new([errorMessage], correlationId));
138140

139141
Assert.Equal(ResultStatus.Error, result.Status);
140-
Assert.Equal(errorMessage, result.Errors.First());
142+
Assert.Equal(errorMessage, result.Errors.Single());
143+
Assert.Equal(correlationId, result.CorrelationId);
141144
}
142145

143146
[Fact]
@@ -232,7 +235,7 @@ public void InitializedIsSuccessTrueForSuccessFactoryCall()
232235
[Fact]
233236
public void InitializedIsSuccessFalseForErrorFactoryCall()
234237
{
235-
var result = Result<object>.Error(null);
238+
var result = Result<object>.Error();
236239

237240
Assert.False(result.IsSuccess);
238241
}

tests/Ardalis.Result.UnitTests/ResultMap.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -155,25 +155,25 @@ public void ShouldProduceInvalidWithoutValidationErrors()
155155
[Fact]
156156
public void ShouldProduceErrorResultWithErrors()
157157
{
158-
var errors = new string[] { "Error 1", "Error 2" };
159-
var result = Result<int>.Error(errors);
158+
var errorList = new ErrorList(["Error 1", "Error 2"], default);
159+
var result = Result<int>.Error(errorList);
160160

161161
var actual = result.Map(val => val.ToString());
162162

163163
actual.Status.Should().Be(ResultStatus.Error);
164-
actual.Errors.Should().BeEquivalentTo(errors);
164+
actual.Errors.Should().BeEquivalentTo(errorList.ErrorMessages);
165165
}
166166

167167
[Fact]
168168
public void ShouldProduceErrorResultWithNoErrors()
169169
{
170-
var errors = Array.Empty<string>();
171-
var result = Result<int>.Error(errors);
170+
var result = Result<int>.Error();
172171

173172
var actual = result.Map(val => val.ToString());
174173

175174
actual.Status.Should().Be(ResultStatus.Error);
176-
actual.Errors.Should().BeEquivalentTo(errors);
175+
actual.Errors.Should().BeEmpty();
176+
actual.CorrelationId.Should().BeEmpty();
177177
}
178178

179179
[Fact]

tests/Ardalis.Result.UnitTests/ResultVoidConstructor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public void InitializesSuccessResultWithMessageWithFactoryMethod()
4141
[InlineData("test1", "test2")]
4242
public void InitializesErrorResultWithFactoryMethod(params string[] errors)
4343
{
44-
var result = Result.Error(errors);
44+
var result = Result.Error(new ErrorList(errors, null));
4545

4646
Assert.Null(result.Value);
4747
Assert.Equal(ResultStatus.Error, result.Status);
@@ -59,7 +59,7 @@ public void InitializesErrorResultWithCorrelationIdWithFactoryMethod()
5959
{
6060
var correlationId = "testId";
6161
var errors = new string[] { "Error 1", "Error 2" };
62-
var result = Result.ErrorWithCorrelationId(correlationId, errors);
62+
var result = Result.Error(new ErrorList(errors, correlationId));
6363

6464
Assert.Null(result.Value);
6565
Assert.Equal(ResultStatus.Error, result.Status);

tests/Ardalis.Result.UnitTests/ResultVoidToResultOfT.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@ public class ResultVoidToResultOfT
1111
[InlineData("test1", "test2")]
1212
public void ConvertFromErrorResultOfUnit(params string[] errors)
1313
{
14-
var result = DoBusinessOperationExample<object>(Result.Error(errors));
14+
var errorList = new ErrorList(errors, default);
15+
var result = DoBusinessOperationExample<object>(Result.Error(errorList));
1516

1617
Assert.Null(result.Value);
1718
Assert.Equal(ResultStatus.Error, result.Status);
19+
Assert.Empty(result.CorrelationId);
1820

1921
foreach (var error in errors)
2022
{

0 commit comments

Comments
 (0)