Skip to content
This repository has been archived by the owner on Feb 28, 2024. It is now read-only.

Commit

Permalink
Merge pull request #17 from zkxs/basex-types
Browse files Browse the repository at this point in the history
Add built-in configuration support for basic BaseX types
  • Loading branch information
zkxs authored Apr 6, 2022
2 parents ce16892 + 36d4bb4 commit d94a388
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 5 deletions.
29 changes: 29 additions & 0 deletions NeosModLoader/JsonConverters/NeosPrimitiveConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using BaseX;
using Newtonsoft.Json;
using System;
using System.Reflection;

namespace NeosModLoader.JsonConverters
{
class NeosPrimitiveConverter : JsonConverter
{
private static readonly Assembly BASEX = typeof(color).Assembly;

public override bool CanConvert(Type objectType)
{
return BASEX.Equals(objectType.Assembly) && Coder.IsNeosPrimitive(objectType);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
string serialized = (string)reader.Value;
return typeof(Coder<>).MakeGenericType(objectType).GetMethod("DecodeFromString").Invoke(null, new object[] { serialized });
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
string serialized = (string)typeof(Coder<>).MakeGenericType(value.GetType()).GetMethod("EncodeToString").Invoke(null, new object[] { value });
writer.WriteValue(serialized);
}
}
}
31 changes: 26 additions & 5 deletions NeosModLoader/ModConfiguration.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using FrooxEngine;
using HarmonyLib;
using NeosModLoader.JsonConverters;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
Expand Down Expand Up @@ -156,6 +157,26 @@ public class ModConfiguration : IModConfigurationDefinition
/// </summary>
public event ConfigurationChangedEventHandler OnThisConfigurationChanged;

private static JsonSerializer jsonSerializer = createJsonSerializer();

private static JsonSerializer createJsonSerializer()
{
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.MaxDepth = 32;
settings.ReferenceLoopHandling = ReferenceLoopHandling.Error;
settings.DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate;
List<JsonConverter> converters = new List<JsonConverter>();
IList<JsonConverter> defaultConverters = settings.Converters;
if (defaultConverters != null)
{
Logger.DebugInternal($"Using {defaultConverters.Count()} default json converters");
converters.AddRange(defaultConverters);
}
converters.Add(new NeosPrimitiveConverter());
settings.Converters = converters;
return JsonSerializer.Create(settings);
}

private ModConfiguration(LoadedNeosMod loadedNeosMod, ModConfigurationDefinition definition)
{
LoadedNeosMod = loadedNeosMod;
Expand Down Expand Up @@ -414,7 +435,7 @@ internal static ModConfiguration LoadConfigForMod(LoadedNeosMod mod)
using (JsonTextReader reader = new JsonTextReader(file))
{
JObject json = JObject.Load(reader);
Version version = new Version(json[VERSION_JSON_KEY].ToObject<string>());
Version version = new Version(json[VERSION_JSON_KEY].ToObject<string>(jsonSerializer));
if (!AreVersionsCompatible(version, definition.Version))
{
var handlingMode = mod.NeosMod.HandleIncompatibleConfigurationVersions(definition.Version, version);
Expand All @@ -437,7 +458,7 @@ internal static ModConfiguration LoadConfigForMod(LoadedNeosMod mod)
JToken token = json[VALUES_JSON_KEY][key.Name];
if (token != null)
{
object value = token.ToObject(key.ValueType());
object value = token.ToObject(key.ValueType(), jsonSerializer);
key.Set(value);
}
}
Expand Down Expand Up @@ -482,20 +503,20 @@ public void Save(bool saveDefaultValues = false)
ModConfigurationDefinition definition = LoadedNeosMod.NeosMod.GetConfigurationDefinition();

JObject json = new JObject();
json[VERSION_JSON_KEY] = JToken.FromObject(definition.Version.ToString());
json[VERSION_JSON_KEY] = JToken.FromObject(definition.Version.ToString(), jsonSerializer);

JObject valueMap = new JObject();
foreach (ModConfigurationKey key in ConfigurationItemDefinitions)
{
if (key.TryGetValue(out object value))
{
// I don't need to typecheck this as there's no way to sneak a bad type past my Set() API
valueMap[key.Name] = JToken.FromObject(value);
valueMap[key.Name] = JToken.FromObject(value, jsonSerializer);
}
else if (saveDefaultValues && key.TryComputeDefault(out object defaultValue))
{
// I don't need to typecheck this as there's no way to sneak a bad type past my computeDefault API
valueMap[key.Name] = JToken.FromObject(defaultValue);
valueMap[key.Name] = JToken.FromObject(defaultValue, jsonSerializer);
}
}

Expand Down

0 comments on commit d94a388

Please sign in to comment.