using Microsoft.Extensions.Logging; using Remora.Results; namespace TeamOctolings.Octobot.Extensions; public static class LoggerExtensions { /// <summary> /// Checks if the <paramref name="result" /> has failed due to an error that has resulted from neither invalid user /// input nor the execution environment and logs the error using the provided <paramref name="logger" />. /// </summary> /// <remarks> /// This has special behavior for <see cref="ExceptionError" /> - its exception will be passed to the /// <paramref name="logger" /> /// </remarks> /// <param name="logger">The logger to use.</param> /// <param name="result">The Result whose error check.</param> /// <param name="message">The message to use if this result has failed.</param> public static void LogResult(this ILogger logger, IResult result, string? message = "") { if (result.IsSuccess) { return; } if (result.Error is ExceptionError exe) { if (exe.Exception is TaskCanceledException) { return; } logger.LogError(exe.Exception, "{ErrorMessage}", message); return; } logger.LogWarning("{UserMessage}{NewLine}{ResultErrorMessage}", message, Environment.NewLine, result.Error.Message); } }