< Summary - AsyncResponse (Release / net8.0+net10.0 / unit+integration)

Information
Class: AsyncResponse.Transports.NATS.NatsReplyTargetProvider
Assembly: AsyncResponse.Transports.NATS
File(s): /home/runner/work/AsyncResponse/AsyncResponse/src/Transports/AsyncResponse.Transports.NATS/NatsReplyTargetProvider.cs
Line coverage
100%
Covered lines: 38
Uncovered lines: 0
Coverable lines: 38
Total lines: 62
Line coverage: 100%
Branch coverage
100%
Covered branches: 8
Total branches: 8
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
GetReplyTarget(...)100%44100%
ResolveTarget(...)100%44100%

File(s)

/home/runner/work/AsyncResponse/AsyncResponse/src/Transports/AsyncResponse.Transports.NATS/NatsReplyTargetProvider.cs

#LineLine coverage
 1using Microsoft.Extensions.Options;
 2
 3namespace AsyncResponse.Transports.NATS;
 4
 35internal sealed class NatsReplyTargetProvider(
 36    IOptions<NatsAsyncResponseTransportOptions> _options) : IAsyncResponseReplyTargetProvider
 7{
 8    /// <summary>Gets the configured reply target.</summary>
 9    public AsyncResponseReplyTarget GetReplyTarget(string? name = null)
 10    {
 311        var options = _options.Value;
 312        NatsTransportOptionsValidator.ValidateCommon(options);
 313        var schema = new NatsTransportSubjectSchema(options);
 314        var targetName = string.IsNullOrWhiteSpace(name)
 315            ? options.DefaultReplyTargetName
 316            : name;
 17
 318        var target = ResolveTarget(options, schema, targetName);
 319        var responseSubject = NatsTransportOptionsValidator.Required(
 320            target.ResponseSubject,
 321            $"{nameof(NatsReplyTargetOptions)}.{nameof(NatsReplyTargetOptions.ResponseSubject)}");
 322        var consumer = target.Consumer ?? options.ResponseConsumer;
 23
 324        var properties = new Dictionary<string, string>(target.Properties, StringComparer.Ordinal)
 325        {
 326            ["subject"] = responseSubject,
 327            ["consumer"] = consumer,
 328            ["correlationIdHeader"] = options.CorrelationIdHeader
 329        };
 30
 331        return new AsyncResponseReplyTarget
 332        {
 333            Name = targetName,
 334            Transport = NatsAsyncResponseTransportOptions.TransportName,
 335            Address = responseSubject,
 336            Properties = properties
 337        };
 38    }
 39
 40    private static NatsReplyTargetOptions ResolveTarget(
 41        NatsAsyncResponseTransportOptions options,
 42        NatsTransportSubjectSchema schema,
 43        string targetName)
 44    {
 345        if (options.ReplyTargets.TryGetValue(targetName, out var configured))
 346            return configured;
 47
 348        if (StringComparer.Ordinal.Equals(targetName, options.DefaultReplyTargetName))
 49        {
 350            return new NatsReplyTargetOptions
 351            {
 352                ResponseSubject = schema.ResponseSubject,
 353                Consumer = options.ResponseConsumer
 354            };
 55        }
 56
 257        throw new InvalidOperationException(
 258            $"NATS async-response reply target '{targetName}' is not configured. " +
 259            $"Configure {nameof(NatsAsyncResponseTransportOptions.ResponseSubject)} for the default target " +
 260            $"or add a named target with {nameof(NatsAsyncResponseTransportOptions.AddReplyTarget)}.");
 61    }
 62}