// // ResultExtensions.cs // // Copyright (c) František Boháček. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System; using System.Text; using Microsoft.Extensions.Logging; using Remora.Results; namespace NosSmooth.Core.Extensions; /// /// Contains extension methods for . /// public static class ResultExtensions { /// /// Logs the given result if it is errorful. /// /// The logger. /// The result to log. /// Thrown if the result was unsuccessful. public static void LogResultError(this ILogger logger, IResult result) { if (result.IsSuccess) { throw new InvalidOperationException("The result was successful, it has to be unsuccessful to log it."); } switch (result.Error) { case AggregateError aggregateError: logger.LogAggreggateError(aggregateError); break; default: logger.LogNestedError(result); break; } } private static void LogAggreggateError(this ILogger logger, AggregateError error) { foreach (var result in error.Errors) { logger.LogResultError(result); } } private static void LogNestedError(this ILogger logger, IResult? result) { if ((result?.IsSuccess ?? true) || result.Error is null) { throw new InvalidOperationException("The result was successful, it has to be unsuccessful to log it."); } var stringBuilder = new StringBuilder(result.Error.Message); int index = 0; while ((result = result?.Inner) is not null && result.Error is not null) { stringBuilder.Append($"\n {index++}: {result.Error.Message}"); } logger.LogError(stringBuilder.ToString()); } }