Описание
Библиотека в функциональном стиле для работы с паттерном 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 для деталей.