Описание

Библиотека в функциональном стиле для работы с паттерном Result. Упрощает обработку успешных и неуспешных результатов без использования исключений, улучшая читаемость и надежность кода.

Возможности

  • Удобное представление успешных (Success) и неуспешных (Failure) результатов
  • Композиция и трансформация результатов с помощью функциональных методов (Map, Then, Match и др.)
  • Исключение необходимости использовать try-catch в бизнес-логике
  • Поддержка асинхронных операций
  • Поддержка логгирования: Microsoft.Extensions.Logging, Serilog или любой другой кастомный адаптер

Быстрый старт

Установка

dotnet add package 4q-dev.ResultSharp

Базовое использование

using ResultSharp;
using ResultSharp.Errors;
using ResultSharp.Extensions.FunctionalExtensions.Sync;

Result<int> ParseNumber(string input)
{
    return int.TryParse(input, out var number)
        ? number
        : Error.Failure("Invalid number");
}

int result = ParseNumber("42")
    .Map(n => n * 2)
    .Match(
        ok =>
        {
            Console.WriteLine($"Number is {ok}");
            return Result.Success(ok + 10);
        },
        errs =>
        {
            Console.WriteLine($"Errors: {errs.SummaryErrorMessages()}");
            return Error.Failure("Some failure message");
        }
    )
    .LogIfSuccess("Log value: {val}") // output: Log value: 94
    .UnwrapOrDefault(@default: 0);

Console.WriteLine(result); // 94

Пример использования

Без использования Result:

var user = userRepository.Get();
if (user is null)
{
    logger.LogMessage("User not found");
    throw new Exception("User not found");
}

if (user.Email.IsConfirmed is false)
{
    logger.LogMessage("Email address must be confirmed before sending notifications.");
    throw new Exception("Email address must be confirmed before sending notifications.");
}

try
{
    emailNotificationService.Notify(user.Email, "some notification message");
}
catch (Exception ex)
{
    Logger.LogMessage("Error message: {ex}", ex.Message);
    throw ex;
}

С использованием ResultSharp:

return userRepository.Get()
    .Ensure(user => user.Email.IsConfirmed, onFailure: Error.Unauthorized("Email address must be confirmed before sending notifications."))
    .Then(user => emailNotificationService.Notify(user.Email, "some notification message"))
    .LogErrorMessages();

Репозиторий и лицензия

Весь исходный код открыт и доступен по ссылке в репозитории на GitHub.

Проект распространяется под лицензией MIT. См. файл LICENSE для деталей.