using System.Text.Json.Nodes; namespace PrivaPub.Federation.Objects { public static class ActivityJson { public static string Id(JsonNode node) => node switch { JsonValue value when value.TryGetValue(out var text) => text, JsonObject obj => Value(obj, "id") ?? Value(obj, "href"), JsonArray array => array.Select(Id).FirstOrDefault(i => i != default), _ => default }; public static string Value(JsonNode node, string property) => node is JsonObject obj && obj[property] is JsonValue value && value.TryGetValue(out var text) ? text : default; public static IEnumerable Addresses(JsonNode node) { foreach (var field in new[] { "to", "cc", "bto", "bcc", "audience" }) { switch (node[field]) { case JsonArray array: foreach (var item in array) { var id = Id(item); if (id != default) yield return id; } break; case JsonNode single when Id(single) is { } id: yield return id; break; } } } } }