summaryrefslogtreecommitdiff
path: root/StardewModdingAPI/JsonResolver.cs
diff options
context:
space:
mode:
authorZoryn <Zoryn4163@users.noreply.github.com>2016-03-27 01:10:18 -0400
committerZoryn <Zoryn4163@users.noreply.github.com>2016-03-27 01:10:18 -0400
commit976bc6e2a96aba761c0feff414dd5f95dd4cd991 (patch)
tree9dd87794562d797ec8291fd00af0409b406467df /StardewModdingAPI/JsonResolver.cs
parent112305161688eb4d88ccfc79b5636eca6e0ab1d9 (diff)
parent12bf4fd843be26f89b5fe3415aeec3055c54d786 (diff)
downloadSMAPI-976bc6e2a96aba761c0feff414dd5f95dd4cd991.tar.gz
SMAPI-976bc6e2a96aba761c0feff414dd5f95dd4cd991.tar.bz2
SMAPI-976bc6e2a96aba761c0feff414dd5f95dd4cd991.zip
Merge pull request #67 from Zoryn4163/master
logging things. not sure if ready for release build, testing for a bit.
Diffstat (limited to 'StardewModdingAPI/JsonResolver.cs')
-rw-r--r--StardewModdingAPI/JsonResolver.cs212
1 files changed, 212 insertions, 0 deletions
diff --git a/StardewModdingAPI/JsonResolver.cs b/StardewModdingAPI/JsonResolver.cs
new file mode 100644
index 00000000..8aac2313
--- /dev/null
+++ b/StardewModdingAPI/JsonResolver.cs
@@ -0,0 +1,212 @@
+using System;
+using System.Collections.Generic;
+using Microsoft.Xna.Framework;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using Newtonsoft.Json.Serialization;
+using StardewModdingAPI.Inheritance;
+using Object = StardewValley.Object;
+
+namespace StardewModdingAPI
+{
+ internal class JsonResolver : DefaultContractResolver
+ {
+ protected override JsonContract CreateContract(Type objectType)
+ {
+ if (objectType == typeof (Rectangle) || objectType == typeof (Rectangle?))
+ {
+ Console.WriteLine("FOUND A RECT");
+ JsonContract contract = CreateObjectContract(objectType);
+ contract.Converter = new RectangleConverter();
+ return contract;
+ }
+ if (objectType == typeof (Object))
+ {
+ Log.AsyncY("FOUND AN OBJECT");
+ JsonContract contract = CreateObjectContract(objectType);
+ contract.Converter = new ObjectConverter();
+ return contract;
+ }
+ return base.CreateContract(objectType);
+ }
+ }
+
+ public class ObjectConverter : JsonConverter
+ {
+ public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+ {
+ Log.AsyncY("TRYING TO WRITE");
+ var obj = (Object) value;
+ Log.AsyncY("TRYING TO WRITE");
+
+ var jObject = GetObject(obj);
+ Log.AsyncY("TRYING TO WRITE");
+
+ try
+ {
+ Log.AsyncY(jObject.ToString());
+ }
+ catch (Exception ex)
+ {
+ Log.AsyncR(ex);
+ }
+
+ Console.ReadKey();
+
+ jObject.WriteTo(writer);
+ }
+
+ public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
+ {
+ var jObject = JObject.Load(reader);
+
+ return GetObject(jObject);
+ }
+
+ public override bool CanConvert(Type objectType)
+ {
+ throw new NotImplementedException();
+ }
+
+ protected static JObject GetObject(Object o)
+ {
+ try
+ {
+ var parentSheetIndex = o.parentSheetIndex;
+ var stack = o.stack;
+ var isRecipe = o.isRecipe;
+ var price = o.price;
+ var quality = o.quality;
+
+ var oo = new SBareObject(parentSheetIndex, stack, isRecipe, price, quality);
+ Log.AsyncG(JsonConvert.SerializeObject(oo));
+ return JObject.FromObject(oo);
+ }
+ catch (Exception ex)
+ {
+ Log.AsyncR(ex);
+ Console.ReadKey();
+ }
+ return null;
+ }
+
+ protected static Object GetObject(JObject jObject)
+ {
+ var parentSheetIndex = GetTokenValue<object>(jObject, "parentSheetIndex") as int?;
+ var stack = GetTokenValue<object>(jObject, "parentSheetIndex") as int?;
+ var isRecipe = GetTokenValue<object>(jObject, "parentSheetIndex") as bool?;
+ var price = GetTokenValue<object>(jObject, "parentSheetIndex") as int?;
+ var quality = GetTokenValue<object>(jObject, "parentSheetIndex") as int?;
+
+ return new Object(parentSheetIndex ?? 0, stack ?? 0, isRecipe ?? false, price ?? -1, quality ?? 0);
+ }
+
+ protected static Object GetObject(JToken jToken)
+ {
+ var jObject = JObject.FromObject(jToken);
+
+ return GetObject(jObject);
+ }
+
+ protected static T GetTokenValue<T>(JObject jObject, string tokenName) where T : class
+ {
+ JToken jToken;
+ jObject.TryGetValue(tokenName, StringComparison.InvariantCultureIgnoreCase, out jToken);
+ return jToken as T;
+ }
+ }
+
+ public class RectangleConverter : JsonConverter
+ {
+ public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+ {
+ var rectangle = (Rectangle) value;
+
+ var jObject = GetObject(rectangle);
+
+ jObject.WriteTo(writer);
+ }
+
+ public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
+ {
+ Console.WriteLine(reader.ReadAsString());
+ var jObject = JObject.Load(reader);
+
+ return GetRectangle(jObject);
+ }
+
+ public override bool CanConvert(Type objectType)
+ {
+ throw new NotImplementedException();
+ }
+
+ protected static JObject GetObject(Rectangle rectangle)
+ {
+ var x = rectangle.X;
+ var y = rectangle.Y;
+ var width = rectangle.Width;
+ var height = rectangle.Height;
+
+ return JObject.FromObject(new {x, y, width, height});
+ }
+
+ protected static Rectangle GetRectangle(JObject jObject)
+ {
+ var x = GetTokenValue(jObject, "x") ?? 0;
+ var y = GetTokenValue(jObject, "y") ?? 0;
+ var width = GetTokenValue(jObject, "width") ?? 0;
+ var height = GetTokenValue(jObject, "height") ?? 0;
+
+ return new Rectangle(x, y, width, height);
+ }
+
+ protected static Rectangle GetRectangle(JToken jToken)
+ {
+ var jObject = JObject.FromObject(jToken);
+
+ return GetRectangle(jObject);
+ }
+
+ protected static int? GetTokenValue(JObject jObject, string tokenName)
+ {
+ JToken jToken;
+ return jObject.TryGetValue(tokenName, StringComparison.InvariantCultureIgnoreCase, out jToken) ? (int) jToken : (int?) null;
+ }
+ }
+
+ public class RectangleListConverter : RectangleConverter
+ {
+ public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+ {
+ var rectangleList = (IList<Rectangle>) value;
+
+ var jArray = new JArray();
+
+ foreach (var rectangle in rectangleList)
+ {
+ jArray.Add(GetObject(rectangle));
+ }
+
+ jArray.WriteTo(writer);
+ }
+
+ public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
+ {
+ var rectangleList = new List<Rectangle>();
+
+ var jArray = JArray.Load(reader);
+
+ foreach (var jToken in jArray)
+ {
+ rectangleList.Add(GetRectangle(jToken));
+ }
+
+ return rectangleList;
+ }
+
+ public override bool CanConvert(Type objectType)
+ {
+ throw new NotImplementedException();
+ }
+ }
+} \ No newline at end of file