using SharedKernel.Results;

namespace Web.Api.Extensions;

public static class ResultExtensions
{
    // Result 객체에 값이 없는 경우, onSuccess는 매개변수 없이 호출되고, onFailure는 Result 객체를 매개변수로 받아 호출됩니다.
    public static TOut Match<TOut>(
        this Result result,
        Func<TOut> onSuccess,
        Func<Result, TOut> onFailure
    ) {
        return result.IsSuccess ? onSuccess() : onFailure(result);
    }

    // Result<TIn> 객체에 값이 있는 경우, onSuccess는 매개변수로 TIn 값을 받아 호출되고, onFailure는 Result<TIn> 객체를 매개변수로 받아 호출됩니다.
    public static TOut Match<TIn, TOut>(
        this Result<TIn> result,
        Func<TIn, TOut> onSuccess,
        Func<Result<TIn>, TOut> onFailure
    ) {
        return result.IsSuccess ? onSuccess(result.Value) : onFailure(result);
    }
}