fix: use a node deserialiser instead
This commit is contained in:
parent
ab4b5fbd7a
commit
9194667c6c
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user