using System.Globalization; using System.Reflection; namespace CatalogLite; internal static class ExpirationGuard { private const string MetadataKey = "CatalogLiteExpirationDate"; public static bool IsExpired(out DateOnly? expirationDate) { expirationDate = TryReadExpirationDate(); return expirationDate is null || DateOnly.FromDateTime(DateTime.Today) > expirationDate.Value; } private static DateOnly? TryReadExpirationDate() { var value = typeof(Program).Assembly .GetCustomAttributes() .FirstOrDefault(attribute => string.Equals(attribute.Key, MetadataKey, StringComparison.Ordinal)) ?.Value; return DateOnly.TryParseExact(value, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out var date) ? date : null; } }