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.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}\"");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user