using System.Globalization; using System.Text.Json; namespace XFEEDToolBox.Core.Galaxy; /// The original Civilization classifier's single result. DefinitionId is /// the untouched metadata identifier; Defaulted marks a ready metadata missing-row /// fallback. A None classification is not a claim about complete physical coverage. public sealed record GalaxyNativeCivilizationFacts(ulong DefinitionId,string? Key,bool Defaulted=false) { public static GalaxyNativeCivilizationFacts? FromWire(JsonElement value) { if(value.ValueKind==JsonValueKind.Null)return null; if(value.ValueKind!=JsonValueKind.Object||!value.TryGetProperty("definitionId",out var raw)||raw.ValueKind!=JsonValueKind.String|| !ulong.TryParse(raw.GetString(),NumberStyles.None,CultureInfo.InvariantCulture,out var id)) throw new InvalidDataException("原文明定义ID回执无效。"); if(!value.TryGetProperty("key",out var field)||field.ValueKind is not(JsonValueKind.String or JsonValueKind.Null)) throw new InvalidDataException("原文明分类回执无效。"); var rawKey=field.GetString();var key=rawKey is "none" or "human" or "guardian" or "thargoid"?rawKey:null; var defaulted=false; if(value.TryGetProperty("defaulted",out var fallback)) { if(fallback.ValueKind is not(JsonValueKind.True or JsonValueKind.False))throw new InvalidDataException("原文明分类来源无效。"); defaulted=fallback.GetBoolean(); } if(defaulted&&(id!=ulong.MaxValue||rawKey!="none"))throw new InvalidDataException("原文明缺行默认值不一致。"); return new(id,key,defaulted); } } public sealed partial record GalaxyNativeSystemFacts { public GalaxyNativeCivilizationFacts? Civilization {get;init;} public bool CivilizationRequested {get;init;} }