From 9c129cefe25c94746b93e09ef69cddb1022023ab Mon Sep 17 00:00:00 2001 From: Syntriax Date: Sun, 20 Apr 2025 01:07:13 +0300 Subject: [PATCH] feat: added state enable serialization --- .../Converters/StateEnableConverter.cs | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 Engine.Serialization/Converters/StateEnableConverter.cs diff --git a/Engine.Serialization/Converters/StateEnableConverter.cs b/Engine.Serialization/Converters/StateEnableConverter.cs new file mode 100644 index 0000000..efc9b66 --- /dev/null +++ b/Engine.Serialization/Converters/StateEnableConverter.cs @@ -0,0 +1,46 @@ +using Syntriax.Engine.Core; +using Syntriax.Engine.Core.Factory; + +using YamlDotNet.Core; +using YamlDotNet.Core.Events; +using YamlDotNet.Serialization; + +namespace Syntriax.Engine.Serialization; + +public class StateEnableConverter : IEngineTypeYamlConverter +{ + public bool Accepts(Type type) => typeof(IStateEnable).IsAssignableFrom(type); + + public object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) + { + parser.Consume(); + + TypeContainer typeContainer = (TypeContainer)rootDeserializer(typeof(TypeContainer))!; + EntityReference entityReference = (EntityReference)rootDeserializer(typeof(EntityReference))!; + + if (parser.Consume().Value.CompareTo(nameof(IStateEnable.Enabled)) != 0) + throw new ArgumentException($"{nameof(IStateEnable)} mapping must have a {nameof(IStateEnable.Enabled)}"); + bool enabled = bool.Parse(parser.Consume().Value); + + parser.Consume(); + + IStateEnable stateEnable = (IStateEnable)TypeFactory.Get(typeContainer.Type); + stateEnable.Enabled = enabled; + stateEnable.Assign((IEntity)TypeFactory.Get(entityReference.TypeContainer.Type)); + + return stateEnable; + } + + public void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer) + { + IStateEnable stateEnable = (IStateEnable)value!; + + emitter.Emit(new MappingStart()); + serializer(new TypeContainer(stateEnable), typeof(TypeContainer)); + emitter.Emit(new Scalar(nameof(StateEnable.Entity))); + serializer(new EntityReference(stateEnable.Entity), typeof(EntityReference)); + emitter.Emit(new Scalar(nameof(IStateEnable.Enabled))); + emitter.Emit(new Scalar(stateEnable.Enabled.ToString())); + emitter.Emit(new MappingEnd()); + } +}