fix: use custom discriminator
This commit is contained in:
parent
e9926fef67
commit
ab4b5fbd7a
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user