error-or icon indicating copy to clipboard operation
error-or copied to clipboard

Extend API to facilitate multiple error handling

Open bidolah opened this issue 9 months ago • 3 comments

What dou you think about the following propose?

Before:

 public static ErrorOr<SomeResult> Create(string value1, string value2)
 {
     ErrorOr<Value1> value1OrError = Value1.Create(value1);
     ErrorOr<Value2> value2OrError = Value2.Create(value2);
     var errors = new List<Error>();
     errors.AddRange(value1OrError.Errors);
     errors.AddRange(value2OrError.Errors);

    if(errors.Count > 0) {
         return errors;
    }

    return  new SomeResult(value1OrError.Value, value2OrError.Value);
}

After (Option 1 - Separate class)

 public static ErrorOr<SomeResult> Create(string value1, string value2)
 {
     ErrorOr<Value1> value1OrError = Value1.Create(value1);
     ErrorOr<Value2> value2OrError = Value2.Create(value2);

     return ErrorCollector
        .Collect(value1OrError , value2OrError )
        .Then(x => new SomeResult(value1OrError.Value, value2OrError.Value));
 }

After (Option 2 - ErrorOrFactory)

 public static ErrorOr<SomeResult> Create(string value1, string value2)
 {
     ErrorOr<Value1> value1OrError = Value1.Create(value1);
     ErrorOr<Value2> value2OrError = Value2.Create(value2);

     return ErrorOrFactory
        .CollectErrors(value1OrError , value2OrError )
        .Then(() => new SomeResult(value1OrError.Value, value2OrError.Value));
 }

Implementation propose:

 public static ErrorOr<Result> CollectErrors<Result>(params IErrorOr[] errorsToCombine)
 {
     if (errorsToCombine.Any(x => x.IsError))
     {
         return errorsToCombine.SelectMany(x => x.Errors);
     }

     return Result.Success;
 }

Of course, improvements are required to handle cases like null values.

bidolah avatar May 28 '24 20:05 bidolah