Infer type for EntSelector (#30856)

Infer type for EntSelector.cs
This commit is contained in:
Nemanja
2024-08-10 10:17:45 -04:00
committed by GitHub
parent 2b4acde2c8
commit fdbf2a229e
5 changed files with 317 additions and 555 deletions

View File

@@ -8,7 +8,9 @@ namespace Content.Shared.EntityTable.EntitySelectors;
/// </summary>
public sealed partial class EntSelector : EntityTableSelector
{
[DataField(required: true)]
public const string IdDataFieldTag = "id";
[DataField(IdDataFieldTag, required: true)]
public EntProtoId Id;
[DataField]

View File

@@ -0,0 +1,37 @@
using Robust.Shared.Serialization;
using Robust.Shared.Serialization.Manager;
using Robust.Shared.Serialization.Markdown.Mapping;
using Robust.Shared.Serialization.Markdown.Validation;
using Robust.Shared.Serialization.TypeSerializers.Interfaces;
namespace Content.Shared.EntityTable.EntitySelectors;
[TypeSerializer]
public sealed class EntityTableTypeSerializer :
ITypeReader<EntityTableSelector, MappingDataNode>
{
public ValidationNode Validate(ISerializationManager serializationManager,
MappingDataNode node,
IDependencyCollection dependencies,
ISerializationContext? context = null)
{
if (node.Has(EntSelector.IdDataFieldTag))
return serializationManager.ValidateNode<EntSelector>(node, context);
return new ErrorNode(node, "Custom validation not supported! Please specify the type manually!");
}
public EntityTableSelector Read(ISerializationManager serializationManager,
MappingDataNode node,
IDependencyCollection dependencies,
SerializationHookContext hookCtx,
ISerializationContext? context = null,
ISerializationManager.InstantiationDelegate<EntityTableSelector>? instanceProvider = null)
{
var type = typeof(EntityTableSelector);
if (node.Has(EntSelector.IdDataFieldTag))
type = typeof(EntSelector);
return (EntityTableSelector) serializationManager.Read(type, node, context)!;
}
}