From 86662c7e149e76b42f8069ae4429bb35e93bbb50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Wed, 29 Dec 2021 15:14:57 +0100 Subject: [PATCH] feat: allow nullables in converters --- .../Converters/BaseTypeConverter.cs | 8 ++++---- .../Converters/Basic/BasicTypeConverter.cs | 13 +++++++++---- Core/NosSmooth.Packets/Converters/ITypeConverter.cs | 8 ++++---- .../Converters/Packets/InPacketConverter.cs | 4 ++-- .../Converters/TypeConverterRepository.cs | 8 ++++---- Core/NosSmooth.Packets/Errors/WrongTypeError.cs | 4 ++-- 6 files changed, 25 insertions(+), 20 deletions(-) diff --git a/Core/NosSmooth.Packets/Converters/BaseTypeConverter.cs b/Core/NosSmooth.Packets/Converters/BaseTypeConverter.cs index c578bfbde5f79438d5ff2559da39c896f66b40f8..48e020686d658128fc6fc7b8284a3746023803f8 100644 --- a/Core/NosSmooth.Packets/Converters/BaseTypeConverter.cs +++ b/Core/NosSmooth.Packets/Converters/BaseTypeConverter.cs @@ -16,17 +16,17 @@ namespace NosSmooth.Packets.Converters; public abstract class BaseTypeConverter : ITypeConverter { /// - public abstract Result Serialize(TParseType obj, PacketStringBuilder builder); + public abstract Result Serialize(TParseType? obj, PacketStringBuilder builder); /// - public abstract Result Deserialize(PacketStringEnumerator stringEnumerator); + public abstract Result Deserialize(PacketStringEnumerator stringEnumerator); /// - Result ITypeConverter.Deserialize(PacketStringEnumerator stringEnumerator) + Result ITypeConverter.Deserialize(PacketStringEnumerator stringEnumerator) => Deserialize(stringEnumerator); /// - Result ITypeConverter.Serialize(object obj, PacketStringBuilder builder) + Result ITypeConverter.Serialize(object? obj, PacketStringBuilder builder) { if (!(obj is TParseType parseType)) { diff --git a/Core/NosSmooth.Packets/Converters/Basic/BasicTypeConverter.cs b/Core/NosSmooth.Packets/Converters/Basic/BasicTypeConverter.cs index c941f453274bb61dc27e2f0ff4b29342798f5504..16cf5af7cff97fa8e2312142786d167992e2dc7a 100644 --- a/Core/NosSmooth.Packets/Converters/Basic/BasicTypeConverter.cs +++ b/Core/NosSmooth.Packets/Converters/Basic/BasicTypeConverter.cs @@ -16,19 +16,24 @@ namespace NosSmooth.Packets.Converters.Basic; public abstract class BasicTypeConverter : BaseTypeConverter { /// - public override Result Serialize(TBasicType obj, PacketStringBuilder builder) + public override Result Serialize(TBasicType? obj, PacketStringBuilder builder) { builder.Append(obj?.ToString() ?? "-"); return Result.FromSuccess(); } /// - public override Result Deserialize(PacketStringEnumerator stringEnumerator) + public override Result Deserialize(PacketStringEnumerator stringEnumerator) { var nextTokenResult = stringEnumerator.GetNextToken(); if (!nextTokenResult.IsSuccess) { - return Result.FromError(nextTokenResult); + return Result.FromError(nextTokenResult); + } + + if (nextTokenResult.Entity.Token == "-") + { + return Result.FromSuccess(default); } return Deserialize(nextTokenResult.Entity.Token); @@ -39,5 +44,5 @@ public abstract class BasicTypeConverter : BaseTypeConverter /// The value to deserialize. /// The deserialized value or an error. - protected abstract Result Deserialize(string value); + protected abstract Result Deserialize(string value); } \ No newline at end of file diff --git a/Core/NosSmooth.Packets/Converters/ITypeConverter.cs b/Core/NosSmooth.Packets/Converters/ITypeConverter.cs index 691089cb2ba8b54733fe0a454dd57d3a30ae23a6..a68ee8c7dda944e7c1eb18e965389adac6f830ad 100644 --- a/Core/NosSmooth.Packets/Converters/ITypeConverter.cs +++ b/Core/NosSmooth.Packets/Converters/ITypeConverter.cs @@ -18,7 +18,7 @@ public interface ITypeConverter /// /// The packet string enumerator with the current position. /// The parsed object or an error. - public Result Deserialize(PacketStringEnumerator stringEnumerator); + public Result Deserialize(PacketStringEnumerator stringEnumerator); /// /// Serializes the given object to string by appending to the packet string builder. @@ -26,7 +26,7 @@ public interface ITypeConverter /// The object to serialize. /// The string builder to append to. /// A result that may or may not have succeeded. - public Result Serialize(object obj, PacketStringBuilder builder); + public Result Serialize(object? obj, PacketStringBuilder builder); } /// @@ -43,7 +43,7 @@ public interface ITypeConverter : ITypeConverter /// /// The packet string enumerator with the current position. /// The parsed object or an error. - public new Result Deserialize(PacketStringEnumerator stringEnumerator); + public new Result Deserialize(PacketStringEnumerator stringEnumerator); /// /// Serializes the given object to string by appending to the packet string builder. @@ -51,5 +51,5 @@ public interface ITypeConverter : ITypeConverter /// The object to serialize. /// The string builder to append to. /// A result that may or may not have succeeded. - public Result Serialize(TParseType obj, PacketStringBuilder builder); + public Result Serialize(TParseType? obj, PacketStringBuilder builder); } \ No newline at end of file diff --git a/Core/NosSmooth.Packets/Converters/Packets/InPacketConverter.cs b/Core/NosSmooth.Packets/Converters/Packets/InPacketConverter.cs index 512668488eebb49c4e97fae15d70d7a16d4a5062..71dfc9e6ce23f147432fbf562f8dcf7db437416f 100644 --- a/Core/NosSmooth.Packets/Converters/Packets/InPacketConverter.cs +++ b/Core/NosSmooth.Packets/Converters/Packets/InPacketConverter.cs @@ -15,13 +15,13 @@ namespace NosSmooth.Packets.Converters.Packets; public class InPacketConverter : BaseTypeConverter { /// - public override Result Serialize(InPacket obj, PacketStringBuilder builder) + public override Result Serialize(InPacket? obj, PacketStringBuilder builder) { throw new System.NotImplementedException(); } /// - public override Result Deserialize(PacketStringEnumerator stringEnumerator) + public override Result Deserialize(PacketStringEnumerator stringEnumerator) { throw new System.NotImplementedException(); } diff --git a/Core/NosSmooth.Packets/Converters/TypeConverterRepository.cs b/Core/NosSmooth.Packets/Converters/TypeConverterRepository.cs index 42a57f86aedac16961c907b1bb3b7edc519e669d..48a87447cd3ac8d773a8441ce65da2cd17b877dc 100644 --- a/Core/NosSmooth.Packets/Converters/TypeConverterRepository.cs +++ b/Core/NosSmooth.Packets/Converters/TypeConverterRepository.cs @@ -138,7 +138,7 @@ public class TypeConverterRepository : ITypeConverterRepository /// The packet string enumerator with the current position. /// The type of the object to serialize. /// The parsed object or an error. - public Result Deserialize(PacketStringEnumerator stringEnumerator) + public Result Deserialize(PacketStringEnumerator stringEnumerator) { var specialConverter = GetSpecialConverter(typeof(TParseType)); if (specialConverter is not null) @@ -146,7 +146,7 @@ public class TypeConverterRepository : ITypeConverterRepository var deserializeResult = specialConverter.Deserialize(typeof(TParseType), stringEnumerator); if (!deserializeResult.IsSuccess) { - return Result.FromError(deserializeResult); + return Result.FromError(deserializeResult); } if (deserializeResult.Entity is null) @@ -156,7 +156,7 @@ public class TypeConverterRepository : ITypeConverterRepository return default; } - return Result.FromError(new DeserializedValueNullError(typeof(TParseType))); + return Result.FromError(new DeserializedValueNullError(typeof(TParseType))); } return (TParseType)deserializeResult.Entity; @@ -165,7 +165,7 @@ public class TypeConverterRepository : ITypeConverterRepository var converterResult = GetTypeConverter(); if (!converterResult.IsSuccess) { - return Result.FromError(converterResult); + return Result.FromError(converterResult); } return converterResult.Entity.Deserialize(stringEnumerator); diff --git a/Core/NosSmooth.Packets/Errors/WrongTypeError.cs b/Core/NosSmooth.Packets/Errors/WrongTypeError.cs index 8e9ac86701186d2c3a0eb86353ecfd6a8d0d5161..7f28fdaa7c54280390e6a13f06deb4429185ec35 100644 --- a/Core/NosSmooth.Packets/Errors/WrongTypeError.cs +++ b/Core/NosSmooth.Packets/Errors/WrongTypeError.cs @@ -16,5 +16,5 @@ namespace NosSmooth.Packets.Errors; /// The converter that failed to convert the object. /// The expected type of the converting object. /// The actual object the converter got. -public record WrongTypeError(ITypeConverter TypeConverter, Type ExpectedType, object ActualObject) - : ResultError($"{TypeConverter.GetType().FullName} expected type {ExpectedType.FullName}, but got {ActualObject.GetType().FullName}"); \ No newline at end of file +public record WrongTypeError(ITypeConverter TypeConverter, Type ExpectedType, object? ActualObject) + : ResultError($"{TypeConverter.GetType().FullName} expected type {ExpectedType.FullName}, but got {ActualObject?.GetType().FullName ?? "null"}"); \ No newline at end of file