86 lines
2.5 KiB
C#
86 lines
2.5 KiB
C#
using Microsoft.EntityFrameworkCore;
|
|
using Newtonsoft.Json;
|
|
using Newtonsoft.Json.Linq;
|
|
using Pf2eModel;
|
|
using Pf2eModel.Model;
|
|
using Pf2eModel.Model.Base;
|
|
using Pf2eModel.Model.Base.Source;
|
|
using Pf2eModel.Model.Structure;
|
|
using System.ComponentModel;
|
|
|
|
namespace Pf2eViewer;
|
|
internal class EntityConverter : JsonConverter
|
|
{
|
|
private readonly Pf2eDbContext _context = new();
|
|
|
|
public override bool CanConvert(Type objectType)
|
|
{
|
|
return objectType == typeof(Entity) || objectType.IsAssignableTo(typeof(IEntity));
|
|
}
|
|
|
|
private Dictionary<string, object?> DictionarySerialization(object source)
|
|
{
|
|
Dictionary<string, object?> dictionary = [];
|
|
|
|
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(source))
|
|
{
|
|
object? v = property.GetValue(source);
|
|
dictionary.Add(property.Name, v);
|
|
}
|
|
|
|
return dictionary;
|
|
}
|
|
|
|
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
|
|
{
|
|
Dictionary<string, object?> dictionary = DictionarySerialization(value!);
|
|
|
|
if (value.GetType() != typeof(Entity))
|
|
{
|
|
dictionary.Remove("Entity");
|
|
}
|
|
|
|
switch (value)
|
|
{
|
|
case Entity entity:
|
|
ProcessEntity(dictionary, entity);
|
|
break;
|
|
|
|
case Trait trait:
|
|
ProcessTrait(dictionary, trait);
|
|
break;
|
|
}
|
|
|
|
writer.WriteStartObject();
|
|
|
|
foreach (KeyValuePair<string, object> keyValuePair in dictionary)
|
|
{
|
|
writer.WritePropertyName(keyValuePair.Key, true);
|
|
serializer.Serialize(writer, keyValuePair.Value);
|
|
}
|
|
|
|
writer.WriteEndObject();
|
|
}
|
|
|
|
private void ProcessTrait(Dictionary<string, object?> dictionary, Trait trait)
|
|
{
|
|
string name = trait.Entity?.Name ?? _context.Entities.Where(e => e.Id == trait.Id).Select(e => e.Name).FirstOrDefault()!;
|
|
|
|
dictionary.Remove("Entity");
|
|
dictionary.Remove("Entities");
|
|
dictionary.Add("Name", name);
|
|
}
|
|
|
|
private void ProcessEntity(Dictionary<string, object?> dictionary, Entity entity)
|
|
{
|
|
dictionary.Remove("Description");
|
|
}
|
|
|
|
public override bool CanRead => false;
|
|
|
|
public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
|
|
{
|
|
throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter.");
|
|
}
|
|
}
|