fix: use a node deserialiser instead

This commit is contained in:
Anna 2024-06-17 14:28:40 -04:00
parent ab4b5fbd7a
commit 9194667c6c
Signed by: anna
GPG Key ID: D0943384CD9F87D1
2 changed files with 15 additions and 16 deletions

View File

@ -1,6 +1,6 @@
using YamlDotNet.Core; using YamlDotNet.Core;
using YamlDotNet.Core.Events; using YamlDotNet.Core.Events;
using YamlDotNet.Serialization.BufferedDeserialization.TypeDiscriminators; using YamlDotNet.Serialization;
namespace TimePasses.Model; namespace TimePasses.Model;
@ -11,25 +11,27 @@ public interface IWhen {
bool IsValid(Plugin plugin); bool IsValid(Plugin plugin);
} }
public class WhenDiscriminator : ITypeDiscriminator { public class WhenNodeDeserialiser : INodeDeserializer
public Type BaseType => typeof(IWhen); {
public bool Deserialize(IParser reader, Type expectedType, Func<IParser, Type, object?> nestedObjectDeserializer, out object? value) {
public bool TryDiscriminate(IParser buffer, out Type? suggestedType) { if (expectedType != typeof(IWhen)) {
buffer.Consume<MappingStart>(); value = null;
var name = buffer.Consume<Scalar>();
if (!name.IsKey) {
suggestedType = null;
return false; return false;
} }
reader.Consume<MappingStart>();
var name = reader.Consume<Scalar>();
if (!name.IsKey) {
throw new YamlException("invalid when: missing key");
}
switch (name.Value) { switch (name.Value) {
case "quest": { case "quest": {
suggestedType = typeof(WhenQuest); value = nestedObjectDeserializer(reader, typeof(WhenQuest));
break; break;
} }
default: { default: {
suggestedType = null; throw new YamlException($"invalid when: unknown type \"{name.Value}\"");
return false;
} }
} }

View File

@ -27,10 +27,7 @@ public class Plugin : IDalamudPlugin {
internal static IDeserializer Deserializer { get; } = new DeserializerBuilder() internal static IDeserializer Deserializer { get; } = new DeserializerBuilder()
.WithNamingConvention(UnderscoredNamingConvention.Instance) .WithNamingConvention(UnderscoredNamingConvention.Instance)
// .WithTypeConverter(new WhenConverter()) .WithNodeDeserializer(new WhenNodeDeserialiser())
.WithTypeDiscriminatingNodeDeserializer(o => {
o.AddTypeDiscriminator(new WhenDiscriminator());
})
.Build(); .Build();
private static class Signatures { private static class Signatures {