Merge branch 'serialization_v3_nodataclasses' of https://github.com/PaulRitter/RobustToolbox into serv3

This commit is contained in:
DrSmugleaf
2021-03-04 09:44:49 +01:00
41 changed files with 214 additions and 125 deletions

View File

@@ -34,7 +34,7 @@ namespace Robust.Client.Serialization
return serializationManager.Read(type, newNode, context, skipHook);
}
public ValidatedNode Validate(ISerializationManager serializationManager, MappingDataNode node,
public ValidationNode Validate(ISerializationManager serializationManager, MappingDataNode node,
ISerializationContext? context)
{
if (!node.TryGetNode("type", out var typeNode) || typeNode is not ValueDataNode valueNode)

View File

@@ -860,7 +860,7 @@ namespace Robust.Server.Maps
return new DeserializedValue<GridId>(GridId.Invalid);
}
ValidatedNode ITypeReader<IEntity, ValueDataNode>.Validate(ISerializationManager serializationManager,
ValidationNode ITypeReader<IEntity, ValueDataNode>.Validate(ISerializationManager serializationManager,
ValueDataNode node, ISerializationContext? context)
{
if (!int.TryParse(node.Value, out var val) || val >= Entities.Count)
@@ -871,7 +871,7 @@ namespace Robust.Server.Maps
return new ValidatedValueNode(node);
}
ValidatedNode ITypeReader<EntityUid, ValueDataNode>.Validate(ISerializationManager serializationManager,
ValidationNode ITypeReader<EntityUid, ValueDataNode>.Validate(ISerializationManager serializationManager,
ValueDataNode node, ISerializationContext? context)
{
if (node.Value == "null")
@@ -887,7 +887,7 @@ namespace Robust.Server.Maps
return new ValidatedValueNode(node);
}
ValidatedNode ITypeReader<GridId, ValueDataNode>.Validate(ISerializationManager serializationManager,
ValidationNode ITypeReader<GridId, ValueDataNode>.Validate(ISerializationManager serializationManager,
ValueDataNode node, ISerializationContext? context)
{
if (node.Value == "null") return new ValidatedValueNode(node);

View File

@@ -71,7 +71,7 @@ namespace Robust.Shared.Prototypes
/// </summary>
List<IPrototype> LoadDirectory(ResourcePath path);
Dictionary<Type, List<(string file, ValidatedNode node)>> ValidateDirectory(ResourcePath path);
Dictionary<string, HashSet<ErrorNode>> ValidateDirectory(ResourcePath path);
List<IPrototype> LoadFromStream(TextReader stream);
@@ -341,12 +341,12 @@ namespace Robust.Shared.Prototypes
return changedPrototypes;
}
public Dictionary<Type, List<(string file, ValidatedNode node)>> ValidateDirectory(ResourcePath path)
public Dictionary<string, HashSet<ErrorNode>> ValidateDirectory(ResourcePath path)
{
var streams = Resources.ContentFindFiles(path).ToList().AsParallel()
.Where(filePath => filePath.Extension == "yml" && !filePath.Filename.StartsWith("."));
var dict = new Dictionary<Type, List<(string file, ValidatedNode node)>>();
var dict = new Dictionary<string, HashSet<ErrorNode>>();
foreach (var resourcePath in streams)
{
using var reader = ReadFile(resourcePath);
@@ -375,12 +375,15 @@ namespace Robust.Shared.Prototypes
throw new PrototypeLoadException($"Unknown prototype type: '{type}'");
}
if (!dict.TryGetValue(prototypeTypes[type], out var hashSet))
dict[prototypeTypes[type]] = new List<(string, ValidatedNode)>();
var mapping = node.ToDataNodeCast<MappingDataNode>();
mapping.RemoveNode("type");
dict[prototypeTypes[type]].Add((resourcePath.ToString(), _serializationManager.ValidateNode(prototypeTypes[type], mapping)));
var errorNodes = _serializationManager.ValidateNode(prototypeTypes[type], mapping).GetErrors().ToHashSet();
if (errorNodes.Count != 0)
{
if (!dict.TryGetValue(resourcePath.ToString(), out var hashSet))
dict[resourcePath.ToString()] = new HashSet<ErrorNode>();
dict[resourcePath.ToString()].UnionWith(errorNodes);
}
}
}
}

View File

@@ -37,7 +37,7 @@ namespace Robust.Shared.Serialization.Manager
/// A node with whether or not <see cref="node"/> is valid and which of its fields
/// are invalid, if any.
/// </returns>
ValidatedNode ValidateNode(Type type, DataNode node, ISerializationContext? context = null);
ValidationNode ValidateNode(Type type, DataNode node, ISerializationContext? context = null);
/// <summary>
/// Validates that a node has all the properties required by a certain type with its serializer.
@@ -48,7 +48,7 @@ namespace Robust.Shared.Serialization.Manager
/// A node with whether or not <see cref="node"/> is valid and which of its fields
/// are invalid, if any.
/// </returns>
ValidatedNode ValidateNode<T>(DataNode node, ISerializationContext? context = null);
ValidationNode ValidateNode<T>(DataNode node, ISerializationContext? context = null);
/// <summary>
/// Creates a deserialization result from a generic type and its fields,
@@ -228,7 +228,7 @@ namespace Robust.Shared.Serialization.Manager
/// A node with whether or not <see cref="node"/> is valid and which of its fields
/// are invalid, if any.
/// </returns>
ValidatedNode ValidateFlag(Type tagType, DataNode node);
ValidationNode ValidateFlag(Type tagType, DataNode node);
/// <summary>
/// Deserializes a node into an enum value of the given type.
@@ -247,7 +247,7 @@ namespace Robust.Shared.Serialization.Manager
/// A node with whether or not <see cref="node"/> is valid and which of its fields
/// are invalid, if any.
/// </returns>
ValidatedNode ValidateConstant(Type tagType, DataNode node);
ValidationNode ValidateConstant(Type tagType, DataNode node);
/// <summary>
/// Serializes an enum flag into a node.

View File

@@ -12,7 +12,7 @@ namespace Robust.Shared.Serialization.Manager
bool skipHook,
ISerializationContext? context = null);
ValidatedNode Validate(ISerializationManager serializationManager, TNode node,
ValidationNode Validate(ISerializationManager serializationManager, TNode node,
ISerializationContext? context = null);
}
}

View File

@@ -130,9 +130,9 @@ namespace Robust.Shared.Serialization.Manager
return duplicates.Length > 0;
}
public ValidatedNode Validate(ISerializationManager serializationManager, MappingDataNode node, ISerializationContext? context)
public ValidationNode Validate(ISerializationManager serializationManager, MappingDataNode node, ISerializationContext? context)
{
var validatedmapping = new Dictionary<ValidatedNode, ValidatedNode>();
var validatedmapping = new Dictionary<ValidationNode, ValidationNode>();
foreach (var (key, val) in node.Children)
{
if (key is not ValueDataNode valueDataNode)

View File

@@ -119,7 +119,7 @@ namespace Robust.Shared.Serialization.Manager
return _dataDefinitions.ContainsKey(type);
}
public ValidatedNode ValidateNode(Type type, DataNode node, ISerializationContext? context = null)
public ValidationNode ValidateNode(Type type, DataNode node, ISerializationContext? context = null)
{
var underlyingType = type.EnsureNotNullableType();
@@ -132,7 +132,7 @@ namespace Robust.Shared.Serialization.Manager
var elementType = underlyingType.GetElementType();
if (elementType == null)
throw new ArgumentException($"Failed to get elementtype of arraytype {underlyingType}", nameof(underlyingType));
var validatedList = new List<ValidatedNode>();
var validatedList = new List<ValidationNode>();
foreach (var dataNode in sequenceDataNode.Sequence)
{
validatedList.Add(ValidateNode(elementType, dataNode, context));
@@ -190,7 +190,7 @@ namespace Robust.Shared.Serialization.Manager
return new ErrorNode(node, "Failed to read node.");
}
public ValidatedNode ValidateNode<T>(DataNode node, ISerializationContext? context = null)
public ValidationNode ValidateNode<T>(DataNode node, ISerializationContext? context = null)
{
return ValidateNode(typeof(T), node, context);
}

View File

@@ -98,7 +98,7 @@ namespace Robust.Shared.Serialization.Manager
}
}
public ValidatedNode ValidateFlag(Type tagType, DataNode node)
public ValidationNode ValidateFlag(Type tagType, DataNode node)
{
var flagType = GetFlagTypeFromTag(tagType);
switch (node)
@@ -125,7 +125,7 @@ namespace Robust.Shared.Serialization.Manager
return (int) Enum.Parse(constType, valueDataNode.Value);
}
public ValidatedNode ValidateConstant(Type tagType, DataNode node)
public ValidationNode ValidateConstant(Type tagType, DataNode node)
{
if (node is not ValueDataNode valueDataNode) return new ErrorNode(node, "Invalid nodetype for constant.");
var constType = GetConstantTypeFromTag(tagType);

View File

@@ -209,7 +209,7 @@ namespace Robust.Shared.Serialization.Manager
return false;
}
private bool TryValidateWithTypeReader(Type type, DataNode node, ISerializationContext? context, [NotNullWhen(true)] out ValidatedNode? valid)
private bool TryValidateWithTypeReader(Type type, DataNode node, ISerializationContext? context, [NotNullWhen(true)] out ValidationNode? valid)
{
//TODO Paul: do this shit w/ delegates
var method = typeof(SerializationManager).GetRuntimeMethods().First(m =>
@@ -220,7 +220,7 @@ namespace Robust.Shared.Serialization.Manager
if (res as bool? ?? false)
{
valid = (ValidatedNode)arr[2]!;
valid = (ValidationNode)arr[2]!;
return true;
}
@@ -231,7 +231,7 @@ namespace Robust.Shared.Serialization.Manager
private bool TryValidateWithTypeReader<T, TNode>(
TNode node,
ISerializationContext? context,
[NotNullWhen(true)] out ValidatedNode? valid)
[NotNullWhen(true)] out ValidationNode? valid)
where T : notnull
where TNode : DataNode
{

View File

@@ -5,6 +5,14 @@ namespace Robust.Shared.Serialization.Markdown
public abstract class DataNode
{
public string? Tag;
public DataPosition Start;
public DataPosition End;
public DataNode(DataPosition start, DataPosition end)
{
Start = start;
End = end;
}
public abstract DataNode Copy();
public abstract DataNode? Except(DataNode node);
@@ -17,6 +25,9 @@ namespace Robust.Shared.Serialization.Markdown
public abstract class DataNode<T> : DataNode where T : DataNode<T>
{
protected DataNode(DataPosition start, DataPosition end) : base(start, end)
{ }
public abstract override T Copy();
public abstract T? Except(T node);

View File

@@ -0,0 +1,35 @@
using System;
using YamlDotNet.Core;
namespace Robust.Shared.Serialization.Markdown
{
public struct DataPosition
{
public readonly int Line;
public readonly int Column;
public DataPosition(int line, int column)
{
Line = line;
Column = column;
}
public DataPosition(Mark mark)
{
Line = mark.Line;
Column = mark.Column;
}
public override int GetHashCode()
{
var code = new HashCode();
code.Add(Line.GetHashCode());
code.Add(Column.GetHashCode());
return code.ToHashCode();
}
public static DataPosition Invalid => new DataPosition(-1, -1);
public static implicit operator DataPosition(Mark mark) => new DataPosition(mark);
}
}

View File

@@ -13,9 +13,10 @@ namespace Robust.Shared.Serialization.Markdown
private Dictionary<DataNode, DataNode> _mapping = new();
public IReadOnlyDictionary<DataNode, DataNode> Children => _mapping;
public MappingDataNode() { }
public MappingDataNode() : base(DataPosition.Invalid, DataPosition.Invalid)
{ }
public MappingDataNode(YamlMappingNode mapping)
public MappingDataNode(YamlMappingNode mapping) : base(mapping.Start, mapping.End)
{
foreach (var (key, val) in mapping.Children)
{
@@ -25,7 +26,7 @@ namespace Robust.Shared.Serialization.Markdown
Tag = mapping.Tag;
}
public MappingDataNode(Dictionary<DataNode, DataNode> nodes)
public MappingDataNode(Dictionary<DataNode, DataNode> nodes) : this()
{
foreach (var (key, val) in nodes)
{
@@ -118,7 +119,7 @@ namespace Robust.Shared.Serialization.Markdown
public MappingDataNode Merge(MappingDataNode otherMapping)
{
var newMapping = (Copy() as MappingDataNode)!;
var newMapping = Copy();
foreach (var (key, val) in otherMapping.Children)
{
//intentionally provokes argumentexception
@@ -127,12 +128,21 @@ namespace Robust.Shared.Serialization.Markdown
newMapping.Tag = Tag;
//todo paul should prob make this smarter
newMapping.Start = Start;
newMapping.End = End;
return newMapping;
}
public override MappingDataNode Copy()
{
var newMapping = new MappingDataNode() {Tag = Tag};
var newMapping = new MappingDataNode()
{
Tag = Tag,
Start = Start,
End = End
};
foreach (var (key, val) in _mapping)
{
@@ -144,7 +154,7 @@ namespace Robust.Shared.Serialization.Markdown
public override MappingDataNode? Except(MappingDataNode node)
{
var mappingNode = new MappingDataNode();
var mappingNode = new MappingDataNode(){Tag = Tag, Start = Start, End = End};
foreach (var (key, val) in _mapping)
{

View File

@@ -9,14 +9,14 @@ namespace Robust.Shared.Serialization.Markdown
{
private readonly List<DataNode> _nodes = new();
public SequenceDataNode() { }
public SequenceDataNode() : base(DataPosition.Invalid, DataPosition.Invalid) { }
public SequenceDataNode(List<DataNode> nodes)
public SequenceDataNode(List<DataNode> nodes) : this()
{
_nodes = nodes;
}
public SequenceDataNode(YamlSequenceNode sequenceNode)
public SequenceDataNode(YamlSequenceNode sequenceNode) : base(sequenceNode.Start, sequenceNode.End)
{
foreach (var node in sequenceNode.Children)
{
@@ -26,7 +26,7 @@ namespace Robust.Shared.Serialization.Markdown
Tag = sequenceNode.Tag;
}
public SequenceDataNode(params DataNode[] nodes)
public SequenceDataNode(params DataNode[] nodes) : this()
{
foreach (var node in nodes)
{
@@ -34,7 +34,7 @@ namespace Robust.Shared.Serialization.Markdown
}
}
public SequenceDataNode(params string[] strings)
public SequenceDataNode(params string[] strings) : this()
{
foreach (var s in strings)
{
@@ -76,7 +76,12 @@ namespace Robust.Shared.Serialization.Markdown
public override SequenceDataNode Copy()
{
var newSequence = new SequenceDataNode() {Tag = Tag};
var newSequence = new SequenceDataNode()
{
Tag = Tag,
Start = Start,
End = End
};
foreach (var node in Sequence)
{
@@ -105,7 +110,12 @@ namespace Robust.Shared.Serialization.Markdown
{
if (!set.Contains(nodeNode)) newList.Add(nodeNode);
}
return new SequenceDataNode(newList);
return new SequenceDataNode(newList)
{
Tag = Tag,
Start = Start,
End = End
};
}
}
}

View File

@@ -1,27 +1,41 @@
using System;
using System.Collections.Generic;
namespace Robust.Shared.Serialization.Markdown.Validation
{
public class ErrorNode : ValidatedNode
public class ErrorNode : ValidationNode
{
public readonly DataNode Node;
public string ErrorReason;
public readonly string ErrorReason;
public readonly bool AlwaysRelevant;
public ErrorNode(DataNode node, string errorReason)
public ErrorNode(DataNode node, string errorReason, bool alwaysRelevant = false)
{
Node = node;
ErrorReason = errorReason;
AlwaysRelevant = alwaysRelevant;
}
public override bool Valid => false;
public override IEnumerable<string> Invalids()
public override IEnumerable<ErrorNode> GetErrors()
{
var str = Node.ToString();
if (str != null)
{
yield return $"{str} ({ErrorReason})";
}
yield return this;
}
public override int GetHashCode()
{
var code = new HashCode();
code.Add(Node.Start.GetHashCode());
code.Add(Node.End.GetHashCode());
code.Add(ErrorReason.GetHashCode());
return code.ToHashCode();
}
public override bool Equals(object? obj)
{
if (obj is not ErrorNode node) return false;
return Node.GetHashCode() == node.Node.GetHashCode(); // ErrorReason == node.ErrorReason
}
}
}

View File

@@ -3,7 +3,7 @@ using System.Linq;
namespace Robust.Shared.Serialization.Markdown.Validation
{
public class InconclusiveNode : ValidatedNode
public class InconclusiveNode : ValidationNode
{
public readonly DataNode DataNode;
@@ -14,7 +14,7 @@ namespace Robust.Shared.Serialization.Markdown.Validation
public override bool Valid => true;
public override IEnumerable<string> Invalids() => Enumerable.Empty<string>();
public override IEnumerable<ErrorNode> GetErrors() => Enumerable.Empty<ErrorNode>();
public override string? ToString()
{

View File

@@ -4,32 +4,27 @@ using System.Linq;
namespace Robust.Shared.Serialization.Markdown.Validation
{
public class ValidatedMappingNode : ValidatedNode
public class ValidatedMappingNode : ValidationNode
{
public readonly Dictionary<ValidatedNode, ValidatedNode> Mapping;
public readonly Dictionary<ValidationNode, ValidationNode> Mapping;
public override bool Valid => Mapping.All(p => p.Key.Valid && p.Value.Valid);
public override IEnumerable<string> Invalids()
public override IEnumerable<ErrorNode> GetErrors()
{
foreach (var (key, value) in Mapping.Where(p => !p.Key.Valid || !p.Value.Valid))
{
if (!key.Valid)
foreach (var invalid in key.GetErrors())
{
foreach (var invalid in key.Invalids())
{
yield return invalid;
}
yield return invalid;
}
else if (!value.Valid)
foreach (var invalid in value.GetErrors())
{
foreach (var invalid in value.Invalids())
{
yield return $"[{key}] <> {invalid}";
}
yield return invalid;
}
}
}
public ValidatedMappingNode(Dictionary<ValidatedNode, ValidatedNode> mapping)
public ValidatedMappingNode(Dictionary<ValidationNode, ValidationNode> mapping)
{
Mapping = mapping;
}

View File

@@ -4,26 +4,23 @@ using System.Linq;
namespace Robust.Shared.Serialization.Markdown.Validation
{
public class ValidatedSequenceNode : ValidatedNode
public class ValidatedSequenceNode : ValidationNode
{
public readonly List<ValidatedNode> Sequence;
public readonly List<ValidationNode> Sequence;
public override bool Valid => Sequence.All(p => p.Valid);
public override IEnumerable<string> Invalids()
public override IEnumerable<ErrorNode> GetErrors()
{
for (int i = 0; i < Sequence.Count; i++)
{
var entry = Sequence[i];
if(entry.Valid) continue;
foreach (var invalid in entry.Invalids())
foreach (var invalid in Sequence[i].GetErrors())
{
yield return $"[{i}] <> {invalid}";
yield return invalid;
}
}
}
public ValidatedSequenceNode(List<ValidatedNode> sequence)
public ValidatedSequenceNode(List<ValidationNode> sequence)
{
Sequence = sequence;
}

View File

@@ -3,7 +3,7 @@ using System.Linq;
namespace Robust.Shared.Serialization.Markdown.Validation
{
public class ValidatedValueNode : ValidatedNode
public class ValidatedValueNode : ValidationNode
{
public readonly DataNode DataNode;
@@ -14,7 +14,7 @@ namespace Robust.Shared.Serialization.Markdown.Validation
public override bool Valid => true;
public override IEnumerable<string> Invalids() => Enumerable.Empty<string>();
public override IEnumerable<ErrorNode> GetErrors() => Enumerable.Empty<ErrorNode>();
public override string? ToString()
{

View File

@@ -2,10 +2,10 @@ using System.Collections.Generic;
namespace Robust.Shared.Serialization.Markdown.Validation
{
public abstract class ValidatedNode
public abstract class ValidationNode
{
public abstract bool Valid { get; }
public abstract IEnumerable<string> Invalids();
public abstract IEnumerable<ErrorNode> GetErrors();
}
}

View File

@@ -1,16 +1,15 @@
using YamlDotNet.Core.Tokens;
using YamlDotNet.RepresentationModel;
namespace Robust.Shared.Serialization.Markdown
{
public class ValueDataNode : DataNode<ValueDataNode>
{
public ValueDataNode(string value)
public ValueDataNode(string value) : base(DataPosition.Invalid, DataPosition.Invalid)
{
Value = value;
}
public ValueDataNode(YamlScalarNode node)
public ValueDataNode(YamlScalarNode node) : base(node.Start, node.End)
{
Value = node.Value ?? "";
Tag = node.Tag;
@@ -20,7 +19,12 @@ namespace Robust.Shared.Serialization.Markdown
public override ValueDataNode Copy()
{
return new ValueDataNode(Value) {Tag = Tag};
return new ValueDataNode(Value)
{
Tag = Tag,
Start = Start,
End = End
};
}
public override ValueDataNode? Except(ValueDataNode node)
@@ -31,7 +35,7 @@ namespace Robust.Shared.Serialization.Markdown
public override bool Equals(object? obj)
{
if(obj is not ValueDataNode node) return base.Equals(obj);
if(obj is not ValueDataNode node) return false;
return node.Value == Value;
}

View File

@@ -26,7 +26,7 @@ namespace Robust.Shared.Serialization.TypeSerializers
return new DeserializedValue<Angle>(angle);
}
public ValidatedNode Validate(ISerializationManager serializationManager, ValueDataNode node,
public ValidationNode Validate(ISerializationManager serializationManager, ValueDataNode node,
ISerializationContext? context = null)
{
var nodeValue = node.Value;

View File

@@ -31,7 +31,7 @@ namespace Robust.Shared.Serialization.TypeSerializers
return new DeserializedValue<Box2>(new Box2(l, b, r, t));
}
public ValidatedNode Validate(ISerializationManager serializationManager, ValueDataNode node,
public ValidationNode Validate(ISerializationManager serializationManager, ValueDataNode node,
ISerializationContext? context = null)
{
var args = node.Value.Split(',');

View File

@@ -22,7 +22,7 @@ namespace Robust.Shared.Serialization.TypeSerializers
return new DeserializedValue<Color>(deserializedColor);
}
public ValidatedNode Validate(ISerializationManager serializationManager, ValueDataNode node,
public ValidationNode Validate(ISerializationManager serializationManager, ValueDataNode node,
ISerializationContext? context = null)
{
return Color.TryFromName(node.Value, out _) || Color.TryFromHex(node.Value) != null ? new ValidatedValueNode(node) : new ErrorNode(node, "Failed parsing Color.");

View File

@@ -79,12 +79,12 @@ namespace Robust.Shared.Serialization.TypeSerializers
return new DeserializedComponentRegistry(components, mappings);
}
public ValidatedNode Validate(ISerializationManager serializationManager, SequenceDataNode node,
public ValidationNode Validate(ISerializationManager serializationManager, SequenceDataNode node,
ISerializationContext? context = null)
{
var factory = serializationManager.ComponentFactory;
var components = new ComponentRegistry();
var list = new List<ValidatedNode>();
var list = new List<ValidationNode>();
foreach (var componentMapping in node.Sequence.Cast<MappingDataNode>())
{

View File

@@ -29,7 +29,7 @@ namespace Robust.Shared.Serialization.TypeSerializers
return new DeserializedValue<IEntity>(entity);
}
public ValidatedNode Validate(ISerializationManager serializationManager, ValueDataNode node,
public ValidationNode Validate(ISerializationManager serializationManager, ValueDataNode node,
ISerializationContext? context = null)
{
// TODO Paul should we be checking entity exists here

View File

@@ -17,7 +17,7 @@ namespace Robust.Shared.Serialization.TypeSerializers
return new DeserializedValue<FormattedMessage>(FormattedMessage.FromMarkup(node.Value));
}
public ValidatedNode Validate(ISerializationManager serializationManager, ValueDataNode node,
public ValidationNode Validate(ISerializationManager serializationManager, ValueDataNode node,
ISerializationContext? context = null)
{
return FormattedMessage.ValidMarkup(node.Value) ? new ValidatedValueNode(node) : new ErrorNode(node, "Invalid markup in FormattedMessage.");

View File

@@ -52,28 +52,28 @@ namespace Robust.Shared.Serialization.TypeSerializers.Generic
return new DeserializedDictionary<Dictionary<TKey, TValue>, TKey, TValue>(dict, mappedFields, dictInstance => dictInstance);
}
ValidatedNode ITypeReader<SortedDictionary<TKey, TValue>, MappingDataNode>.Validate(
ValidationNode ITypeReader<SortedDictionary<TKey, TValue>, MappingDataNode>.Validate(
ISerializationManager serializationManager, MappingDataNode node, ISerializationContext? context = null)
{
return Validate(serializationManager, node, context);
}
ValidatedNode ITypeReader<IReadOnlyDictionary<TKey, TValue>, MappingDataNode>.Validate(
ValidationNode ITypeReader<IReadOnlyDictionary<TKey, TValue>, MappingDataNode>.Validate(
ISerializationManager serializationManager, MappingDataNode node, ISerializationContext? context = null)
{
return Validate(serializationManager, node, context);
}
ValidatedNode ITypeReader<Dictionary<TKey, TValue>, MappingDataNode>.Validate(
ValidationNode ITypeReader<Dictionary<TKey, TValue>, MappingDataNode>.Validate(
ISerializationManager serializationManager,
MappingDataNode node, ISerializationContext? context = null)
{
return Validate(serializationManager, node, context);
}
ValidatedNode Validate(ISerializationManager serializationManager, MappingDataNode node, ISerializationContext? context)
ValidationNode Validate(ISerializationManager serializationManager, MappingDataNode node, ISerializationContext? context)
{
var mapping = new Dictionary<ValidatedNode, ValidatedNode>();
var mapping = new Dictionary<ValidationNode, ValidationNode>();
foreach (var (key, val) in node.Children)
{
mapping.Add(serializationManager.ValidateNode(typeof(TKey), key, context), serializationManager.ValidateNode(typeof(TValue), val, context));

View File

@@ -35,22 +35,22 @@ namespace Robust.Shared.Serialization.TypeSerializers.Generic
return new DeserializedCollection<HashSet<T>, T>(set, mappings, elements => new HashSet<T>(elements));
}
ValidatedNode ITypeReader<ImmutableHashSet<T>, SequenceDataNode>.Validate(
ValidationNode ITypeReader<ImmutableHashSet<T>, SequenceDataNode>.Validate(
ISerializationManager serializationManager,
SequenceDataNode node, ISerializationContext? context = null)
{
return Validate(serializationManager, node, context);
}
ValidatedNode ITypeReader<HashSet<T>, SequenceDataNode>.Validate(ISerializationManager serializationManager,
ValidationNode ITypeReader<HashSet<T>, SequenceDataNode>.Validate(ISerializationManager serializationManager,
SequenceDataNode node, ISerializationContext? context = null)
{
return Validate(serializationManager, node, context);
}
ValidatedNode Validate(ISerializationManager serializationManager, SequenceDataNode node, ISerializationContext? context)
ValidationNode Validate(ISerializationManager serializationManager, SequenceDataNode node, ISerializationContext? context)
{
var list = new List<ValidatedNode>();
var list = new List<ValidationNode>();
foreach (var elem in node.Sequence)
{
list.Add(serializationManager.ValidateNode(typeof(T), elem, context));

View File

@@ -74,36 +74,36 @@ namespace Robust.Shared.Serialization.TypeSerializers.Generic
return new DeserializedCollection<List<T>, T>(list, results, elements => elements);
}
ValidatedNode ITypeReader<ImmutableList<T>, SequenceDataNode>.Validate(
ValidationNode ITypeReader<ImmutableList<T>, SequenceDataNode>.Validate(
ISerializationManager serializationManager,
SequenceDataNode node, ISerializationContext? context = null)
{
return Validate(serializationManager, node, context);
}
ValidatedNode ITypeReader<IReadOnlyCollection<T>, SequenceDataNode>.Validate(
ValidationNode ITypeReader<IReadOnlyCollection<T>, SequenceDataNode>.Validate(
ISerializationManager serializationManager,
SequenceDataNode node, ISerializationContext? context = null)
{
return Validate(serializationManager, node, context);
}
ValidatedNode ITypeReader<IReadOnlyList<T>, SequenceDataNode>.Validate(
ValidationNode ITypeReader<IReadOnlyList<T>, SequenceDataNode>.Validate(
ISerializationManager serializationManager,
SequenceDataNode node, ISerializationContext? context = null)
{
return Validate(serializationManager, node, context);
}
ValidatedNode ITypeReader<List<T>, SequenceDataNode>.Validate(ISerializationManager serializationManager,
ValidationNode ITypeReader<List<T>, SequenceDataNode>.Validate(ISerializationManager serializationManager,
SequenceDataNode node, ISerializationContext? context = null)
{
return Validate(serializationManager, node, context);
}
ValidatedNode Validate(ISerializationManager serializationManager, SequenceDataNode sequenceDataNode, ISerializationContext? context)
ValidationNode Validate(ISerializationManager serializationManager, SequenceDataNode sequenceDataNode, ISerializationContext? context)
{
var list = new List<ValidatedNode>();
var list = new List<ValidationNode>();
foreach (var elem in sequenceDataNode.Sequence)
{
list.Add(serializationManager.ValidateNode(typeof(T), elem, context));

View File

@@ -26,13 +26,13 @@ namespace Robust.Shared.Serialization.TypeSerializers.Generic
return DeserializationResult.Value(new ValueTuple<T1, T2>(v1, v2));
}
public ValidatedNode Validate(ISerializationManager serializationManager, MappingDataNode node,
public ValidationNode Validate(ISerializationManager serializationManager, MappingDataNode node,
ISerializationContext? context = null)
{
if (node.Children.Count != 1) return new ErrorNode(node, "More or less than 1 Mapping for ValueTuple found.");
var entry = node.Children.First();
var dict = new Dictionary<ValidatedNode, ValidatedNode>
var dict = new Dictionary<ValidationNode, ValidationNode>
{
{
serializationManager.ValidateNode(typeof(T1), entry.Key, context),

View File

@@ -20,7 +20,7 @@ namespace Robust.Shared.Serialization.TypeSerializers
return new DeserializedValue<MapId>(new MapId(val));
}
public ValidatedNode Validate(ISerializationManager serializationManager, ValueDataNode node,
public ValidationNode Validate(ISerializationManager serializationManager, ValueDataNode node,
ISerializationContext? context = null)
{
return int.TryParse(node.Value, out _) ? new ValidatedValueNode(node) : new ErrorNode(node, "Failed parsing MapId");

View File

@@ -19,7 +19,7 @@ namespace Robust.Shared.Serialization.TypeSerializers
return new DeserializedValue<Regex>(new Regex(node.Value, RegexOptions.Compiled));
}
public ValidatedNode Validate(ISerializationManager serializationManager, ValueDataNode node,
public ValidationNode Validate(ISerializationManager serializationManager, ValueDataNode node,
ISerializationContext? context = null)
{
try

View File

@@ -1,6 +1,7 @@
using System;
using JetBrains.Annotations;
using Robust.Shared.ContentPack;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Serialization.Manager;
using Robust.Shared.Serialization.Manager.Attributes;
@@ -21,18 +22,27 @@ namespace Robust.Shared.Serialization.TypeSerializers
return new DeserializedValue<ResourcePath>(new ResourcePath(node.Value));
}
public ValidatedNode Validate(ISerializationManager serializationManager, ValueDataNode node,
public ValidationNode Validate(ISerializationManager serializationManager, ValueDataNode node,
ISerializationContext? context = null)
{
var path = node.Value;
if (path.EndsWith(".rsi"))
{
path = $"{path}{ResourcePath.SYSTEM_SEPARATOR}meta.json";
if (!path.StartsWith(ResourcePath.SYSTEM_SEPARATOR))
{
path = $"{SharedSpriteComponent.TextureRoot}{ResourcePath.SYSTEM_SEPARATOR}{path}";
}
}
try
{
return IoCManager.Resolve<IResourceManager>().ContentFileExists(new ResourcePath(node.Value))
return IoCManager.Resolve<IResourceManager>().ContentFileExists(new ResourcePath(path))
? new ValidatedValueNode(node)
: new ErrorNode(node, "File not found.");
: new ErrorNode(node, $"File not found. ({path})", true);
}
catch (Exception e)
{
return new ErrorNode(node, "Failed parsing filepath.");
return new ErrorNode(node, $"Failed parsing filepath. ({path}) ({e.Message})", true);
}
}

View File

@@ -73,7 +73,7 @@ namespace Robust.Shared.Serialization.TypeSerializers
return ((ITypeReader<Rsi, MappingDataNode>) this).Read(serializationManager, node, skipHook, context);
}
ValidatedNode ITypeReader<SpriteSpecifier, ValueDataNode>.Validate(ISerializationManager serializationManager, ValueDataNode node,
ValidationNode ITypeReader<SpriteSpecifier, ValueDataNode>.Validate(ISerializationManager serializationManager, ValueDataNode node,
ISerializationContext? context)
{
var texNode = ((ITypeReader<Texture, ValueDataNode>) this).Validate(serializationManager, node, context);
@@ -85,7 +85,7 @@ namespace Robust.Shared.Serialization.TypeSerializers
return new ValidatedValueNode(node);
}
ValidatedNode ITypeReader<EntityPrototype, ValueDataNode>.Validate(ISerializationManager serializationManager, ValueDataNode node,
ValidationNode ITypeReader<EntityPrototype, ValueDataNode>.Validate(ISerializationManager serializationManager, ValueDataNode node,
ISerializationContext? context)
{
//todo paul actually validate the id
@@ -93,19 +93,19 @@ namespace Robust.Shared.Serialization.TypeSerializers
}
ValidatedNode ITypeReader<Texture, ValueDataNode>.Validate(ISerializationManager serializationManager, ValueDataNode node,
ValidationNode ITypeReader<Texture, ValueDataNode>.Validate(ISerializationManager serializationManager, ValueDataNode node,
ISerializationContext? context)
{
return serializationManager.ValidateNode(typeof(ResourcePath), new ValueDataNode($"{SharedSpriteComponent.TextureRoot / node.Value}"), context);
}
ValidatedNode ITypeReader<SpriteSpecifier, MappingDataNode>.Validate(ISerializationManager serializationManager, MappingDataNode node,
ValidationNode ITypeReader<SpriteSpecifier, MappingDataNode>.Validate(ISerializationManager serializationManager, MappingDataNode node,
ISerializationContext? context)
{
return ((ITypeReader<Rsi, MappingDataNode>) this).Validate(serializationManager, node, context);
}
ValidatedNode ITypeReader<Rsi, MappingDataNode>.Validate(ISerializationManager serializationManager, MappingDataNode node,
ValidationNode ITypeReader<Rsi, MappingDataNode>.Validate(ISerializationManager serializationManager, MappingDataNode node,
ISerializationContext? context)
{
if (!node.TryGetNode("sprite", out var pathNode) || pathNode is not ValueDataNode valuePathNode)
@@ -118,7 +118,7 @@ namespace Robust.Shared.Serialization.TypeSerializers
return new ErrorNode(node, "Missing/Invalid statenode");
}
var path = serializationManager.ValidateNode(typeof(ResourcePath), new ValueDataNode($"{(SharedSpriteComponent.TextureRoot / valuePathNode.Value) / "meta.json"}"), context);
var path = serializationManager.ValidateNode(typeof(ResourcePath), new ValueDataNode($"{SharedSpriteComponent.TextureRoot / valuePathNode.Value}"), context);
if (path is ErrorNode) return path;

View File

@@ -17,7 +17,7 @@ namespace Robust.Shared.Serialization.TypeSerializers
return new DeserializedValue<string>(node.Value);
}
public ValidatedNode Validate(ISerializationManager serializationManager, ValueDataNode node,
public ValidationNode Validate(ISerializationManager serializationManager, ValueDataNode node,
ISerializationContext? context = null)
{
return new ValidatedValueNode(node);

View File

@@ -20,7 +20,7 @@ namespace Robust.Shared.Serialization.TypeSerializers
return new DeserializedValue<TimeSpan>(TimeSpan.FromSeconds(seconds));
}
public ValidatedNode Validate(ISerializationManager serializationManager, ValueDataNode node,
public ValidationNode Validate(ISerializationManager serializationManager, ValueDataNode node,
ISerializationContext? context = null)
{
return double.TryParse(node.Value, NumberStyles.Any, CultureInfo.InvariantCulture, out _)

View File

@@ -31,7 +31,7 @@ namespace Robust.Shared.Serialization.TypeSerializers
return new DeserializedValue<UIBox2>(new UIBox2(l, t, r, b));
}
public ValidatedNode Validate(ISerializationManager serializationManager, ValueDataNode node,
public ValidationNode Validate(ISerializationManager serializationManager, ValueDataNode node,
ISerializationContext? context = null)
{
string raw = node.Value;

View File

@@ -30,7 +30,7 @@ namespace Robust.Shared.Serialization.TypeSerializers
return new DeserializedValue<Vector2>(vector);
}
public ValidatedNode Validate(ISerializationManager serializationManager, ValueDataNode node,
public ValidationNode Validate(ISerializationManager serializationManager, ValueDataNode node,
ISerializationContext? context = null)
{
string raw = node.Value;

View File

@@ -30,7 +30,7 @@ namespace Robust.Shared.Serialization.TypeSerializers
return new DeserializedValue<Vector2i>(vector);
}
public ValidatedNode Validate(ISerializationManager serializationManager, ValueDataNode node,
public ValidationNode Validate(ISerializationManager serializationManager, ValueDataNode node,
ISerializationContext? context = null)
{
string raw = node.Value;

View File

@@ -31,7 +31,7 @@ namespace Robust.Shared.Serialization.TypeSerializers
return new DeserializedValue<Vector3>(vector);
}
public ValidatedNode Validate(ISerializationManager serializationManager, ValueDataNode node,
public ValidationNode Validate(ISerializationManager serializationManager, ValueDataNode node,
ISerializationContext? context = null)
{
string raw = node.Value;

View File

@@ -32,7 +32,7 @@ namespace Robust.Shared.Serialization.TypeSerializers
return new DeserializedValue<Vector4>(vector);
}
public ValidatedNode Validate(ISerializationManager serializationManager, ValueDataNode node,
public ValidationNode Validate(ISerializationManager serializationManager, ValueDataNode node,
ISerializationContext? context = null)
{
string raw = node.Value;