From f5ff5c651b237be3ba2975c2d2b16fc438b96068 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Sat, 7 Jan 2023 14:20:12 +0100 Subject: [PATCH] feat(packets): pass nullable to packet serializers --- .../BaseStringConverter.cs | 6 ++--- .../DeserializeOptions.cs | 27 +++++++++++++++++++ .../IStringConverter.cs | 6 +++-- .../IStringSerializer.cs | 6 +++-- .../NullableWrapper.cs | 5 ++++ .../Converters/Basic/BasicTypeConverter.cs | 11 +++++--- .../Converters/Basic/BoolStringConverter.cs | 13 +++------ .../Converters/Common/NameStringConverter.cs | 9 ++++--- .../Common/NullableWrapperConverter.cs | 4 +-- .../Packets/UpgradeRareSubPacketConverter.cs | 2 +- .../Special/Converters/EnumStringConverter.cs | 4 +-- .../Special/Converters/ListStringConverter.cs | 4 +-- .../Converters/NullableStringConverter.cs | 4 +-- .../Converters/Special/StringSerializer.cs | 8 +++--- .../PacketSerializer.cs | 2 +- .../ConverterDeserializationGenerator.cs | 2 +- .../BasicInlineConverterGenerator.cs | 13 +++++---- .../BoolInlineConverterGenerator.cs | 13 +++++---- .../EnumInlineConverterGenerator.cs | 6 ++--- .../FallbackInlineConverterGenerator.cs | 5 ++-- .../IInlineConverterGenerator.cs | 3 ++- .../ListInlineConverterGenerator.cs | 23 ++++++++++------ .../StringInlineConverterGenerator.cs | 13 +++++---- .../InlineTypeConverterGenerator.cs | 15 ++++++----- .../PacketConverterGenerator.cs | 2 +- .../SourceGenerator.cs | 6 ----- 26 files changed, 132 insertions(+), 80 deletions(-) create mode 100644 Packets/NosSmooth.PacketSerializer.Abstractions/DeserializeOptions.cs diff --git a/Packets/NosSmooth.PacketSerializer.Abstractions/BaseStringConverter.cs b/Packets/NosSmooth.PacketSerializer.Abstractions/BaseStringConverter.cs index 2d48f62..f1c8ef9 100644 --- a/Packets/NosSmooth.PacketSerializer.Abstractions/BaseStringConverter.cs +++ b/Packets/NosSmooth.PacketSerializer.Abstractions/BaseStringConverter.cs @@ -19,12 +19,12 @@ public abstract class BaseStringConverter : IStringConverter - public abstract Result Deserialize(ref PacketStringEnumerator stringEnumerator); + public abstract Result Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options); /// - Result IStringConverter.Deserialize(ref PacketStringEnumerator stringEnumerator) + Result IStringConverter.Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options) { - var result = Deserialize(ref stringEnumerator); + var result = Deserialize(ref stringEnumerator, options); if (!result.IsSuccess) { return Result.FromError(result); diff --git a/Packets/NosSmooth.PacketSerializer.Abstractions/DeserializeOptions.cs b/Packets/NosSmooth.PacketSerializer.Abstractions/DeserializeOptions.cs new file mode 100644 index 0000000..13d8895 --- /dev/null +++ b/Packets/NosSmooth.PacketSerializer.Abstractions/DeserializeOptions.cs @@ -0,0 +1,27 @@ +// +// DeserializeOptions.cs +// +// Copyright (c) František Boháček. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Diagnostics.CodeAnalysis; + +namespace NosSmooth.PacketSerializer.Abstractions; + +/// +/// Options for deserialization. +/// +/// Whether the argument may be null. +[SuppressMessage +( + "StyleCop.CSharp.NamingRules", + "SA1313:Parameter names should begin with lower-case letter", + Justification = "Fix this." +)] +public record struct DeserializeOptions(bool CanBeNull = false) +{ + /// + /// Gets the nullable deserialize options. + /// + public static DeserializeOptions Nullable => new DeserializeOptions(true); +} \ No newline at end of file diff --git a/Packets/NosSmooth.PacketSerializer.Abstractions/IStringConverter.cs b/Packets/NosSmooth.PacketSerializer.Abstractions/IStringConverter.cs index 9979ebe..3c4d6e9 100644 --- a/Packets/NosSmooth.PacketSerializer.Abstractions/IStringConverter.cs +++ b/Packets/NosSmooth.PacketSerializer.Abstractions/IStringConverter.cs @@ -17,8 +17,9 @@ public interface IStringConverter /// Convert the data from the enumerator to the given type. /// /// The packet string enumerator with the current position. + /// The deserialization options. /// The parsed object or an error. - public Result Deserialize(ref PacketStringEnumerator stringEnumerator); + public Result Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options); /// /// Serializes the given object to string by appending to the packet string builder. @@ -42,8 +43,9 @@ public interface IStringConverter : IStringConverter /// Convert the data from the enumerator to the given type. /// /// The packet string enumerator with the current position. + /// The deserialization options. /// The parsed object or an error. - public new Result Deserialize(ref PacketStringEnumerator stringEnumerator); + public new Result Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options); /// /// Serializes the given object to string by appending to the packet string builder. diff --git a/Packets/NosSmooth.PacketSerializer.Abstractions/IStringSerializer.cs b/Packets/NosSmooth.PacketSerializer.Abstractions/IStringSerializer.cs index ad42275..501d1fd 100644 --- a/Packets/NosSmooth.PacketSerializer.Abstractions/IStringSerializer.cs +++ b/Packets/NosSmooth.PacketSerializer.Abstractions/IStringSerializer.cs @@ -18,8 +18,9 @@ public interface IStringSerializer /// /// The type of the object to serialize. /// The packet string enumerator with the current position. + /// The deserialization options. /// The parsed object or an error. - public Result Deserialize(Type parseType, ref PacketStringEnumerator stringEnumerator); + public Result Deserialize(Type parseType, ref PacketStringEnumerator stringEnumerator, DeserializeOptions options); /// /// Serializes the given object to string by appending to the packet string builder. @@ -35,8 +36,9 @@ public interface IStringSerializer /// /// The packet string enumerator with the current position. /// The type of the object to serialize. + /// The deserialization options. /// The parsed object or an error. - public Result Deserialize(ref PacketStringEnumerator stringEnumerator); + public Result Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options); /// /// Serializes the given object to string by appending to the packet string builder. diff --git a/Packets/NosSmooth.PacketSerializer.Abstractions/NullableWrapper.cs b/Packets/NosSmooth.PacketSerializer.Abstractions/NullableWrapper.cs index fe2df51..cf70161 100644 --- a/Packets/NosSmooth.PacketSerializer.Abstractions/NullableWrapper.cs +++ b/Packets/NosSmooth.PacketSerializer.Abstractions/NullableWrapper.cs @@ -28,4 +28,9 @@ public record NullableWrapper(T? Value) { return wrapper.Value; } + + public static implicit operator NullableWrapper(T? value) + { + return new NullableWrapper(value); + } } \ No newline at end of file diff --git a/Packets/NosSmooth.PacketSerializer/Converters/Basic/BasicTypeConverter.cs b/Packets/NosSmooth.PacketSerializer/Converters/Basic/BasicTypeConverter.cs index bf33cc8..249fadd 100644 --- a/Packets/NosSmooth.PacketSerializer/Converters/Basic/BasicTypeConverter.cs +++ b/Packets/NosSmooth.PacketSerializer/Converters/Basic/BasicTypeConverter.cs @@ -24,7 +24,7 @@ public abstract class BasicTypeConverter : BaseStringConverter - public override Result Deserialize(ref PacketStringEnumerator stringEnumerator) + public override Result Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options) { var nextTokenResult = stringEnumerator.GetNextToken(out var packetToken); if (!nextTokenResult.IsSuccess) @@ -32,10 +32,13 @@ public abstract class BasicTypeConverter : BaseStringConverter.FromError(nextTokenResult); } - var nullSymbol = GetNullSymbol(); - if (packetToken.Token.Length == nullSymbol.Length && packetToken.Token.StartsWith(nullSymbol)) + if (options.CanBeNull) { - return Result.FromSuccess(default); + var nullSymbol = GetNullSymbol(); + if (packetToken.Token.Length == nullSymbol.Length && packetToken.Token.StartsWith(nullSymbol)) + { + return Result.FromSuccess(default); + } } return Deserialize(packetToken.Token); diff --git a/Packets/NosSmooth.PacketSerializer/Converters/Basic/BoolStringConverter.cs b/Packets/NosSmooth.PacketSerializer/Converters/Basic/BoolStringConverter.cs index a15731a..e9c8cc0 100644 --- a/Packets/NosSmooth.PacketSerializer/Converters/Basic/BoolStringConverter.cs +++ b/Packets/NosSmooth.PacketSerializer/Converters/Basic/BoolStringConverter.cs @@ -4,6 +4,7 @@ // Copyright (c) František Boháček. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. +using System; using NosSmooth.PacketSerializer.Abstractions; using Remora.Results; @@ -12,7 +13,7 @@ namespace NosSmooth.PacketSerializer.Converters.Basic; /// /// Converter of . /// -public class BoolStringConverter : BaseStringConverter +public class BoolStringConverter : BasicTypeConverter { /// public override Result Serialize(bool obj, PacketStringBuilder builder) @@ -22,14 +23,8 @@ public class BoolStringConverter : BaseStringConverter } /// - public override Result Deserialize(ref PacketStringEnumerator stringEnumerator) + protected override Result Deserialize(ReadOnlySpan value) { - var nextTokenResult = stringEnumerator.GetNextToken(out var packetToken); - if (!nextTokenResult.IsSuccess) - { - return Result.FromError(nextTokenResult); - } - - return packetToken.Token[0] == '1' ? true : false; + return value[0] == '1'; } } \ No newline at end of file diff --git a/Packets/NosSmooth.PacketSerializer/Converters/Common/NameStringConverter.cs b/Packets/NosSmooth.PacketSerializer/Converters/Common/NameStringConverter.cs index eb2016c..a1f511f 100644 --- a/Packets/NosSmooth.PacketSerializer/Converters/Common/NameStringConverter.cs +++ b/Packets/NosSmooth.PacketSerializer/Converters/Common/NameStringConverter.cs @@ -29,7 +29,7 @@ public class NameStringConverter : BaseStringConverter } /// - public override Result Deserialize(ref PacketStringEnumerator stringEnumerator) + public override Result Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options) { var tokenResult = stringEnumerator.GetNextToken(out var packetToken); if (!tokenResult.IsSuccess) @@ -37,9 +37,12 @@ public class NameStringConverter : BaseStringConverter return Result.FromError(tokenResult); } - if (packetToken.Token[0] == '-' && packetToken.Token.Length == 1) + if (options.CanBeNull) { - return Result.FromSuccess(null); + if (packetToken.Token[0] == '-' && packetToken.Token.Length == 1) + { + return Result.FromSuccess(null); + } } return NameString.FromPacket(packetToken.Token.ToString()); diff --git a/Packets/NosSmooth.PacketSerializer/Converters/Common/NullableWrapperConverter.cs b/Packets/NosSmooth.PacketSerializer/Converters/Common/NullableWrapperConverter.cs index a0d3911..0baee97 100644 --- a/Packets/NosSmooth.PacketSerializer/Converters/Common/NullableWrapperConverter.cs +++ b/Packets/NosSmooth.PacketSerializer/Converters/Common/NullableWrapperConverter.cs @@ -49,7 +49,7 @@ public class NullableWrapperConverter : BaseStringConverter - public override Result?> Deserialize(ref PacketStringEnumerator stringEnumerator) + public override Result?> Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options) { var tokenResult = stringEnumerator.GetNextToken(out var packetToken, false); if (!tokenResult.IsSuccess) @@ -68,7 +68,7 @@ public class NullableWrapperConverter : BaseStringConverter?>.FromError(converterResult); } - var deserializationResult = converter.Deserialize(ref stringEnumerator); + var deserializationResult = converter.Deserialize(ref stringEnumerator, new DeserializeOptions(true)); if (!deserializationResult.IsDefined(out var deserialization)) { return Result?>.FromError(deserializationResult); diff --git a/Packets/NosSmooth.PacketSerializer/Converters/Packets/UpgradeRareSubPacketConverter.cs b/Packets/NosSmooth.PacketSerializer/Converters/Packets/UpgradeRareSubPacketConverter.cs index bb8943f..6afb11e 100644 --- a/Packets/NosSmooth.PacketSerializer/Converters/Packets/UpgradeRareSubPacketConverter.cs +++ b/Packets/NosSmooth.PacketSerializer/Converters/Packets/UpgradeRareSubPacketConverter.cs @@ -31,7 +31,7 @@ public class UpgradeRareSubPacketConverter : BaseStringConverter - public override Result Deserialize(ref PacketStringEnumerator stringEnumerator) + public override Result Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options) { var tokenResult = stringEnumerator.GetNextToken(out var packetToken); if (!tokenResult.IsSuccess) diff --git a/Packets/NosSmooth.PacketSerializer/Converters/Special/Converters/EnumStringConverter.cs b/Packets/NosSmooth.PacketSerializer/Converters/Special/Converters/EnumStringConverter.cs index 42c808c..b8d2453 100644 --- a/Packets/NosSmooth.PacketSerializer/Converters/Special/Converters/EnumStringConverter.cs +++ b/Packets/NosSmooth.PacketSerializer/Converters/Special/Converters/EnumStringConverter.cs @@ -35,9 +35,9 @@ public class EnumStringConverter : BaseStringConverter - public override Result Deserialize(ref PacketStringEnumerator stringEnumerator) + public override Result Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options) { - var result = _serializer.Deserialize(ref stringEnumerator); + var result = _serializer.Deserialize(ref stringEnumerator, options); if (!result.IsSuccess) { return Result.FromError(result); diff --git a/Packets/NosSmooth.PacketSerializer/Converters/Special/Converters/ListStringConverter.cs b/Packets/NosSmooth.PacketSerializer/Converters/Special/Converters/ListStringConverter.cs index 1215bfd..3555515 100644 --- a/Packets/NosSmooth.PacketSerializer/Converters/Special/Converters/ListStringConverter.cs +++ b/Packets/NosSmooth.PacketSerializer/Converters/Special/Converters/ListStringConverter.cs @@ -57,7 +57,7 @@ public class ListStringConverter : BaseStringConverter - public override Result?> Deserialize(ref PacketStringEnumerator stringEnumerator) + public override Result?> Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options) { var list = new List(); @@ -68,7 +68,7 @@ public class ListStringConverter : BaseStringConverter(ref stringEnumerator); + var result = _serializer.Deserialize(ref stringEnumerator, default); // If we know that we are not on the last token in the item level, just skip to the end of the item. // Note that if this is the case, then that means the converter is either corrupted diff --git a/Packets/NosSmooth.PacketSerializer/Converters/Special/Converters/NullableStringConverter.cs b/Packets/NosSmooth.PacketSerializer/Converters/Special/Converters/NullableStringConverter.cs index 4bc46a7..22c6899 100644 --- a/Packets/NosSmooth.PacketSerializer/Converters/Special/Converters/NullableStringConverter.cs +++ b/Packets/NosSmooth.PacketSerializer/Converters/Special/Converters/NullableStringConverter.cs @@ -43,7 +43,7 @@ public class NullableStringConverter : BaseStringConverter> } /// - public override Result Deserialize(ref PacketStringEnumerator stringEnumerator) + public override Result Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options) { var nextToken = stringEnumerator.GetNextToken(out var packetToken, false); if (!nextToken.IsSuccess) @@ -57,7 +57,7 @@ public class NullableStringConverter : BaseStringConverter> return Result.FromSuccess(null); } - var result = _stringSerializer.Deserialize(ref stringEnumerator); + var result = _stringSerializer.Deserialize(ref stringEnumerator, new DeserializeOptions(true)); if (!result.IsSuccess) { return Result.FromError(result); diff --git a/Packets/NosSmooth.PacketSerializer/Converters/Special/StringSerializer.cs b/Packets/NosSmooth.PacketSerializer/Converters/Special/StringSerializer.cs index a68a077..9c1bbab 100644 --- a/Packets/NosSmooth.PacketSerializer/Converters/Special/StringSerializer.cs +++ b/Packets/NosSmooth.PacketSerializer/Converters/Special/StringSerializer.cs @@ -25,7 +25,7 @@ public class StringSerializer : IStringSerializer } /// - public Result Deserialize(Type parseType, ref PacketStringEnumerator stringEnumerator) + public Result Deserialize(Type parseType, ref PacketStringEnumerator stringEnumerator, DeserializeOptions options) { var converterResult = _converterRepository.GetTypeConverter(parseType); if (!converterResult.IsSuccess) @@ -33,7 +33,7 @@ public class StringSerializer : IStringSerializer return Result.FromError(converterResult); } - var deserializedResult = converterResult.Entity.Deserialize(ref stringEnumerator); + var deserializedResult = converterResult.Entity.Deserialize(ref stringEnumerator, options); if (!deserializedResult.IsSuccess) { return Result.FromError(deserializedResult); @@ -55,7 +55,7 @@ public class StringSerializer : IStringSerializer } /// - public Result Deserialize(ref PacketStringEnumerator stringEnumerator) + public Result Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options) { var converterResult = _converterRepository.GetTypeConverter(); if (!converterResult.IsSuccess) @@ -63,7 +63,7 @@ public class StringSerializer : IStringSerializer return Result.FromError(converterResult); } - return converterResult.Entity.Deserialize(ref stringEnumerator); + return converterResult.Entity.Deserialize(ref stringEnumerator, options); } /// diff --git a/Packets/NosSmooth.PacketSerializer/PacketSerializer.cs b/Packets/NosSmooth.PacketSerializer/PacketSerializer.cs index ff6794a..7e864d6 100644 --- a/Packets/NosSmooth.PacketSerializer/PacketSerializer.cs +++ b/Packets/NosSmooth.PacketSerializer/PacketSerializer.cs @@ -73,7 +73,7 @@ public class PacketSerializer : IPacketSerializer } var packetInfo = packetInfoResult.Entity; - var deserializedResult = packetInfo.PacketConverter.Deserialize(ref packetStringEnumerator); + var deserializedResult = packetInfo.PacketConverter.Deserialize(ref packetStringEnumerator, default); if (!deserializedResult.IsSuccess) { return Result.FromError(deserializedResult); diff --git a/Packets/NosSmooth.PacketSerializersGenerator/ConverterDeserializationGenerator.cs b/Packets/NosSmooth.PacketSerializersGenerator/ConverterDeserializationGenerator.cs index 0d158a8..99baf10 100644 --- a/Packets/NosSmooth.PacketSerializersGenerator/ConverterDeserializationGenerator.cs +++ b/Packets/NosSmooth.PacketSerializersGenerator/ConverterDeserializationGenerator.cs @@ -188,7 +188,7 @@ if ({nullableVariableName} is null) {{ public void DeserializeAndCheck(ParameterInfo parameter, PacketInfo packet, InlineTypeConverterGenerator inlineTypeConverter) { _textWriter.WriteLine($"var {parameter.GetResultVariableName()} = "); - inlineTypeConverter.CallDeserialize(_textWriter, packet); + inlineTypeConverter.CallDeserialize(_textWriter, packet, parameter.Nullable); _textWriter.WriteLine($"if (!{parameter.GetResultVariableName()}.IsSuccess)"); _textWriter.Indent++; diff --git a/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BasicInlineConverterGenerator.cs b/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BasicInlineConverterGenerator.cs index 1580abe..1964e73 100644 --- a/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BasicInlineConverterGenerator.cs +++ b/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BasicInlineConverterGenerator.cs @@ -47,7 +47,7 @@ public class BasicInlineConverterGenerator : IInlineConverterGenerator } /// - public IError? CallDeserialize(IndentedTextWriter textWriter, TypeSyntax? typeSyntax, ITypeSymbol? typeSymbol) + public IError? CallDeserialize(IndentedTextWriter textWriter, TypeSyntax? typeSyntax, ITypeSymbol? typeSymbol, bool nullable) { var type = typeSyntax is not null ? typeSyntax.ToString().TrimEnd('?') @@ -57,7 +57,7 @@ public class BasicInlineConverterGenerator : IInlineConverterGenerator throw new Exception("TypeSyntax or TypeSymbol has to be non null."); } - textWriter.WriteLine($"{Constants.HelperClass}.ParseBasic{type}(typeConverter, ref stringEnumerator);"); + textWriter.WriteLine($"{Constants.HelperClass}.ParseBasic{type}(typeConverter, ref stringEnumerator, {nullable.ToString().ToLower()});"); return null; } @@ -67,7 +67,7 @@ public class BasicInlineConverterGenerator : IInlineConverterGenerator foreach (var type in HandleTypes) { textWriter.WriteMultiline($@" -public static Result<{type}?> ParseBasic{type}(IStringConverter typeConverter, ref PacketStringEnumerator stringEnumerator) +public static Result<{type}?> ParseBasic{type}(IStringConverter typeConverter, ref PacketStringEnumerator stringEnumerator, bool nullable) {{ var tokenResult = stringEnumerator.GetNextToken(out var packetToken); if (!tokenResult.IsSuccess) @@ -76,9 +76,12 @@ public static Result<{type}?> ParseBasic{type}(IStringConverter typeConverter, r }} var token = packetToken.Token; - if (token.Length == 2 && token.StartsWith(""-1"")) + if (nullable) {{ - return Result<{type}?>.FromSuccess(null); + if (token.Length == 2 && token.StartsWith(""-1"")) + {{ + return Result<{type}?>.FromSuccess(null); + }} }} if (!{type}.TryParse(token, out var val)) diff --git a/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BoolInlineConverterGenerator.cs b/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BoolInlineConverterGenerator.cs index 0673299..d6ee03b 100644 --- a/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BoolInlineConverterGenerator.cs +++ b/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BoolInlineConverterGenerator.cs @@ -42,9 +42,9 @@ public class BoolInlineConverterGenerator : IInlineConverterGenerator } /// - public IError? CallDeserialize(IndentedTextWriter textWriter, TypeSyntax? typeSyntax, ITypeSymbol? typeSymbol) + public IError? CallDeserialize(IndentedTextWriter textWriter, TypeSyntax? typeSyntax, ITypeSymbol? typeSymbol, bool nullable) { - textWriter.WriteLine($"{Constants.HelperClass}.ParseBool(ref stringEnumerator);"); + textWriter.WriteLine($"{Constants.HelperClass}.ParseBool(ref stringEnumerator, {nullable.ToString().ToLower()});"); return null; } @@ -52,7 +52,7 @@ public class BoolInlineConverterGenerator : IInlineConverterGenerator public void GenerateHelperMethods(IndentedTextWriter textWriter) { textWriter.WriteLine(@" -public static Result ParseBool(ref PacketStringEnumerator stringEnumerator) +public static Result ParseBool(ref PacketStringEnumerator stringEnumerator, bool nullable) {{ var tokenResult = stringEnumerator.GetNextToken(out var packetToken); if (!tokenResult.IsSuccess) @@ -61,9 +61,12 @@ public static Result ParseBool(ref PacketStringEnumerator stringEnumerato }} var token = packetToken.Token; - if (token.Length == 2 && token.StartsWith(""-1"")) + if (nullable) {{ - return Result.FromSuccess(null); + if (token.Length == 2 && token.StartsWith(""-1"")) + {{ + return Result.FromSuccess(null); + }} }} return token[0] == '1' ? true : false; diff --git a/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/EnumInlineConverterGenerator.cs b/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/EnumInlineConverterGenerator.cs index 51d4b3d..05062b6 100644 --- a/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/EnumInlineConverterGenerator.cs +++ b/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/EnumInlineConverterGenerator.cs @@ -57,7 +57,7 @@ public class EnumInlineConverterGenerator : IInlineConverterGenerator } /// - public IError? CallDeserialize(IndentedTextWriter textWriter, TypeSyntax? typeSyntax, ITypeSymbol? typeSymbol) + public IError? CallDeserialize(IndentedTextWriter textWriter, TypeSyntax? typeSyntax, ITypeSymbol? typeSymbol, bool nullable) { if (_enumTypes.All(x => x.ToString() != typeSymbol!.ToString())) { @@ -66,7 +66,7 @@ public class EnumInlineConverterGenerator : IInlineConverterGenerator textWriter.WriteLine ( - $"{Constants.HelperClass}.ParseEnum{typeSymbol?.ToString().TrimEnd('?').Replace('.', '_')}(typeConverter, ref stringEnumerator);" + $"{Constants.HelperClass}.ParseEnum{typeSymbol?.ToString().TrimEnd('?').Replace('.', '_')}(typeConverter, ref stringEnumerator, {nullable.ToString().ToLower()});" ); return null; } @@ -80,7 +80,7 @@ public class EnumInlineConverterGenerator : IInlineConverterGenerator textWriter.WriteMultiline ( $@" -public static Result<{type}?> ParseEnum{type.ToString().Replace('.', '_')}(IStringConverter typeConverter, ref PacketStringEnumerator stringEnumerator) +public static Result<{type}?> ParseEnum{type.ToString().Replace('.', '_')}(IStringConverter typeConverter, ref PacketStringEnumerator stringEnumerator, bool nullable) {{ var tokenResult = stringEnumerator.GetNextToken(out var packetToken); if (!tokenResult.IsSuccess) diff --git a/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/FallbackInlineConverterGenerator.cs b/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/FallbackInlineConverterGenerator.cs index d0b844c..27ea1c5 100644 --- a/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/FallbackInlineConverterGenerator.cs +++ b/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/FallbackInlineConverterGenerator.cs @@ -44,11 +44,12 @@ public class FallbackInlineConverterGenerator : IInlineConverterGenerator } /// - public IError? CallDeserialize(IndentedTextWriter textWriter, TypeSyntax? typeSyntax, ITypeSymbol? typeSymbol) + public IError? CallDeserialize(IndentedTextWriter textWriter, TypeSyntax? typeSyntax, ITypeSymbol? typeSymbol, bool nullable) { + var options = nullable ? "DeserializeOptions.Nullable" : "default"; textWriter.WriteLine ( - $"_stringSerializer.Deserialize<{(typeSyntax?.ToString() ?? typeSymbol!.ToString()).TrimEnd('?')}?>(ref stringEnumerator);" + $"_stringSerializer.Deserialize<{(typeSyntax?.ToString() ?? typeSymbol!.ToString()).TrimEnd('?')}?>(ref stringEnumerator, {options});" ); return null; } diff --git a/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/IInlineConverterGenerator.cs b/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/IInlineConverterGenerator.cs index f331dbd..2d36e1c 100644 --- a/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/IInlineConverterGenerator.cs +++ b/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/IInlineConverterGenerator.cs @@ -41,8 +41,9 @@ public interface IInlineConverterGenerator /// The text writer to write to. /// The type syntax. /// The type symbol. + /// Whether the parameter is nullable. /// An error, if any. - public IError? CallDeserialize(IndentedTextWriter textWriter, TypeSyntax? typeSyntax, ITypeSymbol? typeSymbol); + public IError? CallDeserialize(IndentedTextWriter textWriter, TypeSyntax? typeSyntax, ITypeSymbol? typeSymbol, bool nullable); /// /// Generate helper methods to HelperClass. diff --git a/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/ListInlineConverterGenerator.cs b/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/ListInlineConverterGenerator.cs index e4c2fd1..dc14aae 100644 --- a/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/ListInlineConverterGenerator.cs +++ b/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/ListInlineConverterGenerator.cs @@ -76,7 +76,7 @@ public class ListInlineConverterGenerator : IInlineConverterGenerator } /// - public IError? CallDeserialize(IndentedTextWriter textWriter, TypeSyntax? typeSyntax, ITypeSymbol? typeSymbol) + public IError? CallDeserialize(IndentedTextWriter textWriter, TypeSyntax? typeSyntax, ITypeSymbol? typeSymbol, bool nullable) { ITypeSymbol genericArgument = ((INamedTypeSymbol)typeSymbol!).TypeArguments[0]; if (_listTypes.All @@ -89,25 +89,24 @@ public class ListInlineConverterGenerator : IInlineConverterGenerator } textWriter.WriteLine - ($"{Constants.HelperClass}.{GetMethodName(genericArgument)}(typeConverter, _stringSerializer, ref stringEnumerator);"); + ($"{Constants.HelperClass}.{GetMethodName(genericArgument, nullable)}(typeConverter, _stringSerializer, ref stringEnumerator);"); return null; } - private string GetMethodName(ITypeSymbol genericArgumentType) + private string GetMethodName(ITypeSymbol genericArgumentType, bool nullable) { return - $"ParseList{genericArgumentType.ToString().TrimEnd('?').Replace('.', '_').Replace('<', '_').Replace('>', '_')}{((genericArgumentType.IsNullable() ?? false) ? "Nullable" : string.Empty)}"; + $"ParseList{genericArgumentType.ToString().TrimEnd('?').Replace('.', '_').Replace('<', '_').Replace('>', '_')}{((genericArgumentType.IsNullable() ?? false) ? "Nullable" : string.Empty)}{(nullable ? "NullableSupport" : string.Empty)}"; } - /// - public void GenerateHelperMethods(IndentedTextWriter textWriter) + private void GenerateHelperMethods(IndentedTextWriter textWriter, bool nullable) { foreach (var type in _listTypes) { textWriter.WriteLine ( @$" -public static Result> {GetMethodName(type)}(IStringConverter typeConverter, IStringSerializer _stringSerializer, ref PacketStringEnumerator stringEnumerator) +public static Result> {GetMethodName(type, nullable)}(IStringConverter typeConverter, IStringSerializer _stringSerializer, ref PacketStringEnumerator stringEnumerator) {{ var data = new List<{type.GetActualType()}>(); @@ -120,7 +119,7 @@ public static Result> {GetMethodName(type) var result = " ); - /*var error = */_inlineConverters.CallDeserialize(textWriter, null, type); // TODO handle error + /*var error = */_inlineConverters.CallDeserialize(textWriter, null, type, nullable); // TODO handle error textWriter.WriteMultiline(@$" @@ -159,4 +158,12 @@ if (result.Entity is null) textWriter.WriteLine("}"); } } + + /// + public void GenerateHelperMethods(IndentedTextWriter textWriter) + { + GenerateHelperMethods(textWriter, true); + GenerateHelperMethods(textWriter, false); + } + } \ No newline at end of file diff --git a/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/StringInlineConverterGenerator.cs b/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/StringInlineConverterGenerator.cs index 5f4d002..611e081 100644 --- a/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/StringInlineConverterGenerator.cs +++ b/Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/StringInlineConverterGenerator.cs @@ -28,9 +28,9 @@ public class StringInlineConverterGenerator : IInlineConverterGenerator } /// - public IError? CallDeserialize(IndentedTextWriter textWriter, TypeSyntax? typeSyntax, ITypeSymbol? typeSymbol) + public IError? CallDeserialize(IndentedTextWriter textWriter, TypeSyntax? typeSyntax, ITypeSymbol? typeSymbol, bool nullable) { - textWriter.WriteLine($"{Constants.HelperClass}.ParseString(ref stringEnumerator);"); + textWriter.WriteLine($"{Constants.HelperClass}.ParseString(ref stringEnumerator, {nullable.ToString().ToLower()});"); return null; } @@ -40,7 +40,7 @@ public class StringInlineConverterGenerator : IInlineConverterGenerator textWriter.WriteLine ( @" -public static Result ParseString(ref PacketStringEnumerator stringEnumerator) +public static Result ParseString(ref PacketStringEnumerator stringEnumerator, bool nullable) {{ var tokenResult = stringEnumerator.GetNextToken(out var packetToken); if (!tokenResult.IsSuccess) @@ -48,9 +48,12 @@ public static Result ParseString(ref PacketStringEnumerator stringEnume return Result.FromError(tokenResult); }} - if (packetToken.Token.Length == 1 && packetToken.Token[0] == '-') + if (nullable) {{ - return Result.FromSuccess(null); + if (packetToken.Token.Length == 1 && packetToken.Token[0] == '-') + {{ + return Result.FromSuccess(null); + }} }} return packetToken.Token.ToString(); diff --git a/Packets/NosSmooth.PacketSerializersGenerator/InlineTypeConverterGenerator.cs b/Packets/NosSmooth.PacketSerializersGenerator/InlineTypeConverterGenerator.cs index 8e612fa..7aaab00 100644 --- a/Packets/NosSmooth.PacketSerializersGenerator/InlineTypeConverterGenerator.cs +++ b/Packets/NosSmooth.PacketSerializersGenerator/InlineTypeConverterGenerator.cs @@ -38,8 +38,9 @@ public class InlineTypeConverterGenerator /// /// The text writer. /// The packet. + /// Whether the parameter is nullable. /// An error, if any. - public IError? CallDeserialize(IndentedTextWriter textWriter, PacketInfo packet) + public IError? CallDeserialize(IndentedTextWriter textWriter, PacketInfo packet, bool nullable) { var parameter = packet.Parameters.Current; var shouldGenerateInline = packet.GenerateAttribute.GetIndexedValue(0); @@ -49,12 +50,12 @@ public class InlineTypeConverterGenerator { if (generator.ShouldHandle(parameter.Parameter.Type, parameter.Type)) { - return generator.CallDeserialize(textWriter, parameter.Parameter.Type, parameter.Type); + return generator.CallDeserialize(textWriter, parameter.Parameter.Type, parameter.Type, nullable); } } } - return _fallbackInlineConverterGenerator.CallDeserialize(textWriter, parameter.Parameter.Type, parameter.Type); + return _fallbackInlineConverterGenerator.CallDeserialize(textWriter, parameter.Parameter.Type, parameter.Type, nullable); } /// @@ -63,23 +64,25 @@ public class InlineTypeConverterGenerator /// The text writer. /// The type syntax. /// The type symbol. + /// Whether the parameter is nullable. /// An error, if any. public IError? CallDeserialize ( IndentedTextWriter textWriter, TypeSyntax? typeSyntax, - ITypeSymbol? typeSymbol + ITypeSymbol? typeSymbol, + bool nullable ) { foreach (var generator in _typeGenerators) { if (generator.ShouldHandle(typeSyntax, typeSymbol)) { - return generator.CallDeserialize(textWriter, typeSyntax, typeSymbol); + return generator.CallDeserialize(textWriter, typeSyntax, typeSymbol, nullable); } } - return _fallbackInlineConverterGenerator.CallDeserialize(textWriter, typeSyntax, typeSymbol); + return _fallbackInlineConverterGenerator.CallDeserialize(textWriter, typeSyntax, typeSymbol, nullable); } /// diff --git a/Packets/NosSmooth.PacketSerializersGenerator/PacketConverterGenerator.cs b/Packets/NosSmooth.PacketSerializersGenerator/PacketConverterGenerator.cs index 2dc791b..91b89bc 100644 --- a/Packets/NosSmooth.PacketSerializersGenerator/PacketConverterGenerator.cs +++ b/Packets/NosSmooth.PacketSerializersGenerator/PacketConverterGenerator.cs @@ -94,7 +94,7 @@ public override Result Serialize({_packetInfo.Name}? obj, PacketStringBuilder bu }} /// -public override Result<{_packetInfo.Name}?> Deserialize(ref PacketStringEnumerator stringEnumerator) +public override Result<{_packetInfo.Name}?> Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options) {{ var typeConverter = this; " diff --git a/Packets/NosSmooth.PacketSerializersGenerator/SourceGenerator.cs b/Packets/NosSmooth.PacketSerializersGenerator/SourceGenerator.cs index 84223f7..3026003 100644 --- a/Packets/NosSmooth.PacketSerializersGenerator/SourceGenerator.cs +++ b/Packets/NosSmooth.PacketSerializersGenerator/SourceGenerator.cs @@ -130,12 +130,6 @@ public class SourceGenerator : ISourceGenerator $"{packetRecord.GetPrefix()}.{packetRecord.Identifier.NormalizeWhitespace().ToFullString()}Converter.g.cs", stringWriter.GetStringBuilder().ToString() ); - - File.WriteAllText - ( - Path.Combine(Path.GetTempPath(), $"{packetRecord.GetPrefix()}.{packetRecord.Identifier.NormalizeWhitespace().ToFullString()}Converter.g.cs"), - stringWriter.GetStringBuilder().ToString() - ); } } -- 2.48.1