< Summary

Information
Class: Enjoy.Domain.Shared.Results.Result
Assembly: Enjoy.Domain
File(s): D:\Dotnet\Propuesta-trabajo\Enjoy Project\EnjoyApp\Enjoy\src\Enjoy.Domain\Shared\Results\Result.cs
Line coverage
100%
Covered lines: 49
Uncovered lines: 0
Coverable lines: 49
Total lines: 188
Line coverage: 100%
Branch coverage
100%
Covered branches: 22
Total branches: 22
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_FirstError()100%22100%
get_IsSuccess()100%11100%
get_IsFailure()100%11100%
.ctor()100%11100%
.ctor(...)100%88100%
.ctor(...)100%88100%
OnSuccess(...)100%22100%
OnFailure(...)100%22100%
Success()100%11100%
Failure(...)100%11100%
Failure(...)100%11100%
Failure(...)100%11100%
Success(...)100%11100%
Failure(...)100%11100%
Failure(...)100%11100%
Failure(...)100%11100%
Create(...)100%11100%

File(s)

D:\Dotnet\Propuesta-trabajo\Enjoy Project\EnjoyApp\Enjoy\src\Enjoy.Domain\Shared\Results\Result.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 un error.
 8/// Implementa <see cref="IResult"/>.
 9/// </summary>
 10public readonly record struct Result : IResult
 11{
 12    /// <summary>
 13    /// Colección de errores asociados con el resultado.
 14    /// </summary>
 8815    public ICollection<Error> Errors { get; init; }
 16
 17    /// <summary>
 18    /// El primer error en la colección de errores, o un error vacío si la colección está vacía.
 19    /// </summary>
 1120    public Error FirstError => IsSuccess ? Error.None : Errors.First();
 21
 22    /// <summary>
 23    /// Indica si el resultado es exitoso.
 24    /// </summary>
 12925    public bool IsSuccess { get; init; }
 26
 27    /// <summary>
 28    /// Indica si el resultado es fallido.
 29    /// </summary>
 1930    public bool IsFailure => !IsSuccess;
 31
 32    /// <summary>
 33    /// Constructor por defecto que lanza una excepción.
 34    /// Use los métodos estáticos para instanciar <see cref="Result"/>:
 35    /// <list type="bullet">
 36    /// <item><description><see cref="Success()"/> para crear un resultado exitoso.</description></item>
 37    /// <item><description><see cref="Failure(Error)"/> para crear un resultado fallido con un error.</description></ite
 38    /// <item><description><see cref="Failure(Exception)"/> para crear un resultado fallido con una excepción.</descript
 39    /// </list>
 40    /// </summary>
 41    /// <exception cref="InvalidOperationException">Se lanza cuando se intenta usar el constructor sin parámetros.</exce
 42    public Result()
 143    {
 144        throw new InvalidOperationException("Use the static methods Success or Failure to instantiate Result.");
 45    }
 46
 47    /// <summary>
 48    /// Inicializa una nueva instancia de la estructura <see cref="Result"/> con el estado de éxito y la colección de er
 49    /// </summary>
 50    /// <param name="isSuccess">Indica si la operación fue exitosa.</param>
 51    /// <param name="errors">La colección de errores asociados con el resultado.</param>
 52    /// <exception cref="InvalidOperationException">Se lanza si el estado de éxito no concuerda con la colección de erro
 53    private Result(bool isSuccess, ICollection<Error> errors)
 6354    {
 6355        if (isSuccess && !errors.IsEmpty())
 156        {
 157            throw new InvalidOperationException();
 58        }
 59
 6260        if (!isSuccess && errors.IsEmpty())
 161        {
 162            throw new InvalidOperationException();
 63        }
 64
 6165        IsSuccess = isSuccess;
 6166        Errors = errors;
 6167    }
 68
 69    /// <summary>
 70    /// Inicializa una nueva instancia de la estructura <see cref="Result"/> con el estado de éxito y el error especific
 71    /// </summary>
 72    /// <param name="isSuccess">Indica si la operación fue exitosa.</param>
 73    /// <param name="error">El error asociado con el resultado, si lo hay.</param>
 74    /// <exception cref="InvalidOperationException">Se lanza si el estado de éxito no concuerda con el error.</exception
 75    private Result(bool isSuccess, Error error)
 1276    {
 1277        if (isSuccess && error != Error.None)
 178        {
 179            throw new InvalidOperationException();
 80        }
 81
 1182        if (!isSuccess && error == Error.None)
 183        {
 184            throw new InvalidOperationException();
 85        }
 86
 1087        IsSuccess = isSuccess;
 1088        Errors = [error];
 1089    }
 90
 91    /// <summary>
 92    /// Ejecuta una acción si el resultado es exitoso y devuelve el resultado.
 93    /// </summary>
 94    /// <param name="action">La acción a ejecutar si el resultado es exitoso.</param>
 95    /// <returns>La instancia actual de <see cref="Result"/>.</returns>
 96    public Result OnSuccess(Action action)
 297    {
 298        if (IsSuccess)
 199        {
 1100            action();
 1101        }
 2102        return this;
 2103    }
 104
 105    /// <summary>
 106    /// Ejecuta una acción si el resultado es fallido y devuelve el resultado.
 107    /// </summary>
 108    /// <param name="action">La acción a ejecutar si el resultado es fallido.</param>
 109    /// <returns>La instancia actual de <see cref="Result"/>.</returns>
 110    public Result OnFailure(Action action)
 2111    {
 2112        if (IsFailure)
 1113        {
 1114            action();
 1115        }
 2116        return this;
 2117    }
 118
 119    /// <summary>
 120    /// Crea un resultado exitoso sin valor asociado.
 121    /// </summary>
 122    /// <returns>Una nueva instancia de la estructura <see cref="Result"/> que representa un resultado exitoso.</returns
 45123    public static Result Success() => new(true, Error.EmptyErrors);
 124
 125    /// <summary>
 126    /// Crea un resultado fallido con el error especificado.
 127    /// </summary>
 128    /// <param name="error">El error asociado con el resultado.</param>
 129    /// <returns>Una nueva instancia de la estructura <see cref="Result"/> que representa un resultado fallido.</returns
 8130    public static Result Failure(Error error) => new(false, error);
 131
 132    /// <summary>
 133    /// Crea un resultado fallido con la colección de errores especificada.
 134    /// </summary>
 135    /// <param name="errors">La colección de errores resultantes de la operación.</param>
 136    /// <returns>Una nueva instancia de la estructura <see cref="Result"/> que representa un resultado fallido.</returns
 14137    public static Result Failure(ICollection<Error> errors) => new(false, errors);
 138
 139    /// <summary>
 140    /// Crea un resultado fallido 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"/> que representa un resultado fallido.</returns
 1145    public static Result Failure(Exception exception) => Failure(Error.Exception(exception.GetType().Name, exception.Mes
 146
 147    /// <summary>
 148    /// Crea un resultado exitoso con el valor especificado.
 149    /// </summary>
 150    /// <typeparam name="TValue">El tipo del valor resultante de la operación.</typeparam>
 151    /// <param name="value">El valor resultante de la operación.</param>
 152    /// <returns>Una nueva instancia de la estructura <see cref="Result{TValue}"/>.</returns>
 1153    public static Result<TValue> Success<TValue>(TValue value) => Result<TValue>.Success(value);
 154
 155    /// <summary>
 156    /// Crea un resultado fallido con el error especificado.
 157    /// </summary>
 158    /// <typeparam name="TValue">El tipo del valor resultante de la operación.</typeparam>
 159    /// <param name="error">El error resultante de la operación.</param>
 160    /// <returns>Una nueva instancia de la estructura <see cref="Result{TValue}"/>.</returns>
 1161    public static Result<TValue> Failure<TValue>(Error error) => Result<TValue>.Failure(error);
 162
 163    /// <summary>
 164    /// Crea un resultado fallido con la excepción especificada,
 165    /// utilizando el tipo de la excepción como código de error y el mensaje de la excepción como descripción.
 166    /// </summary>
 167    /// <typeparam name="TValue">El tipo del valor resultante de la operación.</typeparam>
 168    /// <param name="exception">La excepción resultante de la operación.</param>
 169    /// <returns>Una nueva instancia de la estructura <see cref="Result{TValue}"/>.</returns>
 170    public static Result<TValue> Failure<TValue>(Exception exception) =>
 1171        Result<TValue>.Failure(Error.Exception(exception.GetType().Name, exception.Message));
 172
 173    /// <summary>
 174    /// Crea un resultado fallido con la colección de errores especificada.
 175    /// </summary>
 176    /// <typeparam name="TValue">El tipo del valor resultante de la operación.</typeparam>
 177    /// <param name="errors">La colección de errores resultantes de la operación.</param>
 178    /// <returns>Una nueva instancia de la estructura <see cref="Result{TValue}"/>.</returns>
 1179    public static Result<TValue> Failure<TValue>(ICollection<Error> errors) => Result<TValue>.Failure(errors);
 180
 181    /// <summary>
 182    /// Crea un resultado basado en el valor especificado.
 183    /// </summary>
 184    /// <typeparam name="TValue">El tipo del valor resultante de la operación.</typeparam>
 185    /// <param name="value">El valor resultante de la operación.</param>
 186    /// <returns>Una nueva instancia de la estructura <see cref="Result{TValue}"/>.</returns>
 2187    public static Result<TValue> Create<TValue>(TValue? value) => Result<TValue>.Create(value);
 188}