using Pf2e.Common; using Pf2e.Database.Model.Base; using Pf2e.Database.Model.Structure; using Pf2e.Web.Helpers.Serialization; using Action = Pf2e.Database.Model.Structure.Action; namespace Pf2e.Web.Helpers; public class EntitySerialization { public EntitySerialization() { if (_builders.Count == 0) { RegisterBuilders(); } } /// /// Сериализует объект в результат сериализации. /// /// Объект для сериализации. /// Результат сериализации. public SerializationResult Serialize(object value) { SerializationResult result = new(); // Находим подходящий построитель для типа объекта EntityBuilder? builder = _builders.FirstOrDefault(b => b.EntityType == value.GetType()); if (builder != null) { result.Groups = builder.Compile(value); } else { // Если построитель не найден, создаём пустой результат result.Groups = []; } return result; } private static List _builders = []; private static EntityBuilder NewBuilder() where TEntity : class { EntityBuilder builder = new(); _builders.Add(builder); return builder; } private static void RegisterBuilders() { // Добавляем построитель для FullEntity NewBuilder() .AddGroup( "Основная сущность", builder => { builder.AddField(fe => fe.Entity).AddField(fe => fe.SubEntity); } ); NewBuilder() .AddGroup( "Сущность", builder => { builder .AddField(entity => entity.Id) .AddField(entity => entity.Name) .AddField(entity => entity.Type) .AddField(entity => entity.Slug) .AddField(entity => entity.Traits) .AddField(entity => entity.Description) .AddField(entity => entity.IsTranslated) .SetValueFormatter(v => (v as bool? == true) ? "Да" : "Нет") .AddField(entity => entity.IsChecked) .SetValueFormatter(v => (v as bool? == true) ? "Да" : "Нет") .AddField(entity => entity.IsLegacy) .SetValueFormatter(v => (v as bool? == true) ? "Да" : "Нет") .AddField(entity => entity.Keywords) .AddField(entity => entity.Sources) .AddField(entity => entity.LegacyEntities) .AddField(entity => entity.RemasterEntities); } ); NewBuilder() .AddGroup( "Действие", builder => { builder .AddField(a => a.Id) .AddField(a => a.Entity) .AddField(a => a.Actions) .AddField(a => a.Category) .AddField(a => a.Extra); } ); NewBuilder() .AddGroup( "Родословная", builder => { builder .AddField(a => a.Id) .AddField(a => a.Entity) .AddField(a => a.Size) .AddField(a => a.Hp) .AddField(a => a.Speed) .AddField(a => a.VisionEnum) .AddField(a => a.AncestryBoosts) .AddField(a => a.AncestryItems) .AddField(a => a.AncestryLanguages) .AddField(a => a.Heritages); } ); NewBuilder() .AddGroup( "Архетип", builder => { builder .AddField(a => a.Id) .AddField(a => a.Entity) .AddField(a => a.Level) .AddField(a => a.Extra) .AddField(a => a.DedicationFeat) .UseCommentFrom(a => a.DedicationFeatId) .AddField(a => a.Feats); } ); NewBuilder() .AddGroup( "Предыстория", builder => { builder .AddField(b => b.Id) .AddField(b => b.Entity) .AddField(b => b.BackgroundBoosts) .AddField(b => b.BackgroundItems) .AddField(b => b.BackgroundSkills); } ); NewBuilder() .AddGroup( "Класс", builder => { builder .AddField(c => c.Id) .AddField(c => c.Entity) .AddField(c => c.Hp) .AddField(c => c.Spellcasting) .AddField(c => c.Tradition) .AddField(c => c.AdditionalTrainedSkills) .AddField(c => c.ClassKeyAbilities) .AddField(c => c.ClassProgressions) .AddField(c => c.ClassTrainings) .AddField(c => c.SubclassGroups); } ); NewBuilder() .AddGroup( "Состояние", builder => { builder .AddField(c => c.Id) .AddField(c => c.Entity) .AddField(c => c.Group) .AddField(c => c.Extra); } ); NewBuilder() .AddGroup( "Божество", builder => { builder .AddField(d => d.Id) .AddField(d => d.Entity) .AddField(d => d.Type) .AddField(d => d.Category) .AddField(d => d.Fonts) .AddField(d => d.Sanctification) .AddField(d => d.SanctificationMust) .AddField(d => d.Edicts) .AddField(d => d.Anathema) .AddField(d => d.ReligiousSymbol) .AddField(d => d.SacredAnimal) .AddField(d => d.AreaOfConcern) .AddField(d => d.DeityAttributes) .AddField(d => d.DeityDomains) .AddField(d => d.DeitySpells) .AddField(d => d.DeityWeapons) .AddField(d => d.CategoryEntity) .UseCommentFrom(d => d.CategoryId) .AddField(d => d.Skills); } ); NewBuilder() .AddGroup( "Категория божества", builder => { builder .AddField(dc => dc.Id) .AddField(dc => dc.Entity) .AddField(dc => dc.Description); } ); NewBuilder() .AddGroup( "Домен", builder => { builder .AddField(d => d.Id) .AddField(d => d.Entity) .AddField(d => d.DomainSpell) .UseCommentFrom(d => d.DomainSpellId) .AddField(d => d.AdvancedDomainSpell) .UseCommentFrom(d => d.AdvancedDomainSpellId) .AddField(d => d.ApocryphalSpell) .UseCommentFrom(d => d.ApocryphalSpellId) .AddField(d => d.AdvancedApocryphalSpell) .UseCommentFrom(d => d.AdvancedApocryphalSpellId) .AddField(d => d.DeityDomains); } ); NewBuilder() .AddGroup( "Способность", builder => { builder .AddField(f => f.Id) .AddField(f => f.Entity) .AddField(f => f.Category) .AddField(f => f.Level) .AddField(f => f.Actions) .AddField(f => f.Extra) .AddField(f => f.Archetypes) .AddField(f => f.FeatPrerequisites); } ); NewBuilder() .AddGroup( "Наследие", builder => { builder .AddField(h => h.Id) .AddField(h => h.Entity) .AddField(h => h.Ancestry) .UseCommentFrom(h => h.AncestryId); } ); NewBuilder() .AddGroup( "Язык", builder => { builder.AddField(l => l.Id).AddField(l => l.Entity); } ); NewBuilder() .AddGroup( "Правило", builder => { builder .AddField(r => r.Id) .AddField(r => r.Entity) .AddField(r => r.Order) .AddField(r => r.Parent) .UseCommentFrom(r => r.ParentId) .AddField(r => r.Children) .AddField(r => r.Breadcrumbs); } ); NewBuilder() .AddGroup( "Ритуал", builder => { builder .AddField(r => r.Id) .AddField(r => r.Entity) .AddField(r => r.Level) .AddField(r => r.CastTime) .AddField(r => r.Duration) .AddField(r => r.Elements) .AddField(r => r.Range) .AddField(r => r.PrimaryCheckRank) .AddField(r => r.PrimaryCheckSuffix) .AddField(r => r.SecondaryCasters) .AddField(r => r.SecondaryCastersMax) .AddField(r => r.SecondaryCastersSuffix) .AddField(r => r.RangeString) .AddField(r => r.Target) .AddField(r => r.Cost) .AddField(r => r.Requirement) .AddField(r => r.Area) .AddField(r => r.Checks); } ); NewBuilder() .AddGroup( "Заклинание", builder => { builder .AddField(s => s.Id) .AddField(s => s.Entity) .AddField(s => s.Level) .AddField(s => s.IsFocus) .AddField(s => s.Actions) .AddField(s => s.Duration) .AddField(s => s.Range) .AddField(s => s.Traditions) .AddField(s => s.Elements) .AddField(s => s.Trigger) .AddField(s => s.Target) .AddField(s => s.Cost) .AddField(s => s.Requirement) .AddField(s => s.SpellAreas) .AddField(s => s.SpellDefenses); } ); NewBuilder() .AddGroup( "Подкласс", builder => { builder .AddField(s => s.Id) .AddField(s => s.Entity) .AddField(s => s.Group) .UseCommentFrom(s => s.GroupId) .AddField(s => s.Additional) .AddField(s => s.Extra) .AddField(s => s.Entities) .AddField(s => s.Trainings); } ); NewBuilder() .AddGroup( "Группа подклассов", builder => { builder .AddField(sg => sg.Id) .AddField(sg => sg.Entity) .AddField(sg => sg.Class) .UseCommentFrom(sg => sg.ClassId) .AddField(sg => sg.Subclasses); } ); NewBuilder() .AddGroup( "Признак", builder => { builder .AddField(t => t.Id) .AddField(t => t.Entity) .AddField(t => t.Type) .AddField(t => t.Entities); } ); } }