From 5656c0bc49b6b0d02f8ca4fdfd0ac343bbe95eb3 Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Thu, 25 Jun 2026 10:17:28 -0700 Subject: [PATCH] feat(json): add reusable JsonDiscoverableType opt-in marker attribute --- .../JsonDiscoverableTypeAttributeTests.cs | 30 +++++++++++++++++ .../Json/JsonDiscoverableTypeAttribute.cs | 32 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 Projects/Server.Tests/Tests/Json/JsonDiscoverableTypeAttributeTests.cs create mode 100644 Projects/Server/Json/JsonDiscoverableTypeAttribute.cs diff --git a/Projects/Server.Tests/Tests/Json/JsonDiscoverableTypeAttributeTests.cs b/Projects/Server.Tests/Tests/Json/JsonDiscoverableTypeAttributeTests.cs new file mode 100644 index 000000000..437b674ff --- /dev/null +++ b/Projects/Server.Tests/Tests/Json/JsonDiscoverableTypeAttributeTests.cs @@ -0,0 +1,30 @@ +using Server.Json; +using Xunit; + +namespace Server.Tests.Json; + +public class JsonDiscoverableTypeAttributeTests +{ + [JsonDiscoverableType] + private sealed class DefaultName { } + + [JsonDiscoverableType("custom")] + private sealed class Overridden { } + + [Fact] + public void DefaultDiscriminator_IsNull() + { + var attr = (JsonDiscoverableTypeAttribute)System.Attribute.GetCustomAttribute( + typeof(DefaultName), typeof(JsonDiscoverableTypeAttribute), false); + Assert.NotNull(attr); + Assert.Null(attr.Discriminator); + } + + [Fact] + public void OverrideDiscriminator_IsReturned() + { + var attr = (JsonDiscoverableTypeAttribute)System.Attribute.GetCustomAttribute( + typeof(Overridden), typeof(JsonDiscoverableTypeAttribute), false); + Assert.Equal("custom", attr.Discriminator); + } +} diff --git a/Projects/Server/Json/JsonDiscoverableTypeAttribute.cs b/Projects/Server/Json/JsonDiscoverableTypeAttribute.cs new file mode 100644 index 000000000..0246b44ae --- /dev/null +++ b/Projects/Server/Json/JsonDiscoverableTypeAttribute.cs @@ -0,0 +1,32 @@ +/************************************************************************* + * ModernUO * + * Copyright 2019-2026 - ModernUO Development Team * + * Email: hi@modernuo.com * + * File: JsonDiscoverableTypeAttribute.cs * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + *************************************************************************/ + +using System; + +namespace Server.Json; + +/// +/// Marks a concrete class as a discoverable polymorphic JSON derived type. A consumer +/// (e.g. SpawnerJsonSerializer) scans assemblies for marked subclasses of a chosen +/// base and registers them for System.Text.Json polymorphism. Optionally overrides the +/// $type discriminator value (defaults to the type's ). +/// +[AttributeUsage(AttributeTargets.Class, Inherited = false)] +public sealed class JsonDiscoverableTypeAttribute : Attribute +{ + public JsonDiscoverableTypeAttribute(string discriminator = null) => Discriminator = discriminator; + + public string Discriminator { get; } +}