fix: use custom discriminator

This commit is contained in:
Anna 2024-06-17 14:20:33 -04:00
parent e9926fef67
commit ab4b5fbd7a
Signed by: anna
GPG Key ID: D0943384CD9F87D1
2 changed files with 13 additions and 24 deletions

View File

@ -1,6 +1,6 @@
using YamlDotNet.Core;
using YamlDotNet.Core.Events;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.BufferedDeserialization.TypeDiscriminators;
namespace TimePasses.Model;
@ -11,35 +11,28 @@ public interface IWhen {
bool IsValid(Plugin plugin);
}
public class WhenConverter : IYamlTypeConverter {
public bool Accepts(Type type) {
// FIXME? typeof(IWhen).IsAssignableFrom(type)
return typeof(IWhen) == type;
}
public class WhenDiscriminator : ITypeDiscriminator {
public Type BaseType => typeof(IWhen);
public object? ReadYaml(IParser parser, Type type) {
parser.Consume<MappingStart>();
var name = parser.Consume<Scalar>();
public bool TryDiscriminate(IParser buffer, out Type? suggestedType) {
buffer.Consume<MappingStart>();
var name = buffer.Consume<Scalar>();
if (!name.IsKey) {
throw new YamlException("invalid when: missing key");
suggestedType = null;
return false;
}
IWhen when;
switch (name.Value) {
case "quest": {
when = Plugin.Deserializer.Deserialize<WhenQuest>(parser);
suggestedType = typeof(WhenQuest);
break;
}
default: {
throw new YamlException($"invalid when: unknown type {name.Value}");
suggestedType = null;
return false;
}
}
parser.Consume<MappingEnd>();
return when;
}
public void WriteYaml(IEmitter emitter, object? value, Type type) {
throw new NotImplementedException();
return true;
}
}

View File

@ -29,11 +29,7 @@ public class Plugin : IDalamudPlugin {
.WithNamingConvention(UnderscoredNamingConvention.Instance)
// .WithTypeConverter(new WhenConverter())
.WithTypeDiscriminatingNodeDeserializer(o => {
var keyMappings = new Dictionary<string, Type> {
["quest"] = typeof(WhenQuest),
};
o.AddUniqueKeyTypeDiscriminator<IWhen>(keyMappings);
o.AddTypeDiscriminator(new WhenDiscriminator());
})
.Build();