SResult 1.3.2

There is a newer version of this package available.
See the version list below for details.
dotnet add package SResult --version 1.3.2
                    
NuGet\Install-Package SResult -Version 1.3.2
                    
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="SResult" Version="1.3.2" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="SResult" Version="1.3.2" />
                    
Directory.Packages.props
<PackageReference Include="SResult" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add SResult --version 1.3.2
                    
#r "nuget: SResult, 1.3.2"
                    
#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.
#addin nuget:?package=SResult&version=1.3.2
                    
Install SResult as a Cake Addin
#tool nuget:?package=SResult&version=1.3.2
                    
Install SResult as a Cake Tool

SResult

This is an "as simple as it could" and a pure Result pattern library.

Why another result pattern?

  1. Just a boiler plate basic codes made as library for everyday use. No mvc or any bulk.
  2. It has to have a Result when success.
  3. It has to have a Reason when fail.
  4. It impossible to be both or neither.

Structure

You have two flavour available.

  1. Result<TValue> For simplest use. It returns built in Reason instance when failed.
  2. Result<TValue, TReason> is when you want to use your own Type to use for fails.

Making result of flavor Result<TValue>

var result1 = Result.Success(200);
// Or
var result2 = Result.Fail<int>("Something is wrong");

Making result of flavor Result<TValue, TReason>

var result3 = Result.Success<int, int>(200);
// Or
var result4 = Result.Fail<int, int>(-1);

When returning from method

private static Result<int, string> DummyHttpGet(string url)
{
    if (string.IsNullOrEmpty(url)) 
        return Result.Fail<int, string>("Url cannot be blank");

    return Result.Success<int, string>(200);
}

Mapping to return type automatically

private static Result<int, string> DummyHttpGet(string url)
{
    if (string.IsNullOrEmpty(url)) return "Url cannot be blank";
    return 200;
}

// NOTE: Auto mapping won't work with same value and reason type. There is no way to distinguish. Make it manually for those cases. E.g.
private static Result<string, string> InnerMethod(string url)
{
    if (string.IsNullOrEmpty(url)) 
        return Result.Fail<string, string>("Parameter cannot be blank");

    return Result.Success<string, string>("All good");
}

Do something before returning

public bool Handler()
{
    var result = DummyHttpGet("http://somedomain.com")
    .OnSuccess((result) => { /* Do something on success with result */ })
    .OnFail((reason) => { /* Do something on failure with failure */ });

    return result.IsSuccess();
}

private static Result<int, string> DummyHttpGet(string url)
{
    if (string.IsNullOrEmpty(url)) return "Url cannot be blank";
    return 200;
}

Built in Reason

Initially this was not part of the library. But I end up making basic reason class for all projects which is same 95% of the time. it usually has a string message and a error type sort of thing. So I thought to make a part of it. So those 95% cases are covered. And free to use custom type when required.

Built in Reason examples

var reason1 = new Reason("Something wrong", ReasonType.Forbidden);
var reason2 = new Reason("Something wrong");
Reason reason3 = "Something wrong";
var reason4 = Reason.Error("Something wrong");
var reason5 = Reason.InvalidArgument("Something wrong");
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

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.3.3 205 3/5/2025
1.3.2 82 3/1/2025
1.3.1 99 2/27/2025
1.3.0 100 2/27/2025
1.2.2 101 2/27/2025
1.2.1 105 2/27/2025
1.2.0 96 2/27/2025
1.0.2 92 12/13/2024
1.0.1 97 12/11/2024
1.0.0 99 12/6/2024