< 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: 1856_27024993493
Line coverage
100%
Covered lines: 40
Uncovered lines: 0
Coverable lines: 40
Total lines: 137
Line coverage: 100%
Branch coverage
68%
Covered branches: 11
Total branches: 16
Branch coverage: 68.7%
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(...)50%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)
 7024    {
 7025        ISliceFeature feature = request.Features.Get<ISliceFeature>() ?? SliceFeature.Default;
 26
 7027        return request.DecodeValueAsync(
 7028            feature,
 7029            feature.BaseProxy,
 7030            decodeFunc,
 7031            cancellationToken);
 7032    }
 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) =>
 2341        request.DecodeVoidAsync(
 2342            request.Features.Get<ISliceFeature>() ?? SliceFeature.Default,
 2343            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)
 2362    {
 2363        TArgs args = await decodeArgs(request, cancellationToken).ConfigureAwait(false);
 2364        TReturnValue returnValue = await method(args, request.Features, cancellationToken).ConfigureAwait(false);
 65
 2366        return new OutgoingResponse(request)
 2367        {
 2368            Payload = encodeReturnValue(returnValue, request.Features.Get<ISliceFeature>()?.EncodeOptions),
 2369            PayloadContinuation =
 2370                encodeReturnValueStream?.Invoke(returnValue, request.Features.Get<ISliceFeature>()?.EncodeOptions)
 2371        };
 2372    }
 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)
 13132    {
 13133        await decodeArgs(request, cancellationToken).ConfigureAwait(false);
 13134        await method(request.Features, cancellationToken).ConfigureAwait(false);
 13135        return new OutgoingResponse(request);
 13136    }
 137}