Skip to content

Resultados y composición

Elegir un tipo

TipoRepresenta
Result<TValue>Éxito con un valor no nulo o fallo
ResultContrato común de estado y consulta de errores
VoidResultResultado de una operación sin valor de retorno
EnumerableResult<TItem>Resultado que se puede enumerar
AsyncEnumerableResult<TItem>Resultado que se puede recorrer con await foreach
StreamResult<TItem>Suscripción a una fuente de elementos

Construcción y lectura

csharp
using Greencore.Platform.Errors;
using Greencore.Platform.Results;

var correcto = Result<int>.Ok(42);
var fallido = Result<int>.Fail(new TextError("No se pudo calcular."));
var noEncontrado = Result<int>.Fail<NotFoundProcessError>();
Result guardado = VoidResult.Ok();

if (correcto.TryGetValue(out var valor))
    Console.WriteLine(valor);

Console.WriteLine(fallido.ValueOrDefault(-1)); // -1

Value lanza InvalidOperationException si el resultado es un fallo. Error hace lo mismo si el resultado es correcto. Ok(null) no es un éxito válido: el valor está restringido a notnull y se comprueba en ejecución.

Transformar, encadenar y responder

Importa Greencore.Platform.Results.Extensions.

OperaciónUso
MapTransformar un valor correcto en otro valor
BindEncadenar una función que devuelve otro resultado
MatchResolver explícitamente las ramas de éxito y error
TapEjecutar un efecto en caso de éxito, conservando el resultado
TapErrorEjecutar un efecto en caso de fallo
MapAsync, BindAsync, MatchAsyncUsar funciones que devuelven tareas
csharp
using Greencore.Platform.Errors;
using Greencore.Platform.Results;
using Greencore.Platform.Results.Extensions;

var resultado = Result<int>.Ok(20)
    .Map(valor => valor + 1)
    .Bind(valor => valor > 0
        ? Result<string>.Ok($"Pedido {valor}")
        : Result<string>.Fail(new TextError("Identificador inválido.")))
    .Tap(texto => Console.WriteLine($"Preparado: {texto}"));

Console.WriteLine(resultado.Match(texto => texto, error => error.Text));

Un fallo evita ejecutar la transformación o siguiente operación. Las excepciones lanzadas por tus funciones se propagan: estas extensiones no son una captura automática de excepciones.

Tipos especializados

El namespace Greencore.Platform.Results.Specialized contiene IntResult, LongResult, StringResult, BooleanResult, DecimalResult, DoubleResult, DateTimeResult, GuidResult, ArrayResult<TItem> y ListResult<TItem>.

Estos tipos ofrecen conversiones de conveniencia. Una conversión que extrae el valor puede lanzar si el resultado es un error; prefiere TryGetValue o Match en los límites de tu aplicación. La cobertura del analizador está descrita en estado de la versión.

Uso personal limitado. Uso comercial sujeto a autorización escrita.