From 5fa7420c04b881a721e79e1ea93eef5b2ea3a685 Mon Sep 17 00:00:00 2001 From: Syntriax Date: Sun, 20 Apr 2025 00:43:24 +0300 Subject: [PATCH] feat: added entity converter --- .../Converters/EntityConverter.cs | 28 +++++++++++++++ .../Converters/EntityReference.cs | 12 +++++++ .../Converters/EntityReferenceConverter.cs | 36 +++++++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 Engine.Serialization/Converters/EntityConverter.cs create mode 100644 Engine.Serialization/Converters/EntityReference.cs create mode 100644 Engine.Serialization/Converters/EntityReferenceConverter.cs diff --git a/Engine.Serialization/Converters/EntityConverter.cs b/Engine.Serialization/Converters/EntityConverter.cs new file mode 100644 index 0000000..4e54caf --- /dev/null +++ b/Engine.Serialization/Converters/EntityConverter.cs @@ -0,0 +1,28 @@ +using Syntriax.Engine.Core; +using Syntriax.Engine.Core.Factory; + +using YamlDotNet.Core; +using YamlDotNet.Serialization; + +namespace Syntriax.Engine.Serialization; + +public class EntityConverter : IEngineTypeYamlConverter +{ + public bool Accepts(Type type) => typeof(IEntity).IsAssignableFrom(type); + + public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + { + EntityReference entityReference = (EntityReference)rootDeserializer(typeof(EntityReference))!; + + IEntity entity = (IEntity)TypeFactory.Get(entityReference.TypeContainer.Type); + + return entity; + } + + public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + { + IEntity? entity = (IEntity)value!; + + serializer(new EntityReference(entity), typeof(EntityReference)); + } +} diff --git a/Engine.Serialization/Converters/EntityReference.cs b/Engine.Serialization/Converters/EntityReference.cs new file mode 100644 index 0000000..97e85c2 --- /dev/null +++ b/Engine.Serialization/Converters/EntityReference.cs @@ -0,0 +1,12 @@ +using Syntriax.Engine.Core; + +namespace Syntriax.Engine.Serialization; + +public class EntityReference +{ + public string Id { get; set; } = string.Empty; + public TypeContainer TypeContainer { get; set; } = new(); + + public EntityReference() { } + public EntityReference(IEntity entity) { TypeContainer = new(entity); Id = entity.Id; } +} diff --git a/Engine.Serialization/Converters/EntityReferenceConverter.cs b/Engine.Serialization/Converters/EntityReferenceConverter.cs new file mode 100644 index 0000000..406c674 --- /dev/null +++ b/Engine.Serialization/Converters/EntityReferenceConverter.cs @@ -0,0 +1,36 @@ +using YamlDotNet.Core; +using YamlDotNet.Core.Events; +using YamlDotNet.Serialization; + +namespace Syntriax.Engine.Serialization; + +public class EntityReferenceConverter : IEngineTypeYamlConverter +{ + public bool Accepts(Type type) => type == typeof(EntityReference); + + public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + { + parser.Consume(); + + TypeContainer typeContainer = (TypeContainer)rootDeserializer(typeof(TypeContainer))!; + + if (parser.Consume().Value.CompareTo(nameof(EntityReference.Id)) != 0) + throw new ArgumentException($"{nameof(EntityReference)} mapping must have an {nameof(EntityReference.Id)}"); + string id = parser.Consume().Value; + + parser.Consume(); + + return new EntityReference() { Id = id, TypeContainer = typeContainer }; + } + + public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + { + EntityReference? entityReference = (EntityReference)value!; + + emitter.Emit(new MappingStart()); + serializer(entityReference.TypeContainer, typeof(TypeContainer)); + emitter.Emit(new Scalar(nameof(EntityReference.Id))); + emitter.Emit(new Scalar(entityReference.Id)); + emitter.Emit(new MappingEnd()); + } +}