Add DateTimeSerializer

This commit is contained in:
Pieter-Jan Briers
2024-02-11 16:40:52 +01:00
parent a3047b1687
commit 74622bac83
3 changed files with 97 additions and 0 deletions

View File

@@ -40,6 +40,7 @@ END TEMPLATE-->
### New features
* You can use `Subs.CVar()` from an entity systems to subscribe to CVar changes. This is more convenient than `IConfigurationManager.OnValueChanged` as it automatically unsubscribes on system shutdown.
* There is now a built-in type serializer for `DateTime`, so you can put `DateTime`s in your data fields.
### Bugfixes

View File

@@ -0,0 +1,65 @@
using System;
using System.Globalization;
using JetBrains.Annotations;
using Robust.Shared.IoC;
using Robust.Shared.Serialization.Manager;
using Robust.Shared.Serialization.Manager.Attributes;
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;
/// <summary>
/// Implements serialization for <see cref="DateTime"/>.
/// </summary>
/// <remarks>
/// Serialization is implemented with <see cref="DateTimeStyles.RoundtripKind"/> and the "o" format specifier.
/// </remarks>
[TypeSerializer]
public sealed class DateTimeSerializer : ITypeSerializer<DateTime, ValueDataNode>, ITypeCopyCreator<DateTime>
{
public ValidationNode Validate(
ISerializationManager serializationManager,
ValueDataNode node,
IDependencyCollection dependencies,
ISerializationContext? context = null)
{
return DateTime.TryParse(node.Value, null, DateTimeStyles.RoundtripKind, out _)
? new ValidatedValueNode(node)
: new ErrorNode(node, "Failed parsing DateTime");
}
public DateTime Read(
ISerializationManager serializationManager,
ValueDataNode node,
IDependencyCollection dependencies,
SerializationHookContext hookCtx,
ISerializationContext? context = null,
ISerializationManager.InstantiationDelegate<DateTime>? instanceProvider = null)
{
return DateTime.Parse(node.Value, null, DateTimeStyles.RoundtripKind);
}
public DataNode Write(
ISerializationManager serializationManager,
DateTime value,
IDependencyCollection dependencies,
bool alwaysWrite = false,
ISerializationContext? context = null)
{
return new ValueDataNode(value.ToString("o"));
}
[MustUseReturnValue]
public DateTime CreateCopy(
ISerializationManager serializationManager,
DateTime source,
IDependencyCollection dependencies,
SerializationHookContext hookCtx,
ISerializationContext? context = null)
{
return source;
}
}

View File

@@ -0,0 +1,31 @@
using System;
using System.Globalization;
using NUnit.Framework;
using Robust.Shared.Serialization.Manager;
using Robust.Shared.Serialization.Markdown.Value;
using Robust.Shared.Serialization.TypeSerializers.Implementations;
namespace Robust.UnitTesting.Shared.Serialization.TypeSerializers;
[TestFixture]
[TestOf(typeof(DateTimeSerializer))]
internal sealed class DateTimeSerializerTest : SerializationTest
{
[Test]
public void WriteTest()
{
var dateTime = DateTime.UtcNow;
var result = Serialization.WriteValueAs<ValueDataNode>(dateTime);
var parsed = DateTime.Parse(result.Value, null, DateTimeStyles.RoundtripKind);
Assert.That(parsed, Is.EqualTo(dateTime));
}
[Test]
public void ReadTest()
{
var result = Serialization.Read<DateTime>(new ValueDataNode("2020-07-10 15:00:00.000"));
Assert.That(result, Is.EqualTo(new DateTime(2020, 07, 10, 15, 0, 0)));
}
}