< Summary

Information
Class: IceRpc.Slice.Operations.IncomingRequestExtensions
Assembly: IceRpc.Slice
File(s): /home/runner/work/icerpc-csharp/icerpc-csharp/src/IceRpc.Slice/Operations/IncomingRequestExtensions.cs
Tag: 1321_24790053727
Line coverage
100%
Covered lines: 40
Uncovered lines: 0
Coverable lines: 40
Total lines: 137
Line coverage: 100%
Branch coverage
75%
Covered branches: 12
Total branches: 16
Branch coverage: 75%
Method coverage
100%
Covered methods: 6
Fully covered methods: 6
Total methods: 6
Method coverage: 100%
Full method coverage: 100%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
DecodeArgsAsync(...)100%22100%
DecodeEmptyArgsAsync(...)100%22100%
DispatchOperationAsync()66.66%66100%
DispatchOperationAsync()66.66%66100%
DispatchOperationAsync()100%11100%
DispatchOperationAsync()100%11100%

File(s)

/home/runner/work/icerpc-csharp/icerpc-csharp/src/IceRpc.Slice/Operations/IncomingRequestExtensions.cs

#LineLine coverage
 1// Copyright (c) ZeroC, Inc.
 2
 3using IceRpc.Features;
 4using IceRpc.Slice.Operations.Internal;
 5using System.IO.Pipelines;
 6using ZeroC.Slice.Codec;
 7
 8namespace IceRpc.Slice.Operations;
 9
 10/// <summary>Provides extension methods for <see cref="IncomingRequest" /> to decode its Slice-encoded payload.
 11/// </summary>
 12public static class IncomingRequestExtensions
 13{
 14    /// <summary>Decodes a request payload into a list of arguments.</summary>
 15    /// <typeparam name="T">The type of the request parameters.</typeparam>
 16    /// <param name="request">The incoming request.</param>
 17    /// <param name="decodeFunc">The decode function for the arguments from the payload.</param>
 18    /// <param name="cancellationToken">A cancellation token that receives the cancellation requests.</param>
 19    /// <returns>The request arguments.</returns>
 20    public static ValueTask<T> DecodeArgsAsync<T>(
 21        this IncomingRequest request,
 22        DecodeFunc<T> decodeFunc,
 23        CancellationToken cancellationToken = default)
 6424    {
 6425        ISliceFeature feature = request.Features.Get<ISliceFeature>() ?? SliceFeature.Default;
 26
 6427        return request.DecodeValueAsync(
 6428            feature,
 6429            feature.BaseProxy,
 6430            decodeFunc,
 6431            cancellationToken);
 6432    }
 33
 34    /// <summary>Verifies that a request payload carries no argument or only unknown tagged arguments.</summary>
 35    /// <param name="request">The incoming request.</param>
 36    /// <param name="cancellationToken">A cancellation token that receives the cancellation requests.</param>
 37    /// <returns>A value task that completes when the checking is complete.</returns>
 38    public static ValueTask DecodeEmptyArgsAsync(
 39        this IncomingRequest request,
 40        CancellationToken cancellationToken = default) =>
 1741        request.DecodeVoidAsync(
 1742            request.Features.Get<ISliceFeature>() ?? SliceFeature.Default,
 1743            cancellationToken);
 44
 45    /// <summary>Dispatches an incoming request to a method that matches the request's operation name.</summary>
 46    /// <typeparam name="TArgs">The type of the operation arguments.</typeparam>
 47    /// <typeparam name="TReturnValue">The type of the operation return value.</typeparam>
 48    /// <param name="request">The incoming request.</param>
 49    /// <param name="decodeArgs">A function that decodes the arguments from the request payload.</param>
 50    /// <param name="method">The user-provided implementation of the operation.</param>
 51    /// <param name="encodeReturnValue">A function that encodes the return value into a PipeReader.</param>
 52    /// <param name="encodeReturnValueStream">A function that encodes the stream portion of the return value.</param>
 53    /// <param name="cancellationToken">A cancellation token that receives the cancellation requests.</param>
 54    /// <returns>A value task that holds the outgoing response.</returns>
 55    public static async ValueTask<OutgoingResponse> DispatchOperationAsync<TArgs, TReturnValue>(
 56        this IncomingRequest request,
 57        Func<IncomingRequest, CancellationToken, ValueTask<TArgs>> decodeArgs,
 58        Func<TArgs, IFeatureCollection, CancellationToken, ValueTask<TReturnValue>> method,
 59        Func<TReturnValue, SliceEncodeOptions?, PipeReader> encodeReturnValue,
 60        Func<TReturnValue, SliceEncodeOptions?, PipeReader>? encodeReturnValueStream = null,
 61        CancellationToken cancellationToken = default)
 1762    {
 1763        TArgs args = await decodeArgs(request, cancellationToken).ConfigureAwait(false);
 1764        TReturnValue returnValue = await method(args, request.Features, cancellationToken).ConfigureAwait(false);
 65
 1766        return new OutgoingResponse(request)
 1767        {
 1768            Payload = encodeReturnValue(returnValue, request.Features.Get<ISliceFeature>()?.EncodeOptions),
 1769            PayloadContinuation =
 1770                encodeReturnValueStream?.Invoke(returnValue, request.Features.Get<ISliceFeature>()?.EncodeOptions)
 1771        };
 1772    }
 73
 74    /// <summary>Dispatches an incoming request to a method that matches the request's operation name. The operation
 75    /// does not accept any arguments.</summary>
 76    /// <typeparam name="TReturnValue">The type of the operation return value.</typeparam>
 77    /// <param name="request">The incoming request.</param>
 78    /// <param name="decodeArgs">A function that decodes the empty arguments from the request payload.</param>
 79    /// <param name="method">The user-provided implementation of the operation.</param>
 80    /// <param name="encodeReturnValue">A function that encodes the return value into a PipeReader.</param>
 81    /// <param name="encodeReturnValueStream">A function that encodes the stream portion of the return value.</param>
 82    /// <param name="cancellationToken">A cancellation token that receives the cancellation requests.</param>
 83    /// <returns>A value task that holds the outgoing response.</returns>
 84    public static async ValueTask<OutgoingResponse> DispatchOperationAsync<TReturnValue>(
 85        this IncomingRequest request,
 86        Func<IncomingRequest, CancellationToken, ValueTask> decodeArgs,
 87        Func<IFeatureCollection, CancellationToken, ValueTask<TReturnValue>> method,
 88        Func<TReturnValue, SliceEncodeOptions?, PipeReader> encodeReturnValue,
 89        Func<TReturnValue, SliceEncodeOptions?, PipeReader>? encodeReturnValueStream = null,
 90        CancellationToken cancellationToken = default)
 591    {
 592        await decodeArgs(request, cancellationToken).ConfigureAwait(false);
 593        TReturnValue returnValue = await method(request.Features, cancellationToken).ConfigureAwait(false);
 594        return new OutgoingResponse(request)
 595        {
 596            Payload = encodeReturnValue(returnValue, request.Features.Get<ISliceFeature>()?.EncodeOptions),
 597            PayloadContinuation = encodeReturnValueStream?.Invoke(returnValue, request.Features.Get<ISliceFeature>()?.En
 598        };
 599    }
 100
 101    /// <summary>Dispatches an incoming request to a method that matches the request's operation name. The operation
 102    /// does not return anything.</summary>
 103    /// <typeparam name="TArgs">The type of the operation arguments.</typeparam>
 104    /// <param name="request">The incoming request.</param>
 105    /// <param name="decodeArgs">A function that decodes the arguments from the request payload.</param>
 106    /// <param name="method">The user-provided implementation of the operation.</param>
 107    /// <param name="cancellationToken">A cancellation token that receives the cancellation requests.</param>
 108    /// <returns>A value task that holds the outgoing response.</returns>
 109    public static async ValueTask<OutgoingResponse> DispatchOperationAsync<TArgs>(
 110        this IncomingRequest request,
 111        Func<IncomingRequest, CancellationToken, ValueTask<TArgs>> decodeArgs,
 112        Func<TArgs, IFeatureCollection, CancellationToken, ValueTask> method,
 113        CancellationToken cancellationToken = default)
 7114    {
 7115        TArgs args = await decodeArgs(request, cancellationToken).ConfigureAwait(false);
 7116        await method(args, request.Features, cancellationToken).ConfigureAwait(false);
 7117        return new OutgoingResponse(request);
 7118    }
 119
 120    /// <summary>Dispatches an incoming request to a method that matches the request's operation name. The operation
 121    /// does not accept any arguments and does not return anything.</summary>
 122    /// <param name="request">The incoming request.</param>
 123    /// <param name="decodeArgs">A function that decodes the empty arguments from the request payload.</param>
 124    /// <param name="method">The user-provided implementation of the operation.</param>
 125    /// <param name="cancellationToken">A cancellation token that receives the cancellation requests.</param>
 126    /// <returns>A value task that holds the outgoing response.</returns>
 127    public static async ValueTask<OutgoingResponse> DispatchOperationAsync(
 128        this IncomingRequest request,
 129        Func<IncomingRequest, CancellationToken, ValueTask> decodeArgs,
 130        Func<IFeatureCollection, CancellationToken, ValueTask> method,
 131        CancellationToken cancellationToken = default)
 6132    {
 6133        await decodeArgs(request, cancellationToken).ConfigureAwait(false);
 6134        await method(request.Features, cancellationToken).ConfigureAwait(false);
 6135        return new OutgoingResponse(request);
 6136    }
 137}