using System; using System.Collections.Generic; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using StardewModdingAPI.Framework.Models; namespace StardewModdingAPI.Framework.Serialisation { /// Overrides how SMAPI reads and writes and fields. internal class ManifestFieldConverter : JsonConverter { /********* ** Accessors *********/ /// Whether this converter can write JSON. public override bool CanWrite => false; /********* ** Public methods *********/ /// Get whether this instance can convert the specified object type. /// The object type. public override bool CanConvert(Type objectType) { return objectType == typeof(ISemanticVersion) || objectType == typeof(IManifestDependency[]); } /// Reads the JSON representation of the object. /// The JSON reader. /// The object type. /// The object being read. /// The calling serializer. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { // semantic version if (objectType == typeof(ISemanticVersion)) { JObject obj = JObject.Load(reader); int major = obj.Value(nameof(ISemanticVersion.MajorVersion)); int minor = obj.Value(nameof(ISemanticVersion.MinorVersion)); int patch = obj.Value(nameof(ISemanticVersion.PatchVersion)); string build = obj.Value(nameof(ISemanticVersion.Build)); return new SemanticVersion(major, minor, patch, build); } // manifest dependency if (objectType == typeof(IManifestDependency[])) { List result = new List(); foreach (JObject obj in JArray.Load(reader).Children()) { string uniqueID = obj.Value(nameof(IManifestDependency.UniqueID)); result.Add(new ManifestDependency(uniqueID)); } return result.ToArray(); } // unknown throw new NotSupportedException($"Unknown type '{objectType?.FullName}'."); } /// Writes the JSON representation of the object. /// The JSON writer. /// The value. /// The calling serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new InvalidOperationException("This converter does not write JSON."); } } }