From 1cfdedfc80c129db01661959b6d5ec018303db31 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Sun, 20 Oct 2024 12:31:31 +0200 Subject: [PATCH] Made fields and methods in StaticJsonConverter protected to allow extending it --- CHANGELOG.md | 4 +++ MLEM.Data/Json/StaticJsonConverter.cs | 49 ++++++++++++++++++++------- 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 28037f1..08c12ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,10 @@ Additions Fixes - Fixed tooltips not being bounded correctly for viewports that don't start at the origin +### MLEM.Data +Improvements +- Made fields and methods in StaticJsonConverter protected to allow extending it + ## 7.1.1 ### MLEM diff --git a/MLEM.Data/Json/StaticJsonConverter.cs b/MLEM.Data/Json/StaticJsonConverter.cs index 3d13dbd..567d970 100644 --- a/MLEM.Data/Json/StaticJsonConverter.cs +++ b/MLEM.Data/Json/StaticJsonConverter.cs @@ -15,19 +15,30 @@ namespace MLEM.Data.Json { /// The type of the object to convert public class StaticJsonConverter : JsonConverter { - private readonly Dictionary entries; - private readonly Dictionary inverse; - private readonly bool throwOnRead; + /// + /// The entries, or registry, that this static json converter uses. + /// + protected readonly Dictionary Entries; + /// + /// The inverse of this static json converter's , mapping the values to their respective keys. + /// Note that this dictionary is only created once and is not automatically updated should the be modified. + /// + protected readonly Dictionary Inverse; + /// + /// Whether to throw a in if a key is missing, or throw a if a stored json value is not a string. + /// If this is , returns instead. + /// + protected readonly bool ThrowOnRead; /// /// Creates a new static json converter using the given underlying . /// - /// The dictionary to use + /// The entries, or registry, that this static json converter uses. /// Whether to throw a in if a key is missing, or throw a if a stored json value is not a string. If this is , returns instead. public StaticJsonConverter(Dictionary entries, bool throwOnRead = false) { - this.entries = entries; - this.inverse = StaticJsonConverter.CreateInverse(entries); - this.throwOnRead = throwOnRead; + this.Entries = entries; + this.Inverse = StaticJsonConverter.CreateInverse(entries); + this.ThrowOnRead = throwOnRead; } /// @@ -62,7 +73,7 @@ namespace MLEM.Data.Json { writer.WriteNull(); return; } - if (!this.inverse.TryGetValue(value, out var key)) + if (!this.Inverse.TryGetValue(value, out var key)) throw new KeyNotFoundException($"Cannot write {value} that is not a registered entry"); writer.WriteValue(key); } @@ -78,16 +89,24 @@ namespace MLEM.Data.Json { if (reader.Value == null) return default; if (reader.TokenType != JsonToken.String) { - if (this.throwOnRead) + if (this.ThrowOnRead) throw new JsonSerializationException($"Expected a string value for {reader.Value}, got a {reader.TokenType}"); return default; } - if (!this.entries.TryGetValue((string) reader.Value, out var ret) && this.throwOnRead) + if (!this.Entries.TryGetValue((string) reader.Value, out var ret) && this.ThrowOnRead) throw new KeyNotFoundException($"Could not find registered entry for {reader.Value}"); return ret; } - private static Dictionary GetEntries( + /// + /// Returns the entries, or registry, that this static json converter should use, using reflection to find the passed in the passed . + /// + /// The type to find the entries in. + /// The name of the field or property that the entries are in within the given . + /// The found property or field's value. + /// Thrown if there is no property or field with the in the given . + /// Thrown if the value of the is not of the expected type. + protected static Dictionary GetEntries( #if NET6_0_OR_GREATER [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties | DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields)] #endif @@ -99,7 +118,13 @@ namespace MLEM.Data.Json { return value as Dictionary ?? throw new InvalidCastException($"{value} is not of expected type {typeof(T)}"); } - private static Dictionary CreateInverse(Dictionary entries) { + /// + /// Creates the inverse version of the passed , mapping the values to their keys, and throws an exception if there are any duplicate values. + /// + /// The entries to create an inverse of. + /// The inverse of the given , mapping the values to their keys. + /// Thrown if the contains duplicate values, making it impossible to create a valid inverse. + protected static Dictionary CreateInverse(Dictionary entries) { var ret = new Dictionary(); foreach (var entry in entries) { if (ret.ContainsKey(entry.Value))