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

Information
Class: AsyncResponse.Transports.NATS.NatsTransportSubjectSchema
Assembly: AsyncResponse.Transports.NATS
File(s): /home/runner/work/AsyncResponse/AsyncResponse/src/Transports/AsyncResponse.Transports.NATS/NatsTransportSubjectSchema.cs
Line coverage
100%
Covered lines: 18
Uncovered lines: 0
Coverable lines: 18
Total lines: 41
Line coverage: 100%
Branch coverage
100%
Covered branches: 14
Total branches: 14
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%
get_WorkerSubject()100%11100%
get_ResponseSubject()100%11100%
get_DeadLetterSubject()100%11100%
get_WorkerStream()100%11100%
get_ResponseStream()100%11100%
get_DeadLetterStream()100%11100%
ResolveSubject(...)100%22100%
ResolveStream(...)100%22100%
SanitizeStreamName(...)100%1010100%

File(s)

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

#LineLine coverage
 1namespace AsyncResponse.Transports.NATS;
 2
 3/// <summary>
 4/// Resolves NATS subject and JetStream stream names from transport options. NATS stream names cannot
 5/// contain dots, so a stream defaulted from the subject prefix replaces dots with underscores. These
 6/// names are deployment contracts: changing them while messages are in flight strands unprocessed
 7/// worker or response messages on the old stream.
 8/// </summary>
 39internal sealed class NatsTransportSubjectSchema(NatsAsyncResponseTransportOptions _options)
 10{
 311    public string WorkerSubject => ResolveSubject(_options.WorkerSubject, "worker");
 312    public string ResponseSubject => ResolveSubject(_options.ResponseSubject, "response");
 313    public string DeadLetterSubject => ResolveSubject(_options.DeadLetterSubject, "deadletter");
 14
 315    public string WorkerStream => ResolveStream(_options.WorkerStream, WorkerSubject);
 316    public string ResponseStream => ResolveStream(_options.ResponseStream, ResponseSubject);
 317    public string DeadLetterStream => ResolveStream(_options.DeadLetterStream, DeadLetterSubject);
 18
 19    private string ResolveSubject(string? configured, string role)
 320        => !string.IsNullOrWhiteSpace(configured)
 321            ? configured
 322            : $"{_options.SubjectPrefix}.transport.{role}";
 23
 24    private static string ResolveStream(string? configured, string subject)
 325        => !string.IsNullOrWhiteSpace(configured)
 326            ? configured
 327            : SanitizeStreamName(subject);
 28
 29    /// <summary>Turns a subject into a valid JetStream stream name (NATS stream names forbid dots and wildcards).</summ
 30    internal static string SanitizeStreamName(string subject)
 31    {
 332        Span<char> buffer = stackalloc char[subject.Length];
 333        for (var i = 0; i < subject.Length; i++)
 34        {
 335            var c = subject[i];
 336            buffer[i] = char.IsAsciiLetterOrDigit(c) || c is '-' or '_' ? c : '_';
 37        }
 38
 339        return new string(buffer);
 40    }
 41}