Pisum.Result
A lightweight .NET library implementing the Result pattern for functional error handling without exceptions.
Installation
dotnet add package Pisum.Result
Quick Start
using Pisum.Result;
// Return a success result
Result<int> successResult = Result.Success(42);
// Return a failure result
Result<int> failureResult = Result.Fail<int>(new Error("NOT_FOUND", "Item was not found"));
// Check the result
if (successResult.IsSuccess)
{
Console.WriteLine($"Value: {successResult.Value}");
}
if (failureResult.IsFailed)
{
foreach (var error in failureResult.Errors)
{
Console.WriteLine($"Error [{error.Code}]: {error.Message}");
}
}
Features
- Exception-free error handling - Errors are data, not exceptions
- Type-safe results - Generic
Result<T> for strongly-typed success values
- Implicit conversions - Seamlessly create results from values or errors
- Error aggregation - Collect multiple errors in a single failure state
- Immutable - Thread-safe, predictable behavior
Usage
Creating Results
// Success without value
Result result = Result.Success();
// Success with value
Result<string> result = Result.Success("Hello");
// Failure with single error
Result result = Result.Fail(new Error("ERROR_CODE", "Something went wrong"));
// Failure with multiple errors
Result result = Result.Fail(new IError[]
{
new Error("ERROR_1", "First error"),
new Error("ERROR_2", "Second error")
});
// Using implicit conversion
Result<int> result = 42; // Success
Result<int> result = new Error("INVALID", "Invalid"); // Failure
Working with Errors
// Generic error
var error = new Error("INVALID_INPUT", "The input value is invalid");
// Validation error with property tracking
var validationError = new ValidationError("Email is required", "Email");
Pattern in Methods
public Result<User> GetUser(int id)
{
var user = _repository.Find(id);
if (user == null)
return new Error("USER_NOT_FOUND", $"User with ID {id} was not found");
return user;
}
// Usage
var result = GetUser(123);
if (result.IsSuccess)
{
var user = result.Value;
// Process user
}
else
{
// Handle errors
foreach (var error in result.Errors)
{
_logger.LogError("Error [{Code}]: {Message}", error.Code, error.Message);
}
}
API Reference
Result
| Member |
Description |
IsSuccess |
Returns true if the operation succeeded |
IsFailed |
Returns true if the operation failed |
Errors |
Read-only collection of errors |
Success() |
Creates a success result |
Success<T>(T value) |
Creates a success result with a value |
Fail(IError error) |
Creates a failure result with an error |
Fail(IError[] errors) |
Creates a failure result with multiple errors |
Create<T>(T value) |
Creates a success result from a value |
Result<T>
| Member |
Description |
Value |
The success value (throws if IsFailed) |
Error
| Member |
Description |
Code |
Error identifier code |
Message |
Optional error message |
ValidationError
| Member |
Description |
Code |
Always returns "VALIDATION_ERROR" |
Message |
Validation error message |
Property |
Name of the property that failed validation |
License
Copyright (c) 2025 pisum.net