Compare commits

...

3 Commits

Author SHA1 Message Date
Silver
9216ff9e4b Fix Dark eldritch issue with alertorderserializer 2022-03-17 14:13:26 -06:00
Silver
f1857f3c53 Adds AlertOrderSerializer 2022-03-14 16:03:08 -06:00
Silver
04b7181a78 Adds EnumReferenceSerializer 2022-03-03 12:29:37 -07:00
2 changed files with 99 additions and 0 deletions

View File

@@ -0,0 +1,66 @@
using System;
using System.Collections.Generic;
using Robust.Shared.IoC;
using Robust.Shared.Log;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.Manager;
using Robust.Shared.Serialization.Manager.Attributes;
using Robust.Shared.Serialization.Manager.Result;
using Robust.Shared.Serialization.Markdown;
using Robust.Shared.Serialization.Markdown.Mapping;
using Robust.Shared.Serialization.Markdown.Sequence;
using Robust.Shared.Serialization.Markdown.Validation;
using Robust.Shared.Serialization.Markdown.Value;
using Robust.Shared.Serialization.TypeSerializers.Interfaces;
namespace Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
[TypeSerializer]
public sealed class AlertOrderSerializer : ITypeReader<SortedDictionary<(string?,string?),int>, SequenceDataNode>
{
public DeserializationResult Read(ISerializationManager serializationManager, SequenceDataNode alertOrder,
IDependencyCollection dependencies, bool skipHook, ISerializationContext? context = null)
{
var deserializedAlertOrder = new SortedDictionary<(string?, string?),int>();
int idx = 0;
foreach (var alertOrderEntry in alertOrder.Sequence)
{
if (alertOrderEntry is not ValueDataNode key)
{
Logger.Error("failed to parse alertOrder entry key as it is not a MappingDataNode");
continue;
}
switch (key.Tag)
{
case "category":
deserializedAlertOrder[(key.Value, null)] = idx;
idx++;
break;
case "alertType:":
deserializedAlertOrder[("", key.Value)] = idx;
idx++;
break;
}
}
return new DeserializedValue<SortedDictionary<(string?, string?),int>>(deserializedAlertOrder);
}
public ValidationNode Validate(ISerializationManager serializationManager, SequenceDataNode alertOrder,
IDependencyCollection dependencies, ISerializationContext? context = null)
{
foreach (var alertOrderEntry in alertOrder.Sequence)
{
if (alertOrderEntry is ValueDataNode key) //TODO check Entry Value to see if the alertType is loaded.
{
if (key.Value is "category" or "alertType")
{
continue;
}
return new ErrorNode(alertOrder, "failed to parse alertOrder, key was not recognized as category or alertType");
}
return new ErrorNode(alertOrder, "failed to parse alertOrder, key/value is not a ValueDataNode");
}
return new ValidatedValueNode(alertOrder);
}
}

View File

@@ -0,0 +1,33 @@
using System;
using System.Runtime.InteropServices.ComTypes;
using Robust.Shared.IoC;
using Robust.Shared.Reflection;
using Robust.Shared.Serialization.Manager;
using Robust.Shared.Serialization.Manager.Attributes;
using Robust.Shared.Serialization.Manager.Result;
using Robust.Shared.Serialization.Markdown;
using Robust.Shared.Serialization.Markdown.Validation;
using Robust.Shared.Serialization.Markdown.Value;
using Robust.Shared.Serialization.TypeSerializers.Interfaces;
namespace Robust.Shared.Serialization.TypeSerializers.Implementations;
[TypeSerializer]
public sealed class EnumReferenceSerializer : ITypeReader<Enum, ValueDataNode>
{
public DeserializationResult Read(ISerializationManager serializationManager, ValueDataNode node,
IDependencyCollection dependencies, bool skipHook, ISerializationContext? context = null)
{
var deserializedEnumRef = dependencies.Resolve<IReflectionManager>()
.TryParseEnumReference(node.Value, out var enumRef) ? enumRef : null;
return new DeserializedValue<Enum>(deserializedEnumRef!);
}
public ValidationNode Validate(ISerializationManager serializationManager, ValueDataNode node,
IDependencyCollection dependencies, ISerializationContext? context = null)
{
return dependencies.Resolve<IReflectionManager>().TryParseEnumReference(node.Value, out _)
? new ValidatedValueNode(node)
: new ErrorNode(node, "Failed parsing EnumRef.");
}
}