TnTResult 1.1.24

dotnet add package TnTResult --version 1.1.24
                    
NuGet\Install-Package TnTResult -Version 1.1.24
                    
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="TnTResult" Version="1.1.24" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="TnTResult" Version="1.1.24" />
                    
Directory.Packages.props
<PackageReference Include="TnTResult" />
                    
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 TnTResult --version 1.1.24
                    
#r "nuget: TnTResult, 1.1.24"
                    
#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.
#:package TnTResult@1.1.24
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=TnTResult&version=1.1.24
                    
Install as a Cake Addin
#tool nuget:?package=TnTResult&version=1.1.24
                    
Install as a Cake Tool

<p align="center"> <img src="Logo.png" alt="TnTResult Logo" width="128" height="128" /> </p>

TnTResult Solution

TnTResult is a .NET solution providing a set of libraries for handling result types, error handling, and HTTP integration in C# applications. It is designed to improve code clarity, error propagation, and integration with ASP.NET Core and Refit-based APIs.

Table of Contents


Projects Overview

1. TnTResult

  • Purpose:
    • Core library for result types (Expected, Optional, etc.), error handling, and utility extensions.
    • Provides a functional approach to handling success/failure and optional values.
  • Key Files:
    • Expected.cs, Optional.cs, TnTResult.cs, TnTFileDownload.cs
    • Extensions in Ext/
    • Custom exceptions in Exceptions/

2. TnTResult.AspNetCore.Http

  • Purpose:
    • Integrates TnTResult types with ASP.NET Core HTTP pipeline.
    • Provides helpers for controller responses and HTTP result mapping.
  • Key Files:
    • ControllerRepositoryBase.cs, HttpTnTResult.cs
    • Extensions in Ext/

3. TnTResult.Refit

  • Purpose:
    • Adds support for using TnTResult types with Refit (a REST library for .NET).
    • Provides extension methods for working with IApiResponse and mapping API results.
  • Key Files:
    • Extensions in Ext/

4. TnTResult.Tests

  • Purpose:
    • Contains unit tests for all core and extension libraries.
    • Organized by subproject and feature.

Build Instructions

  1. Prerequisites:

  2. Restore dependencies:

    dotnet restore TnTResult.sln
    
  3. Build the solution:

    dotnet build TnTResult.sln --configuration Release
    

Running Tests

All tests are located in the TnTResult.Tests project. To run all tests:

dotnet test TnTResult.sln

Usage Examples

TnTResult

using TnTResult;

// --- Expected usage ---
var ok = Expected.MakeExpected<int, string>(42);
if (ok.HasValue)
{
    Console.WriteLine($"Value: {ok.Value}");
}
else
{
    Console.WriteLine($"Error: {ok.Error}");
}

var err = Expected.MakeUnexpected<int, string>("Something went wrong");
if (!err.HasValue)
{
    Console.WriteLine($"Error: {err.Error}");
}

// --- Optional usage ---
var some = Optional.MakeOptional("hello");
if (some.HasValue)
{
    Console.WriteLine($"Optional value: {some.Value}");
}

var none = Optional.NullOpt<string>();
if (none.IsEmpty)
{
    Console.WriteLine("Optional is empty");
}

// --- ITnTResult usage ---
ITnTResult result = TnTResult.Successful;
result
    .OnSuccess(() => Console.WriteLine("Operation succeeded!"))
    .OnFailure(ex => Console.WriteLine($"Operation failed: {ex.Message}"))
    .Finally(() => Console.WriteLine("Operation finished (success or failure)"));

// ITnTResult<T> usage
ITnTResult<string> result2 = TnTResult.Success("Hello");
result2
    .OnSuccess(val => Console.WriteLine($"Success value: {val}"))
    .OnFailure(ex => Console.WriteLine($"Failed: {ex.Message}"))
    .Finally(() => Console.WriteLine("Done!"));

// --- Async usage with extension methods ---
using TnTResult.Ext;
await Task.FromResult(TnTResult.Successful)
    .OnSuccessAsync(() => Console.WriteLine("Async success!"));

await Task.FromResult(TnTResult.Failure(new Exception("fail")))
    .OnFailureAsync(ex => Console.WriteLine($"Async failure: {ex.Message}"));

TnTResult.AspNetCore.Http

using TnTResult.AspNetCore.Http;
using TnTResult;
using Microsoft.AspNetCore.Mvc;

// Inherit from TnTResultControllerBase to use static helpers
// Return ITnTResult from your actions—the base class will automatically convert it to an appropriate IResult for ASP.NET Core.
public class MyController : TnTResultControllerBase
{
    [HttpGet("/created")]
    public ITnTResult CreatedExample()
    {
        // Use the static SuccessfullyCreated property
        return SuccessfullyCreated;
    }

    [HttpGet("/forbidden")]
    public ITnTResult ForbiddenExample()
    {
        // Use the static FailureForbidden property
        return FailureForbidden;
    }

    [HttpGet("/conflict")]
    public ITnTResult ConflictExample()
    {
        // Use the static Conflict helper
        return Conflict("A conflict occurred");
    }

    [HttpGet("/custom-created")]
    public ITnTResult CustomCreatedExample()
    {
        // Use the static Created<T> helper for a custom value
        return Created("Resource created!");
    }
}

// Note: TnTResultControllerBase will automatically convert any ITnTResult returned from your action
// into the correct ASP.NET Core IResult (status code, body, etc.) for the HTTP response.

TnTResult.Refit

using TnTResult.Refit.Ext;
using Refit;

public interface IMyApi
{
    [Get("/data")]
    Task<IApiResponse<string>> GetDataAsync();
}

// Usage in your code:
var apiResponse = await myApi.GetDataAsync();
var result = apiResponse.ToTnTResult();
if (result.IsSuccess)
{
    Console.WriteLine($"API value: {result.Value}");
}
else
{
    Console.WriteLine($"API error: {result.Error.Message}");
}

License

This project is licensed under the MIT License. See LICENSE 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 is compatible.  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.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net10.0

    • No dependencies.
  • net8.0

    • No dependencies.
  • net9.0

    • No dependencies.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on TnTResult:

Package Downloads
TnTResult.AspNetCore.Http

ASP.NET Core integration for TnTResult, providing seamless result handling and controller extensions for web APIs.

TnTResult.Refit

Refit integration for TnTResult, enabling functional result types in Refit-based HTTP clients for .NET.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.1.24 3,143 1/7/2026
1.1.23 1,558 10/17/2025
1.1.22 394 9/8/2025
1.1.21 222 9/8/2025
1.1.20 282 8/29/2025
1.1.19 379 7/8/2025
1.1.18 239 6/4/2025
1.1.17 223 6/4/2025
1.1.16 222 6/4/2025
1.1.14 450 5/7/2025
1.1.13 245 4/29/2025
1.1.12 709 4/10/2025
1.1.11 267 4/2/2025
1.1.10 272 3/28/2025
1.1.9 642 3/24/2025
1.1.8 234 3/18/2025
1.1.7 233 3/18/2025
1.1.6 242 3/18/2025
1.1.5 242 3/18/2025
Loading failed