From 82cc25a9ef25ebc4f5e235b5a2557f6928854795 Mon Sep 17 00:00:00 2001 From: Syntriax Date: Tue, 22 Apr 2025 21:08:56 +0300 Subject: [PATCH] feat: entity finder added --- .../Converters/EntityFinder.cs | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 Engine.Serialization/Converters/EntityFinder.cs diff --git a/Engine.Serialization/Converters/EntityFinder.cs b/Engine.Serialization/Converters/EntityFinder.cs new file mode 100644 index 0000000..5290b66 --- /dev/null +++ b/Engine.Serialization/Converters/EntityFinder.cs @@ -0,0 +1,70 @@ +using System.Collections; +using System.Reflection; + +using Syntriax.Engine.Core; + +namespace Syntriax.Engine.Serialization; + +public class EntityFinder +{ + private readonly HashSet _entities = []; + + public IReadOnlyCollection Entities => _entities; + + public void FindEntitiesUnder(object @object) + { + TypeData typeData = Utils.GetTypeData(@object.GetType()); + + if (@object is IEntity entity) + { + if (_entities.Add(entity)) + { + Console.WriteLine($"Found Entity: {entity.Id}"); + FindEntitiesUnder(entity); + } + else + { + Console.WriteLine($"Duplicate Entity: {entity.Id}"); + return; + } + } + else + { + return; + } + + foreach (PropertyInfo propertyInfo in typeData.Properties) + { + if (propertyInfo.PropertyType?.IsPrimitive ?? true || propertyInfo.PropertyType == typeof(string)) + continue; + + if (propertyInfo.HasAttribute()) + continue; + + object? value = propertyInfo.GetValue(@object); + + if (value is IEnumerable enumerable && value.GetType() != typeof(string)) + foreach (object? listObject in enumerable) + FindEntitiesUnder(listObject); + + } + + foreach (FieldInfo fieldInfo in typeData.Fields) + { + if (fieldInfo.FieldType?.IsPrimitive ?? true || fieldInfo.FieldType == typeof(string)) + continue; + + if (fieldInfo.HasAttribute()) + continue; + + // if (!fieldInfo.HasAttribute()) + // continue; + + object? value = fieldInfo.GetValue(@object); + + if (value is IEnumerable enumerable && value.GetType() != typeof(string)) + foreach (object? listObject in enumerable) + FindEntitiesUnder(listObject); + } + } +}