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

View File

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