< Summary

Information
Class: Enjoy.Domain.Shared.Results.Result<T>
Assembly: Enjoy.Domain
File(s): D:\Dotnet\Propuesta-trabajo\Enjoy Project\EnjoyApp\Enjoy\src\Enjoy.Domain\Shared\Results\ResultT.cs
Line coverage
100%
Covered lines: 43
Uncovered lines: 0
Coverable lines: 43
Total lines: 199
Line coverage: 100%
Branch coverage
100%
Covered branches: 20
Total branches: 20
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Errors()100%11100%
get_Value()100%22100%
get_IsSuccess()100%11100%
get_IsFailure()100%11100%
get_FirstError()100%22100%
.ctor()100%11100%
.ctor(...)100%22100%
.ctor(...)100%22100%
.ctor(...)100%22100%
OnSuccess(...)100%22100%
OnFailure(...)100%22100%
GetValueOrDefault(...)100%22100%
Success(...)100%11100%
Failure(...)100%11100%
Failure(...)100%11100%
Failure(...)100%11100%
Create(...)100%22100%
op_Implicit(...)100%11100%
op_Implicit(...)100%11100%
op_Implicit(...)100%11100%
op_Implicit(...)100%11100%
op_Implicit(...)100%11100%
op_Implicit(...)100%22100%

File(s)

D:\Dotnet\Propuesta-trabajo\Enjoy Project\EnjoyApp\Enjoy\src\Enjoy.Domain\Shared\Results\ResultT.cs

#LineLine coverage
 1using Enjoy.Domain.Shared.Errors;
 2using Enjoy.Domain.Shared.Extensions;
 3
 4namespace Enjoy.Domain.Shared.Results;
 5
 6/// <summary>
 7/// Representa el resultado de una operación que puede ser exitosa o contener uno o más errores,
 8/// con un valor resultante.
 9/// <para>Implementa <see cref="IResult{T}"/>.</para>
 10/// </summary>
 11/// <typeparam name="TValue">El tipo del valor resultante.</typeparam>
 12public readonly record struct Result<TValue> : IResult<TValue>
 13{
 14    /// <summary>
 15    /// El valor resultante de la operación.
 16    /// </summary>
 17    private readonly TValue? _value;
 18
 19    /// <summary>
 20    /// Obtiene la colección de errores asociados con el resultado, si los hay.
 21    /// </summary>
 153322    public ICollection<Error> Errors { get; init; }
 23
 24    /// <summary>
 25    /// Obtiene el valor resultante de la operación si es exitosa; de lo contrario, lanza una excepción.
 26    /// </summary>
 27    /// <exception cref="InvalidOperationException">Se lanza cuando se intenta acceder al valor de un resultado fallido.
 39928    public TValue Value => IsSuccess ? _value! : throw new InvalidOperationException("The value of a failure result cann
 29
 30    /// <summary>
 31    /// Indica si el resultado es exitoso.
 32    /// </summary>
 89433    public bool IsSuccess => Errors.IsEmpty();
 34
 35    /// <summary>
 36    /// Indica si el resultado es fallido.
 37    /// </summary>
 44138    public bool IsFailure => !IsSuccess;
 39
 40    /// <summary>
 41    /// Obtiene el primer error en la colección de errores.
 42    /// </summary>
 4243    public Error FirstError => IsFailure ? Errors.First() : Error.None;
 44
 45    /// <summary>
 46    /// Constructor por defecto que lanza una excepción.
 47    /// Use los métodos estáticos para instanciar <see cref="Result{TValue}"/>:
 48    /// <list type="bullet">
 49    /// <item><description><see cref="Success(TValue)"/> para crear un resultado exitoso con un valor.</description></it
 50    /// <item><description><see cref="Failure(Error)"/> para crear un resultado fallido con un error.</description></ite
 51    /// <item><description><see cref="Failure(Exception)"/> para crear un resultado fallido con una excepción.</descript
 52    /// <item><description><see cref="Failure(ICollection{Error})"/> para crear un resultado fallido con una colección d
 53    /// <item><description><see cref="Create(TValue?)"/> para crear un resultado dependiendo si el valor es nulo.</descr
 54    /// </list></summary>
 55    /// <exception cref="InvalidOperationException">Se lanza cuando se intenta usar el constructor sin parámetros.</exce
 56    public Result()
 157    {
 158        throw new InvalidOperationException("Use the static methods Success, Failure or Create to instantiate Result.");
 59    }
 60
 61    /// <summary>
 62    /// Inicializa una nueva instancia de la estructura <see cref="Result{TValue}"/> con el valor especificado.
 63    /// </summary>
 64    /// <param name="value">El valor resultante de la operación.</param>
 65    private Result(TValue value)
 42066    {
 42067        Errors = value is not null ? Error.EmptyErrors : [Error.NullValue];
 42068        _value = value;
 42069    }
 70
 71    /// <summary>
 72    /// Inicializa una nueva instancia de la estructura <see cref="Result{TValue}"/> con el error especificado.
 73    /// </summary>
 74    /// <param name="error">El error resultante de la operación.</param>
 75    private Result(Error error)
 7176    {
 7177        Errors = !error.Equals(Error.None) ? [error] : [Error.NullValue];
 7178    }
 79
 80    /// <summary>
 81    /// Inicializa una nueva instancia de la estructura <see cref="Result{TValue}"/> con la colección de errores especif
 82    /// </summary>
 83    /// <param name="errors">La colección de errores resultantes de la operación.</param>
 84    private Result(ICollection<Error> errors)
 4485    {
 86        //Evaluar cuando la colección tiene un error y es None o todos son None
 4487        Errors = !errors.IsNullOrEmpty() ? errors : [Error.NullValue];
 4488    }
 89
 90    /// <summary>
 91    /// Ejecuta una acción si el resultado es exitoso y devuelve el resultado.
 92    /// </summary>
 93    /// <param name="action">La acción a ejecutar si el resultado es exitoso.</param>
 94    /// <returns>La instancia actual de <see cref="Result{TValue}"/>.</returns>
 95    public Result<TValue> OnSuccess(Action action)
 296    {
 297        if (IsSuccess)
 198        {
 199            action();
 1100        }
 2101        return this;
 2102    }
 103
 104    /// <summary>
 105    /// Ejecuta una acción si el resultado es fallido y devuelve el resultado.
 106    /// </summary>
 107    /// <param name="action">La acción a ejecutar si el resultado es fallido.</param>
 108    /// <returns>La instancia actual de <see cref="Result{TValue}"/>.</returns>
 109    public Result<TValue> OnFailure(Action action)
 2110    {
 2111        if (IsFailure)
 1112        {
 1113            action();
 1114        }
 2115        return this;
 2116    }
 117
 118    /// <summary>
 119    /// Obtiene el valor del resultado si es exitoso; de lo contrario, devuelve un valor predeterminado.
 120    /// </summary>
 121    /// <param name="defaultValue">El valor predeterminado a devolver si el resultado es fallido.</param>
 122    /// <returns>El valor del resultado si es exitoso; de lo contrario, el valor predeterminado.</returns>
 2123    public TValue? GetValueOrDefault(TValue? defaultValue = default) => IsSuccess ? _value : defaultValue;
 124
 125    /// <summary>
 126    /// Crea una nueva instancia de la estructura <see cref="Result{TValue}"/> con el valor especificado.
 127    /// </summary>
 128    /// <param name="value">El valor resultante de la operación.</param>
 129    /// <returns>Una nueva instancia de la estructura <see cref="Result{TValue}"/>.</returns>
 416130    public static Result<TValue> Success(TValue value) => new(value);
 131
 132    /// <summary>
 133    /// Crea una nueva instancia de la estructura <see cref="Result{TValue}"/> con el error especificado.
 134    /// </summary>
 135    /// <param name="error">El error resultante de la operación.</param>
 136    /// <returns>Una nueva instancia de la estructura <see cref="Result{TValue}"/>.</returns>
 67137    public static Result<TValue> Failure(Error error) => new(error);
 138
 139    /// <summary>
 140    /// Crea una nueva instancia de la estructura <see cref="Result{TValue}"/> con la excepción especificada,
 141    /// utilizando el tipo de la excepción como código de error y el mensaje de la excepción como descripción.
 142    /// </summary>
 143    /// <param name="exception">La excepción resultante de la operación.</param>
 144    /// <returns>Una nueva instancia de la estructura <see cref="Result{TValue}"/>.</returns>
 145    public static Result<TValue> Failure(Exception exception) =>
 1146        Failure(Error.Exception(exception.GetType().Name, exception.Message));
 147
 148    /// <summary>
 149    /// Crea una nueva instancia de la estructura <see cref="Result{TValue}"/> con la colección de errores especificada.
 150    /// </summary>
 151    /// <param name="errors">La colección de errores resultantes de la operación.</param>
 152    /// <returns>Una nueva instancia de la estructura <see cref="Result{TValue}"/>.</returns>
 34153    public static Result<TValue> Failure(ICollection<Error> errors) => new(errors);
 154
 155    /// <summary>
 156    /// Crea una nueva instancia de la estructura <see cref="Result{TValue}"/> con el valor especificado,
 157    /// o un resultado fallido si el valor es nulo.
 158    /// </summary>
 159    /// <param name="value">El valor resultante de la operación.</param>
 160    /// <returns>Una nueva instancia de la estructura <see cref="Result{TValue}"/>.</returns>
 4161    public static Result<TValue> Create(TValue? value) => value is not null ? Success(value) : Failure(Error.NullValue);
 162
 163    /// <summary>
 164    /// Define una conversión implícita de un valor del tipo <typeparamref name="TValue"/> a una instancia de <see cref=
 165    /// </summary>
 166    /// <param name="value">El valor resultante de la operación.</param>
 2167    public static implicit operator Result<TValue>(TValue value) => new(value);
 168
 169    /// <summary>
 170    /// Define una conversión implícita de un <see cref="Error"/> a una instancia de <see cref="Result{TValue}"/>.
 171    /// </summary>
 172    /// <param name="error">El error resultante de la operación.</param>
 2173    public static implicit operator Result<TValue>(Error error) => new(error);
 174
 175    /// <summary>
 176    /// Define una conversión implícita de una lista de errores a una instancia de <see cref="Result{TValue}"/>.
 177    /// </summary>
 178    /// <param name="errors">La lista de errores resultantes de la operación.</param>
 3179    public static implicit operator Result<TValue>(List<Error> errors) => new(errors);
 180
 181    /// <summary>
 182    /// Define una conversión implícita de un conjunto de errores a una instancia de <see cref="Result{TValue}"/>.
 183    /// </summary>
 184    /// <param name="errors">El conjunto de errores resultantes de la operación.</param>
 2185    public static implicit operator Result<TValue>(HashSet<Error> errors) => new(errors);
 186
 187    /// <summary>
 188    /// Define una conversión implícita de un arreglo de errores a una instancia de <see cref="Result{TValue}"/>.
 189    /// </summary>
 190    /// <param name="errors">El arreglo de errores resultantes de la operación.</param>
 2191    public static implicit operator Result<TValue>(Error[] errors) => new(errors);
 192
 193    /// <summary>
 194    /// Define una conversión explícita de una instancia de <see cref="Result{TValue}"/> a una instancia de <see cref="R
 195    /// </summary>
 196    /// <param name="result">El resultado que contiene el estado de éxito o fallo y los errores correspondientes.</param
 197    /// <returns>Una instancia de <see cref="Result"/>.</returns>
 2198    public static implicit operator Result(Result<TValue> result) => result.IsSuccess ? Result.Success() : Result.Failur
 199}