IndQuestResults 1.4.1
dotnet add package IndQuestResults --version 1.4.1
NuGet\Install-Package IndQuestResults -Version 1.4.1
<PackageReference Include="IndQuestResults" Version="1.4.1" />
<PackageVersion Include="IndQuestResults" Version="1.4.1" />
<PackageReference Include="IndQuestResults" />
paket add IndQuestResults --version 1.4.1
#r "nuget: IndQuestResults, 1.4.1"
#:package IndQuestResults@1.4.1
#addin nuget:?package=IndQuestResults&version=1.4.1
#tool nuget:?package=IndQuestResults&version=1.4.1
IndQuestResults - Enterprise-Grade Result<T> Library
A battle-tested, enterprise-grade Result<T> library for functional error handling in .NET applications. Provides type-safe, performant, and expressive ways to represent operation outcomes without exceptions.
Key Features
- Type safety: eliminate null-reference exceptions in control flow
- Performance: Span-based optimizations and reduced allocations
- Functional: Map, Bind, Match, Recover with fluent composition
- Thread-safe: immutable design, no shared mutable state
- JSON serializable: API responses and persistence ready (System.Text.Json)
- Warnings on success: diagnostics with quality metadata
- Quality: mutation-tested, high coverage
Quick Start
Installation
dotnet add package IndQuestResults
Basic Usage
using IndQuestResults;
// Success results
var ok = Result.Success();
var okWithValue = Result<string>.Success("Hello World");
// Failure results
var fail = Result.WithFailure("Operation failed");
var failWithValue = Result<int>.WithFailure("Parse error", value: 0);
// Multiple errors
var many = Result.WithFailure(new[] { "Error 1", "Error 2" });
// Warnings (successful with diagnostics)
var withWarnings = Result<string>.WithWarnings(
new[] { "Performance warning" },
"Operation completed"
);
// Warnings with quality metadata (confidence + missing data ratio)
var withWarnsAndMeta = Result<string>.WithWarnings(
warnings: new[] { "Heuristic fill for missing fields", "Low signal period" },
value: "Computed",
confidence: 0.82, // clamped to [0,1]
missingDataRatio: 0.25 // clamped to [0,1]
);
Console.WriteLine(withWarnsAndMeta.Confidence); // 0.82
Console.WriteLine(withWarnsAndMeta.MissingDataRatio); // 0.25
Console.WriteLine(string.Join(", ", withWarnsAndMeta.Warnings));
Functional Programming (Sync)
using IndQuestResults;
Result<UserDto> CreateUser(string userId)
{
return Result<string>.Success(userId)
.Ensure(id => !string.IsNullOrWhiteSpace(id), "empty id")
.Bind(id => LoadUser(id))
.Map(user => user.ToDto())
.Tap(dto => _logger.LogInformation($"User {dto.Id} processed"))
.Recover(() => Result<UserDto>.Success(UserDto.Default));
}
Async
Use the async API in IndQuestResults.Async.ResultAsync for fluent async composition.
using IndQuestResults;
using IndQuestResults.Async;
var dto = await ResultAsync
.BindAsync(GetUserAsync(userId), user => ValidateUserAsync(user))
.MapAsync(valid => valid.ToDtoAsync())
.TapAsync(dto => CacheAsync(dto))
.RecoverAsync(() => GetDefaultUserDtoAsync());
// Collections
var users = await ResultAsync.TraverseParallelAsync(
userIds,
id => GetUserAsync(id),
maxDegreeOfParallelism: 4
);
Async railway verbs: Then, Ensure, ToResult
The short, conventional railway verbs are available directly on Task<Result<T>> (and Then on Result<T>), mirroring the synchronous surface so the async chain is no longer asymmetric:
using IndQuestResults;
using IndQuestResults.Operations;
Task<Result<OrderDto>> Handle(CreateOrder request) =>
Result.Success(request) // chain-starting factory on the non-generic Result
.ValidateNotNull(r => (r.CustomerId, nameof(request.CustomerId)))
.Then(r => Result<Order>.Success(new Order(r))) // returns Result<T> => binds/flattens (no nesting)
.ThenAsync(order => _repo.SaveAsync(order)) // async-bind
.Ensure(order => order.Total > 0, "empty order") // async predicate guard
.Then(OrderDto.ToDto); // returns a value => maps
// ToResult: adapt a nullable-async lookup to a Result<T>, failing on null.
Task<Result<Customer>> customer =
_repo.FindCustomerAsync(id) // Task<Customer?>
.ToResult("customer not found");
Then disambiguation (bind-preferred): a delegate returning Result<TOut> (or Task<Result<TOut>>) binds/flattens — you never get a nested Result<Result<TOut>>; a delegate returning a plain value maps. When intent is unclear at the call site, reach for the explicit primitives Then delegates to — Map/Bind (sync) or ThenMap/ThenAsync (async).
ToResult precedence: an existing failure propagates first (its errors preserved); only a successful-but-null value is converted to failure(errorMessage).
Full API and patterns: docs/Result-Manual.md
More docs: docs/README.md
Note: Optional analyzers are available in IndQuestResults.Analyzers to guide async usage. Rule IQR0001 suggests using ResultAsync for async chaining and includes a one-click code fix.
Package Information
- Target Framework: .NET 10.0+
- Dependencies: none (zero external dependencies)
- Package ID: IndQuestResults
- License: MIT
- Coverage: 74.5% with comprehensive test suite
- Quality: 85%+ mutation testing score
Release Notes & Download
- Recommended:
Release/IndQuestResults.1.0.7.nupkg - Previous:
Release/IndQuestResults.1.0.5.nupkg,Release/IndQuestResults.1.0.4.nupkg,Release/IndQuestResults.1.0.3.nupkg,Release/IndQuestResults.1.0.2.nupkg,Release/IndQuestResults.1.0.1.nupkg - See CHANGELOG.md for details
Contributing
We welcome high-quality contributions! See CONTRIBUTING.md and CODE_OF_CONDUCT.md.
- 100% unit test coverage for new code
- Mutation testing score ≥ 85%
- Zero compilation warnings (warnings as errors)
- XML documentation for public APIs
- Benchmarks for performance-sensitive changes
License
This project is licensed under the MIT License - see the LICENSE file for details.
Support & Community
- Discussions: GitHub Discussions
- Issues: GitHub Issues
- Documentation: docs/Result-Manual.md
- Examples: Src/Code/samples/
Quality First: We maintain enterprise-grade standards because this library powers production applications. Every contribution makes the .NET ecosystem stronger!
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | 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. |
-
net10.0
- No dependencies.
-
net9.0
- No dependencies.
NuGet packages (1)
Showing the top 1 NuGet packages that depend on IndQuestResults:
| Package | Downloads |
|---|---|
|
IndFusion.Ember
🔥 IndFusion.Ember - The fusion point where real-time messages ignite and spread across any transport. Transport-agnostic real-time communication abstraction following Clean Architecture principles. Like a glowing ember spreading through systems: messages ignite (movement), propagate (tracking), and illuminate (display). Currently implemented with SignalR, but designed for universal transport fusion: WebSockets, gRPC, TCP, Azure Service Bus, AWS EventBridge, OPC-UA, and more. Perfect for dashboards, health monitoring, and real-time UI updates - universal infrastructure for all applications. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.4.1 | 92 | 6/18/2026 |
| 1.4.0 | 93 | 6/18/2026 |
| 1.3.0 | 666 | 12/1/2025 |
| 1.2.0 | 192 | 11/22/2025 |
| 1.1.0 | 188 | 11/7/2025 |
| 1.0.9 | 239 | 9/30/2025 |
| 1.0.8 | 217 | 9/28/2025 |
| 1.0.6 | 267 | 9/19/2025 |
| 1.0.5 | 274 | 9/19/2025 |
| 1.0.4 | 298 | 9/19/2025 |
| 1.0.3 | 335 | 9/19/2025 |
| 1.0.2 | 340 | 9/19/2025 |
| 1.0.1 | 345 | 9/18/2025 |
| 1.0.0 | 342 | 9/17/2025 |