Skip to content

badeend/Result

Repository files navigation

Result

For failures that are not exceptional.

Nuget


This packages provides a Result<TValue, TError> type for C#, spiritually similar to those available in Rust, Swift, Kotlin, C++ and basically every functional programming language under the sun.

Results are commonly used in scenarios where failure is anticipated can be handled gracefully by the caller. Examples include:

  • Input validation,
  • Parsing and conversion,
  • Invocation of external services,
  • Authentication and authorization,
  • and more ...

Result<TValue, TError> represents the result of a fallible operation as a first class value. A result can be in one of two states: "success" or "error". Both states have an associated payload of type TValue or TError respectively.


Documentation & more information at: https://badeend.github.io/Result/


Why does this package exist?

While there are many similar packages available, this one is designed to address specific needs that others did not fully meet:

  • No opinion on what is allowed to be an error. The error type (TError) is parameterized without constraints.
  • Focus on simplicity. This package is designed to provide just what's needed without introducing an extensive Functional Programming framework. It's about enhancing your existing C# code without overwhelming it with additional concepts.
  • For C# developers. The goal is to make it feel "native" to the language, designed with C# conventions in mind, and avoiding a paradigm shift in how C# code is written.

Shameless self-promotion

May I interest you in one of my other packages?

  • Badeend.ValueCollections: Low overhead immutable collection types with structural equality.
  • Badeend.EnumClass: Discriminated unions for C# with exhaustiveness checking.
  • Badeend.Result: For failures that are not exceptional: Result<T,E> for C#.
  • Badeend.Any: Holds any value of any type, without boxing small structs (up to 8 bytes).
  • Badeend.Nothing: If you want to use void as a type parameter, but C# won't let you.