Table of Contents

Class HttpResponseExtensions

Namespace
Trellis.Asp
Assembly
Trellis.Asp.dll

The single Trellis verb for converting Result<TValue> / WriteOutcome<T> / Page<T> values to ASP.NET Core HTTP responses. Works in both Minimal API endpoints and MVC controllers (.NET 7+ executes IResult natively in MVC). For typed ActionResult<T> signatures, chain AsActionResult<T>(IResult).

public static class HttpResponseExtensions
Inheritance
HttpResponseExtensions
Inherited Members

Remarks

Configure protocol semantics via the optional fluent HttpResponseOptionsBuilder<TDomain>: WithETag, WithLastModified, Vary, CreatedAtRoute, EvaluatePreconditions, HonorPrefer, etc. All selectors run against the domain value; the response body may be projected separately via the body overload.

No-payload success: Result<Unit> is rendered as 204 No Content (with HonorPrefer/Vary/ETag headers still applied).

Methods

ToHttpResponse(Error, Action<HttpResponseOptionsBuilder>?)

Maps a standalone Error to a Problem Details HTTP response. Useful for endpoints that produce a deterministic error without a Result<TValue> pipeline (e.g. diagnostic / fault demonstration endpoints).

public static IResult ToHttpResponse(this Error error, Action<HttpResponseOptionsBuilder>? configure = null)

Parameters

error Error
configure Action<HttpResponseOptionsBuilder>

Returns

IResult

ToHttpResponseAsync<T>(Task<Result<WriteOutcome<T>>>, Action<HttpResponseOptionsBuilder<T>>?)

Async Task overload.

public static Task<IResult> ToHttpResponseAsync<T>(this Task<Result<WriteOutcome<T>>> resultTask, Action<HttpResponseOptionsBuilder<T>>? configure = null)

Parameters

resultTask Task<Result<WriteOutcome<T>>>
configure Action<HttpResponseOptionsBuilder<T>>

Returns

Task<IResult>

Type Parameters

T

ToHttpResponseAsync<T>(Task<Result<T>>, Action<HttpResponseOptionsBuilder<T>>?)

Async Task overload.

public static Task<IResult> ToHttpResponseAsync<T>(this Task<Result<T>> resultTask, Action<HttpResponseOptionsBuilder<T>>? configure = null)

Parameters

resultTask Task<Result<T>>
configure Action<HttpResponseOptionsBuilder<T>>

Returns

Task<IResult>

Type Parameters

T

ToHttpResponseAsync<T>(ValueTask<Result<WriteOutcome<T>>>, Action<HttpResponseOptionsBuilder<T>>?)

Async ValueTask overload.

public static ValueTask<IResult> ToHttpResponseAsync<T>(this ValueTask<Result<WriteOutcome<T>>> resultTask, Action<HttpResponseOptionsBuilder<T>>? configure = null)

Parameters

resultTask ValueTask<Result<WriteOutcome<T>>>
configure Action<HttpResponseOptionsBuilder<T>>

Returns

ValueTask<IResult>

Type Parameters

T

ToHttpResponseAsync<T>(ValueTask<Result<T>>, Action<HttpResponseOptionsBuilder<T>>?)

Async ValueTask overload.

public static ValueTask<IResult> ToHttpResponseAsync<T>(this ValueTask<Result<T>> resultTask, Action<HttpResponseOptionsBuilder<T>>? configure = null)

Parameters

resultTask ValueTask<Result<T>>
configure Action<HttpResponseOptionsBuilder<T>>

Returns

ValueTask<IResult>

Type Parameters

T

ToHttpResponseAsync<T, TBody>(Task<Result<Page<T>>>, Func<Cursor, int, string>, Func<T, TBody>, Action<HttpResponseOptionsBuilder<Page<T>>>?)

Async Task overload.

public static Task<IResult> ToHttpResponseAsync<T, TBody>(this Task<Result<Page<T>>> resultTask, Func<Cursor, int, string> nextUrlBuilder, Func<T, TBody> body, Action<HttpResponseOptionsBuilder<Page<T>>>? configure = null)

Parameters

resultTask Task<Result<Page<T>>>
nextUrlBuilder Func<Cursor, int, string>
body Func<T, TBody>
configure Action<HttpResponseOptionsBuilder<Page<T>>>

Returns

Task<IResult>

Type Parameters

T
TBody

ToHttpResponseAsync<T, TBody>(Task<Result<Page<T>>>, Func<Cursor, PageDirection, int, string>, Func<T, TBody>, Action<HttpResponseOptionsBuilder<Page<T>>>?)

Async Task overload with direction-aware pagination URLs.

public static Task<IResult> ToHttpResponseAsync<T, TBody>(this Task<Result<Page<T>>> resultTask, Func<Cursor, PageDirection, int, string> urlBuilder, Func<T, TBody> body, Action<HttpResponseOptionsBuilder<Page<T>>>? configure = null)

Parameters

resultTask Task<Result<Page<T>>>
urlBuilder Func<Cursor, PageDirection, int, string>
body Func<T, TBody>
configure Action<HttpResponseOptionsBuilder<Page<T>>>

Returns

Task<IResult>

Type Parameters

T
TBody

ToHttpResponseAsync<TDomain, TBody>(Task<Result<WriteOutcome<TDomain>>>, Func<TDomain, TBody>, Action<HttpResponseOptionsBuilder<TDomain>>?)

Async Task overload with body projection.

public static Task<IResult> ToHttpResponseAsync<TDomain, TBody>(this Task<Result<WriteOutcome<TDomain>>> resultTask, Func<TDomain, TBody> body, Action<HttpResponseOptionsBuilder<TDomain>>? configure = null)

Parameters

resultTask Task<Result<WriteOutcome<TDomain>>>
body Func<TDomain, TBody>
configure Action<HttpResponseOptionsBuilder<TDomain>>

Returns

Task<IResult>

Type Parameters

TDomain
TBody

ToHttpResponseAsync<TDomain, TBody>(Task<Result<TDomain>>, Func<TDomain, TBody>, Action<HttpResponseOptionsBuilder<TDomain>>?)

Async Task overload with body projection.

public static Task<IResult> ToHttpResponseAsync<TDomain, TBody>(this Task<Result<TDomain>> resultTask, Func<TDomain, TBody> body, Action<HttpResponseOptionsBuilder<TDomain>>? configure = null)

Parameters

resultTask Task<Result<TDomain>>
body Func<TDomain, TBody>
configure Action<HttpResponseOptionsBuilder<TDomain>>

Returns

Task<IResult>

Type Parameters

TDomain
TBody

ToHttpResponseAsync<T, TBody>(ValueTask<Result<Page<T>>>, Func<Cursor, int, string>, Func<T, TBody>, Action<HttpResponseOptionsBuilder<Page<T>>>?)

Async ValueTask overload.

public static ValueTask<IResult> ToHttpResponseAsync<T, TBody>(this ValueTask<Result<Page<T>>> resultTask, Func<Cursor, int, string> nextUrlBuilder, Func<T, TBody> body, Action<HttpResponseOptionsBuilder<Page<T>>>? configure = null)

Parameters

resultTask ValueTask<Result<Page<T>>>
nextUrlBuilder Func<Cursor, int, string>
body Func<T, TBody>
configure Action<HttpResponseOptionsBuilder<Page<T>>>

Returns

ValueTask<IResult>

Type Parameters

T
TBody

ToHttpResponseAsync<T, TBody>(ValueTask<Result<Page<T>>>, Func<Cursor, PageDirection, int, string>, Func<T, TBody>, Action<HttpResponseOptionsBuilder<Page<T>>>?)

Async ValueTask overload with direction-aware pagination URLs.

public static ValueTask<IResult> ToHttpResponseAsync<T, TBody>(this ValueTask<Result<Page<T>>> resultTask, Func<Cursor, PageDirection, int, string> urlBuilder, Func<T, TBody> body, Action<HttpResponseOptionsBuilder<Page<T>>>? configure = null)

Parameters

resultTask ValueTask<Result<Page<T>>>
urlBuilder Func<Cursor, PageDirection, int, string>
body Func<T, TBody>
configure Action<HttpResponseOptionsBuilder<Page<T>>>

Returns

ValueTask<IResult>

Type Parameters

T
TBody

ToHttpResponseAsync<TDomain, TBody>(ValueTask<Result<WriteOutcome<TDomain>>>, Func<TDomain, TBody>, Action<HttpResponseOptionsBuilder<TDomain>>?)

Async ValueTask overload with body projection.

public static ValueTask<IResult> ToHttpResponseAsync<TDomain, TBody>(this ValueTask<Result<WriteOutcome<TDomain>>> resultTask, Func<TDomain, TBody> body, Action<HttpResponseOptionsBuilder<TDomain>>? configure = null)

Parameters

resultTask ValueTask<Result<WriteOutcome<TDomain>>>
body Func<TDomain, TBody>
configure Action<HttpResponseOptionsBuilder<TDomain>>

Returns

ValueTask<IResult>

Type Parameters

TDomain
TBody

ToHttpResponseAsync<TDomain, TBody>(ValueTask<Result<TDomain>>, Func<TDomain, TBody>, Action<HttpResponseOptionsBuilder<TDomain>>?)

Async ValueTask overload with body projection.

public static ValueTask<IResult> ToHttpResponseAsync<TDomain, TBody>(this ValueTask<Result<TDomain>> resultTask, Func<TDomain, TBody> body, Action<HttpResponseOptionsBuilder<TDomain>>? configure = null)

Parameters

resultTask ValueTask<Result<TDomain>>
body Func<TDomain, TBody>
configure Action<HttpResponseOptionsBuilder<TDomain>>

Returns

ValueTask<IResult>

Type Parameters

TDomain
TBody

ToHttpResponse<T>(Result<WriteOutcome<T>>, Action<HttpResponseOptionsBuilder<T>>?)

Maps a Result<TValue> of WriteOutcome<T> to an HTTP response with status driven by the outcome variant per RFC 9110: Created -> 201 + Location, Updated -> 200 (or 204 with Prefer: return=minimal), UpdatedNoContent -> 204, Accepted -> 202.

public static IResult ToHttpResponse<T>(this Result<WriteOutcome<T>> result, Action<HttpResponseOptionsBuilder<T>>? configure = null)

Parameters

result Result<WriteOutcome<T>>
configure Action<HttpResponseOptionsBuilder<T>>

Returns

IResult

Type Parameters

T

ToHttpResponse<T>(Result<T>, Action<HttpResponseOptionsBuilder<T>>?)

Maps a Result<TValue> to a 200 OK (success, body = T) or Problem Details (failure). When configured via Created(string) or CreatedAtRoute(string, Func<TDomain, RouteValueDictionary>), returns 201 Created with a Location header.

public static IResult ToHttpResponse<T>(this Result<T> result, Action<HttpResponseOptionsBuilder<T>>? configure = null)

Parameters

result Result<T>
configure Action<HttpResponseOptionsBuilder<T>>

Returns

IResult

Type Parameters

T

ToHttpResponse<T, TBody>(Result<Page<T>>, Func<Cursor, int, string>, Func<T, TBody>, Action<HttpResponseOptionsBuilder<Page<T>>>?)

Maps a Result<TValue> of Page<T> to an HTTP response with the paginated envelope and an RFC 8288 Link header. Uses the same nextUrlBuilder for both next and previous cursors. Use the direction-aware overload when the links require different query parameters.

public static IResult ToHttpResponse<T, TBody>(this Result<Page<T>> result, Func<Cursor, int, string> nextUrlBuilder, Func<T, TBody> body, Action<HttpResponseOptionsBuilder<Page<T>>>? configure = null)

Parameters

result Result<Page<T>>
nextUrlBuilder Func<Cursor, int, string>
body Func<T, TBody>
configure Action<HttpResponseOptionsBuilder<Page<T>>>

Returns

IResult

Type Parameters

T
TBody

ToHttpResponse<T, TBody>(Result<Page<T>>, Func<Cursor, PageDirection, int, string>, Func<T, TBody>, Action<HttpResponseOptionsBuilder<Page<T>>>?)

Maps a Result<TValue> of Page<T> to a paginated envelope and matching RFC 8288 Link header using direction-aware URLs.

public static IResult ToHttpResponse<T, TBody>(this Result<Page<T>> result, Func<Cursor, PageDirection, int, string> urlBuilder, Func<T, TBody> body, Action<HttpResponseOptionsBuilder<Page<T>>>? configure = null)

Parameters

result Result<Page<T>>

The page result to map.

urlBuilder Func<Cursor, PageDirection, int, string>

Builds an absolute URL from the cursor, link direction, and applied limit.

body Func<T, TBody>

Projects each domain item to the response body.

configure Action<HttpResponseOptionsBuilder<Page<T>>>

Optional response configuration.

Returns

IResult

The paginated response, or the mapped error response on failure.

Type Parameters

T
TBody

ToHttpResponse<TDomain, TBody>(Result<WriteOutcome<TDomain>>, Func<TDomain, TBody>, Action<HttpResponseOptionsBuilder<TDomain>>?)

Maps a Result<TValue> of WriteOutcome<T> with body projection.

public static IResult ToHttpResponse<TDomain, TBody>(this Result<WriteOutcome<TDomain>> result, Func<TDomain, TBody> body, Action<HttpResponseOptionsBuilder<TDomain>>? configure = null)

Parameters

result Result<WriteOutcome<TDomain>>
body Func<TDomain, TBody>
configure Action<HttpResponseOptionsBuilder<TDomain>>

Returns

IResult

Type Parameters

TDomain
TBody

ToHttpResponse<TDomain, TBody>(Result<TDomain>, Func<TDomain, TBody>, Action<HttpResponseOptionsBuilder<TDomain>>?)

Maps a Result<TValue> to an HTTP response, projecting the body via body. Selectors in the options builder still run against the domain value.

public static IResult ToHttpResponse<TDomain, TBody>(this Result<TDomain> result, Func<TDomain, TBody> body, Action<HttpResponseOptionsBuilder<TDomain>>? configure = null)

Parameters

result Result<TDomain>
body Func<TDomain, TBody>
configure Action<HttpResponseOptionsBuilder<TDomain>>

Returns

IResult

Type Parameters

TDomain
TBody