Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 31 additions & 32 deletions src/Coderynx.Functional.WebApi/ResultExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ public static class ResultExtensions
/// <returns>An IResult representing the appropriate HTTP response based on the Result state.</returns>
public static IResult ToHttpResult(this Result result)
{
return ToHttpResultInternal(result, null);
return result.IsFailure ?
result.ToHttpErrorResult() :
ToHttpSuccessResult(result, null);
}

/// <summary>
Expand All @@ -29,9 +31,17 @@ public static IResult ToHttpResult(this Result result)
/// <returns>An IResult representing the appropriate HTTP response based on the Result state.</returns>
public static IResult ToHttpResult<TValue>(this Result<TValue> result)
{
return result.Success.Value is not null
? ToHttpResultInternal(result, result.Value)
: ToHttpResultInternal(result, null);
if (result.IsFailure)
{
return result.ToHttpErrorResult();
}

if (result.Success.Value is null)
{
return ToHttpSuccessResult(result, null);
}

return ToHttpSuccessResult(result, result.Value);
}

/// <summary>
Expand All @@ -43,45 +53,34 @@ public static IResult ToHttpResult<TValue>(this Result<TValue> result)
/// <returns>An IResult representing the appropriate HTTP response based on the Result state.</returns>
public static IResult ToHttpResult<TValue>(this Result<TValue> result, Func<TValue, object> transform)
{
if (result.IsFailure)
{
return result.ToHttpErrorResult();
}

if (result.Success.Value is null)
{
return ToHttpResultInternal(result, null);
return ToHttpSuccessResult(result, null);
}

var transformerResult = transform(result.Value);
return ToHttpResultInternal(result, transformerResult);
return ToHttpSuccessResult(result, transformerResult);
}

/// <summary>
/// Internal helper method to convert a Result to an HTTP response.
/// </summary>
/// <param name="result">The Result to convert.</param>
/// <param name="value">The value to include in the response (if applicable).</param>
/// <returns>An appropriate IResult based on the Result's Success or Error state.</returns>
private static IResult ToHttpResultInternal(Result result, object? value)
private static IResult ToHttpSuccessResult(Result result, object? value)
{
if (result.IsSuccess)
return result.Success.Kind switch
{
return result.Success.Kind switch
{
SuccessKind.Created => Microsoft.AspNetCore.Http.Results.Ok(value),
SuccessKind.Updated => Microsoft.AspNetCore.Http.Results.NoContent(),
SuccessKind.Deleted => Microsoft.AspNetCore.Http.Results.NoContent(),
SuccessKind.Found => Microsoft.AspNetCore.Http.Results.Ok(value),
SuccessKind.Accepted => Microsoft.AspNetCore.Http.Results.Accepted(),
_ => Microsoft.AspNetCore.Http.Results.Ok()
};
}

return result.ToProblem();
SuccessKind.Created => Microsoft.AspNetCore.Http.Results.Ok(value),
SuccessKind.Updated => Microsoft.AspNetCore.Http.Results.NoContent(),
SuccessKind.Deleted => Microsoft.AspNetCore.Http.Results.NoContent(),
SuccessKind.Found => Microsoft.AspNetCore.Http.Results.Ok(value),
SuccessKind.Accepted => Microsoft.AspNetCore.Http.Results.Accepted(),
_ => Microsoft.AspNetCore.Http.Results.Ok()
};
}

/// <summary>
/// Converts a failed Result to a ProblemDetails HTTP response.
/// </summary>
/// <param name="result">The Result containing an error.</param>
/// <returns>An IResult representing a problem details response based on the error information.</returns>
private static IResult ToProblem(this Result result)
private static IResult ToHttpErrorResult(this Result result)
{
var details = new ProblemDetails
{
Expand Down
2 changes: 1 addition & 1 deletion src/Coderynx.Functional.WebApi/version.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/main/src/NerdBank.GitVersioning/version.schema.json",
"version": "1.4.3",
"version": "1.4.4",
"publicReleaseRefSpec": [
"^refs/heads/main$"
],
Expand Down