< Summary

Information
Class: Orchestrator.Commands.Observability.EvaluationTimestampPolicyParser
Assembly: Orchestrator
File(s): /home/runner/work/KicktippAi/KicktippAi/src/Orchestrator/Commands/Observability/EvaluationTimestampPolicy.cs
Line coverage
80%
Covered lines: 21
Uncovered lines: 5
Coverable lines: 26
Total lines: 98
Line coverage: 80.7%
Branch coverage
56%
Covered branches: 9
Total branches: 16
Branch coverage: 56.2%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
ParseOrNull(...)50%5466.67%
Parse(...)66.67%6676.92%
Normalize(...)50%6680%

File(s)

/home/runner/work/KicktippAi/KicktippAi/src/Orchestrator/Commands/Observability/EvaluationTimestampPolicy.cs

#LineLine coverage
 1using EHonda.KicktippAi.Core;
 2using NodaTime;
 3using NodaTime.Text;
 4
 5namespace Orchestrator.Commands.Observability;
 6
 7internal sealed record EvaluationTimestampPolicy(
 8    string Kind,
 9    string Reference,
 10    Duration Offset)
 11{
 12    public const string RelativeKind = "relative";
 13    public const string StartsAtReference = "startsAt";
 14
 15    public static EvaluationTimestampPolicy CreateRelativeToMatchStart(Duration offset)
 16    {
 17        return new EvaluationTimestampPolicy(RelativeKind, StartsAtReference, offset);
 18    }
 19}
 20
 21internal static class EvaluationTimestampPolicyParser
 22{
 123    private static readonly DurationPattern[] SupportedDurationPatterns =
 124    [
 125        DurationPattern.JsonRoundtrip,
 126        DurationPattern.Roundtrip
 127    ];
 28
 29    public static EvaluationTimestampPolicy? ParseOrNull(string? kind, string? offset)
 30    {
 131        if (string.IsNullOrWhiteSpace(kind) && string.IsNullOrWhiteSpace(offset))
 32        {
 133            return null;
 34        }
 35
 036        return Parse(kind, offset);
 37    }
 38
 39    public static EvaluationTimestampPolicy Parse(string? kind, string? offset)
 40    {
 141        kind = Normalize(kind, nameof(kind));
 142        offset = Normalize(offset, nameof(offset));
 43
 144        if (!string.Equals(kind, EvaluationTimestampPolicy.RelativeKind, StringComparison.OrdinalIgnoreCase))
 45        {
 146            throw new ArgumentException(
 147                $"Evaluation policy kind must currently be '{EvaluationTimestampPolicy.RelativeKind}'.",
 148                nameof(kind));
 49        }
 50
 151        foreach (var pattern in SupportedDurationPatterns)
 52        {
 153            var parseResult = pattern.Parse(offset);
 154            if (parseResult.Success)
 55            {
 156                return EvaluationTimestampPolicy.CreateRelativeToMatchStart(parseResult.Value);
 57            }
 58        }
 59
 060        throw new ArgumentException(
 061            "Evaluation policy offset must use a supported NodaTime Duration format, for example '-12:00:00' or '-0:12:0
 062            nameof(offset));
 63    }
 64
 65    private static string Normalize(string? value, string parameterName)
 66    {
 167        ArgumentException.ThrowIfNullOrWhiteSpace(value, parameterName);
 68
 169        value = value.Trim();
 170        if (value.Length >= 2 && value[0] == '"' && value[^1] == '"')
 71        {
 072            value = value[1..^1];
 73        }
 74
 175        return value;
 76    }
 77}
 78
 79internal static class EvaluationTimestampResolver
 80{
 81    public static DateTimeOffset Resolve(Match match, EvaluationTimestampPolicy policy)
 82    {
 83        ArgumentNullException.ThrowIfNull(match);
 84        ArgumentNullException.ThrowIfNull(policy);
 85
 86        if (!string.Equals(policy.Kind, EvaluationTimestampPolicy.RelativeKind, StringComparison.Ordinal))
 87        {
 88            throw new ArgumentException($"Unsupported evaluation policy kind '{policy.Kind}'.", nameof(policy));
 89        }
 90
 91        if (!string.Equals(policy.Reference, EvaluationTimestampPolicy.StartsAtReference, StringComparison.Ordinal))
 92        {
 93            throw new ArgumentException($"Unsupported evaluation policy reference '{policy.Reference}'.", nameof(policy)
 94        }
 95
 96        return (match.StartsAt + policy.Offset).ToDateTimeOffset();
 97    }
 98}