using System.Globalization; using System.Text.Json; namespace Asentrafin.Api.Services.Plaid; internal static class PlaidJson { public static JsonElement? Property(this JsonElement element, string name) { return element.ValueKind == JsonValueKind.Object && element.TryGetProperty(name, out var value) ? value : null; } public static string? String(this JsonElement element, string name) { var value = element.Property(name); return value is { ValueKind: JsonValueKind.String } ? value.Value.GetString() : null; } public static decimal? Decimal(this JsonElement element, string name) { var value = element.Property(name); return value is { ValueKind: JsonValueKind.Number } && value.Value.TryGetDecimal(out var parsed) ? parsed : null; } public static int? Int(this JsonElement element, string name) { var value = element.Property(name); return value is { ValueKind: JsonValueKind.Number } && value.Value.TryGetInt32(out var parsed) ? parsed : null; } public static bool Bool(this JsonElement element, string name) { var value = element.Property(name); return value is { ValueKind: JsonValueKind.True } || value is { ValueKind: JsonValueKind.False } && value.Value.GetBoolean(); } public static DateOnly? Date(this JsonElement element, string name) { var value = element.String(name); return DateOnly.TryParseExact(value, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out var parsed) ? parsed : null; } public static DateTimeOffset? DateTimeOffset(this JsonElement element, string name) { var value = element.String(name); return System.DateTimeOffset.TryParse(value, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out var parsed) ? parsed : null; } public static string[] StringArray(this JsonElement element, string name) { var value = element.Property(name); if (value is not { ValueKind: JsonValueKind.Array }) { return []; } return value.Value.EnumerateArray() .Where(item => item.ValueKind == JsonValueKind.String) .Select(item => item.GetString()) .Where(item => !string.IsNullOrWhiteSpace(item)) .Select(item => item!) .ToArray(); } }