< Summary - Heimdall API

Information
Class: ArturRios.Heimdall.Shared.Time.UtcInstant
Assembly: ArturRios.Heimdall.Shared
File(s): /home/runner/work/heimdall-api/heimdall-api/src/Application/ArturRios.Heimdall.Shared/Time/UtcInstant.cs
Line coverage
100%
Covered lines: 6
Uncovered lines: 0
Coverable lines: 6
Total lines: 25
Line coverage: 100%
Branch coverage
100%
Covered branches: 4
Total branches: 4
Branch coverage: 100%
Method coverage
100%
Covered methods: 1
Fully covered methods: 1
Total methods: 1
Method coverage: 100%
Full method coverage: 100%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Of(...)100%44100%

File(s)

/home/runner/work/heimdall-api/heimdall-api/src/Application/ArturRios.Heimdall.Shared/Time/UtcInstant.cs

#LineLine coverage
 1namespace ArturRios.Heimdall.Shared.Time;
 2
 3/// <summary>
 4///     Reads an instant a caller sent as the UTC instant this API's contract says it is
 5///     (UC-48's <c>From</c>/<c>To</c>, UC-53's <c>ExpiresAt</c>).
 6/// </summary>
 7/// <remarks>
 8///     ASP.NET Core binds <c>2026-10-14T00:00:00Z</c> as UTC but <c>2026-10-14T00:00:00</c>, with no
 9///     offset, as <see cref="DateTimeKind.Unspecified" />, and Npgsql refuses an unspecified
 10///     <see cref="DateTime" /> for a <c>timestamp with time zone</c> parameter. Without this an
 11///     offset-less filter — what an HTML <c>datetime-local</c> input sends — would answer 500.
 12/// </remarks>
 13public static class UtcInstant
 14{
 15    /// <summary>
 16    ///     <paramref name="value" /> as UTC: unchanged when it already is, converted when it is local,
 17    ///     and taken as UTC when it carries no kind at all.
 18    /// </summary>
 2919    public static DateTime Of(DateTime value) => value.Kind switch
 2920    {
 1721        DateTimeKind.Utc => value,
 122        DateTimeKind.Local => value.ToUniversalTime(),
 1123        _ => DateTime.SpecifyKind(value, DateTimeKind.Utc)
 2924    };
 25}

Methods/Properties

Of(System.DateTime)