summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <github@jplamondonw.com>2017-02-17 11:33:22 -0500
committerJesse Plamondon-Willard <github@jplamondonw.com>2017-02-17 11:33:22 -0500
commit41ee8990f81a63c686953b2c28e7af8627fd8098 (patch)
treefd3a997f5dcf1b186bd8a4364b40ca86192fac25 /src
parent1dfedd2d1a032d357bf42e9edbd7a797beb2e124 (diff)
downloadSMAPI-41ee8990f81a63c686953b2c28e7af8627fd8098.tar.gz
SMAPI-41ee8990f81a63c686953b2c28e7af8627fd8098.tar.bz2
SMAPI-41ee8990f81a63c686953b2c28e7af8627fd8098.zip
write XNA input enums to JSON as strings automatically
Mods often reference Json.NET to do this, so this lets many mods remove Json.NET as a dependency.
Diffstat (limited to 'src')
-rw-r--r--src/StardewModdingAPI/Framework/Serialisation/JsonHelper.cs8
-rw-r--r--src/StardewModdingAPI/Framework/Serialisation/SelectiveStringEnumConverter.cs35
-rw-r--r--src/StardewModdingAPI/StardewModdingAPI.csproj1
3 files changed, 43 insertions, 1 deletions
diff --git a/src/StardewModdingAPI/Framework/Serialisation/JsonHelper.cs b/src/StardewModdingAPI/Framework/Serialisation/JsonHelper.cs
index 26d937a5..d5f5bfd0 100644
--- a/src/StardewModdingAPI/Framework/Serialisation/JsonHelper.cs
+++ b/src/StardewModdingAPI/Framework/Serialisation/JsonHelper.cs
@@ -1,5 +1,7 @@
using System;
+using System.Collections.Generic;
using System.IO;
+using Microsoft.Xna.Framework.Input;
using Newtonsoft.Json;
using StardewModdingAPI.Advanced;
@@ -15,7 +17,11 @@ namespace StardewModdingAPI.Framework.Serialisation
private readonly JsonSerializerSettings JsonSettings = new JsonSerializerSettings
{
Formatting = Formatting.Indented,
- ObjectCreationHandling = ObjectCreationHandling.Replace // avoid issue where default ICollection<T> values are duplicated each time the config is loaded
+ ObjectCreationHandling = ObjectCreationHandling.Replace, // avoid issue where default ICollection<T> values are duplicated each time the config is loaded
+ Converters = new List<JsonConverter>
+ {
+ new SelectiveStringEnumConverter(typeof(Buttons), typeof(Keys))
+ }
};
diff --git a/src/StardewModdingAPI/Framework/Serialisation/SelectiveStringEnumConverter.cs b/src/StardewModdingAPI/Framework/Serialisation/SelectiveStringEnumConverter.cs
new file mode 100644
index 00000000..e9c5496d
--- /dev/null
+++ b/src/StardewModdingAPI/Framework/Serialisation/SelectiveStringEnumConverter.cs
@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Newtonsoft.Json.Converters;
+
+namespace StardewModdingAPI.Framework.Serialisation
+{
+ /// <summary>A variant of <see cref="StringEnumConverter"/> which only converts certain enums.</summary>
+ internal class SelectiveStringEnumConverter : StringEnumConverter
+ {
+ /*********
+ ** Properties
+ *********/
+ /// <summary>The enum type names to convert.</summary>
+ private readonly HashSet<string> Types;
+
+
+ /*********
+ ** Public methods
+ *********/
+ /// <summary>Construct an instance.</summary>
+ /// <param name="types">The enum types to convert.</param>
+ public SelectiveStringEnumConverter(params Type[] types)
+ {
+ this.Types = new HashSet<string>(types.Select(p => p.FullName));
+ }
+
+ /// <summary>Get whether this instance can convert the specified object type.</summary>
+ /// <param name="type">The object type.</param>
+ public override bool CanConvert(Type type)
+ {
+ return base.CanConvert(type) && this.Types.Contains(type.FullName);
+ }
+ }
+}
diff --git a/src/StardewModdingAPI/StardewModdingAPI.csproj b/src/StardewModdingAPI/StardewModdingAPI.csproj
index 35dd6513..796980cb 100644
--- a/src/StardewModdingAPI/StardewModdingAPI.csproj
+++ b/src/StardewModdingAPI/StardewModdingAPI.csproj
@@ -153,6 +153,7 @@
<Compile Include="Framework\Reflection\PrivateProperty.cs" />
<Compile Include="Framework\RequestExitDelegate.cs" />
<Compile Include="Framework\Serialisation\JsonHelper.cs" />
+ <Compile Include="Framework\Serialisation\SelectiveStringEnumConverter.cs" />
<Compile Include="Framework\Serialisation\SemanticVersionConverter.cs" />
<Compile Include="ICommandHelper.cs" />
<Compile Include="IModRegistry.cs" />