ResultifyCore 1.1.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package ResultifyCore --version 1.1.0                
NuGet\Install-Package ResultifyCore -Version 1.1.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ResultifyCore" Version="1.1.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add ResultifyCore --version 1.1.0                
#r "nuget: ResultifyCore, 1.1.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install ResultifyCore as a Cake Addin
#addin nuget:?package=ResultifyCore&version=1.1.0

// Install ResultifyCore as a Cake Tool
#tool nuget:?package=ResultifyCore&version=1.1.0                

ResultifyCore

ResultifyCore is a .NET library providing Result, Option, Outcome, and OneOf patterns to simplify error handling, optional values, and type discrimination. It includes extension methods for fluent API support and enhanced readability.

Installation

You can install the ResultifyCore package via NuGet:

dotnet add package ResultifyCore

Or you can use the NuGet Package Manager:

Install-Package ResultifyCore

Usage

Result Pattern

The Result pattern represents the outcome of an operation that can either succeed or fail. It allows for better error handling and makes the flow of success or failure explicit.

Creating a Result
using ResultifyCore;

var successResult = Result<int>.Success(42);  // A successful result containing the value 42
var failureResult = Result<int>.Failure(new Exception("Something went wrong")); // A failed result containing an exception
Success and Failure Extension Methods

You can create successful and failure results more easily using these extension methods.

Example of Success Extension Method:
using ResultifyCore;

var result = "Success!".Success(); // Create a successful result with a value
Console.WriteLine(result.IsSuccess);  // Outputs: True
Console.WriteLine(result.Value);     // Outputs: Success!

// If an exception is passed, an InvalidOperationException will be thrown
try
{
    var resultWithException = new Exception("Test Exception").Success();
}
catch (InvalidOperationException ex)
{
    Console.WriteLine(ex.Message);  // Outputs: Cannot use an Exception as a value.
}
Example of Failure Extension Method:
using ResultifyCore;

var failureResult = new Exception("Failure reason").Failure<string>(); // Create a failure result containing an exception
Console.WriteLine(failureResult.IsSuccess);  // Outputs: False
Console.WriteLine(failureResult.Exception.Message); // Outputs: Failure reason

// If the exception is null, an ArgumentNullException will be thrown
try
{
    Exception exception = null;
    var resultWithNullException = exception.Failure<string>();
}
catch (ArgumentNullException ex)
{
    Console.WriteLine(ex.Message);  // Outputs: Exception cannot be null.
}
Method Chaining with Result

Method chaining allows you to perform multiple operations on the result, including transforming it, checking success or failure, or applying side-effects:

var successResult = 42.Success();

successResult
    .Do(res => Console.WriteLine("Executing common action"))     // Executes regardless of the result state
    .Tap(value => Console.WriteLine($"Tap into value: {value}"))  // Executes a side-effect
    .Map(value => value * 2)                                     // Transforms the value
    .OnSuccess(value => Console.WriteLine($"Transformed value: {value}"));  // Executes if result is successful

For a failed result, the same chaining pattern applies:

var failureResult = new Exception("Something went wrong").Failure<int>();

failureResult
    .Do(res => Console.WriteLine("Executing common action"))
    .Tap(value => Console.WriteLine($"Tap into value: {value}"))
    .Map(value => value * 2)
    .OnSuccess(value => Console.WriteLine($"Transformed value: {value}"));

Option Pattern

The Option pattern represents an optional value that may or may not be present. It allows you to avoid null references and explicitly handle the absence of values.

Creating an Option
using ResultifyCore;

var someOption = Option<int>.Some(42);  // Option containing a value
var noneOption = Option<int>.None;      // Option with no value
 var optionResult = 42.Some();
Match Method for Option
var matchOptionResult = someOption.Match<string>(
    onSome: value => "Value is present",
    onNone: () => "No value"
);
Console.WriteLine(matchOptionResult);  // Outputs: Value is present

OneOf Pattern

The OneOf pattern allows you to encapsulate multiple possible types for a single value. This is useful for cases where a value can belong to one of several types.

Example:
using ResultifyCore;

OneOf<int, string> numberOrString = new OneOf<int, string>("Hello");

# Accessing Values
if (numberOrString.IsT1)
{
    Console.WriteLine($"Value is of type T1: {numberOrString.AsT1}");
}
else if (numberOrString.IsT2)
{
    Console.WriteLine($"Value is of type T2: {numberOrString.AsT2}");
}

# Match Method
var matchResult = numberOrString.Match(
    matchT1: number => $"Number: {number}",
    matchT2: text => $"String: {text}"
);
Console.WriteLine(matchResult);  // Outputs: String: Hello

Outcome Pattern

The Outcome pattern provides an alternative to exceptions for managing errors and failures, offering a clean, functional approach to success and failure scenarios.

Example:

var optionResult = 42.SuccessOutcome();

public static Outcome ValidateInput(string input)
{
    if (string.IsNullOrWhiteSpace(input))
    {
        return Outcome.Failure(new OutcomeError("VALIDATION_ERROR", "Input cannot be null or whitespace."));
    }

    return Outcome.Success();
}

public static Outcome<int> ParseNumber(string input)
{
    if (int.TryParse(input, out var number))
    {
        return Outcome<int>.Success(number);
    }

    return Outcome<int>.Failure(new OutcomeError("PARSE_ERROR", "Invalid number format."));
}

var result = ParseNumber("abc");

result.Match(
    onSuccess: value => Console.WriteLine($"Parsed number: {value}"),
    onFailure: errors => Console.WriteLine($"Failed to parse number: {string.Join(", ", errors)}")
);

Extensions

ResultifyCore provides several extension methods to facilitate fluent API and method chaining.

Result Extensions
  • Do: Executes an action regardless of the result state.
  • OnSuccess: Executes an action if the result is successful.
  • OnError: Executes an action if the result is failed.
  • Map: Transforms the value inside a successful result.
  • Bind: Chains multiple operations that return results.
  • Tap: Executes a side-effect action without altering the result.
Option Extensions
  • Do: Executes an action regardless of whether the option has a value.
  • OnSome: Executes an action if the option has a value.
  • OnNone: Executes an action if the option does not have a value.
  • Map: Transforms the value inside an option.
  • Bind: Chains multiple operations that return options.
  • Tap: Executes a side-effect action without altering the option.

License

This project is licensed under the MIT License. See the LICENSE file for details.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net8.0

    • No dependencies.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on ResultifyCore:

Package Downloads
MediatorForge

MediatorForge is a comprehensive library designed to streamline the implementation of common patterns in .NET applications. It includes: - Fluent Validation integration for seamless validation of requests. - Authorization logic to ensure secure access control. - Logging behaviors to monitor and record request processing. - Command and Query handling using Mediator pattern. - Support for Result and Option types to handle outcomes effectively. The library simplifies handling cross-cutting concerns, enhancing readability and maintainability of your codebase.

ResultifyCore.AspNetCore

ResultifyCore is a comprehensive library designed to handle Result and Option patterns in .NET applications. It includes: - Result pattern for handling success and failure outcomes. - Option pattern for handling optional values. - Extension methods for fluent API support. - Method chaining for enhanced readability. - Comprehensive error handling using custom exceptions. The library simplifies handling different outcomes, enhancing readability and maintainability of your codebase.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.2.0 68 2/4/2025
1.1.1 50 1/29/2025
1.1.0 42 1/28/2025
1.0.3.4 34 1/28/2025
1.0.3.3 30 1/27/2025
1.0.3.2 64 1/17/2025
1.0.3.1 67 1/16/2025
1.0.3 104 12/31/2024
1.0.2 90 12/29/2024
1.0.1 115 12/25/2024
1.0.0 154 12/6/2024