~ruther/NosSmooth

d734ef022245fd0486eb265eab64b515d10966c6 — František Boháček 2 years ago d4651ec
Revert "feat: use "in" instead of "ref" in packet serializer"

This reverts commit ae1b3301e659c237a10f742675e1f8db9389d2db.
24 files changed, 72 insertions(+), 72 deletions(-)

M Packets/NosSmooth.PacketSerializer.Abstractions/BaseStringConverter.cs
M Packets/NosSmooth.PacketSerializer.Abstractions/IStringConverter.cs
M Packets/NosSmooth.PacketSerializer.Abstractions/IStringSerializer.cs
M Packets/NosSmooth.PacketSerializer/Converters/Basic/BasicTypeConverter.cs
M Packets/NosSmooth.PacketSerializer/Converters/Basic/BoolStringConverter.cs
M Packets/NosSmooth.PacketSerializer/Converters/Basic/SpanFormattableTypeConverter.cs
M Packets/NosSmooth.PacketSerializer/Converters/Common/NameStringConverter.cs
M Packets/NosSmooth.PacketSerializer/Converters/Common/NullableWrapperConverter.cs
M Packets/NosSmooth.PacketSerializer/Converters/Common/OptionalWrapperConverter.cs
M Packets/NosSmooth.PacketSerializer/Converters/Packets/UpgradeRareSubPacketConverter.cs
M Packets/NosSmooth.PacketSerializer/Converters/Special/Converters/EnumStringConverter.cs
M Packets/NosSmooth.PacketSerializer/Converters/Special/Converters/ListStringConverter.cs
M Packets/NosSmooth.PacketSerializer/Converters/Special/Converters/NullableStringConverter.cs
M Packets/NosSmooth.PacketSerializer/Converters/Special/StringSerializer.cs
M Packets/NosSmooth.PacketSerializer/PacketSerializer.cs
M Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BasicInlineConverterGenerator.cs
M Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BoolInlineConverterGenerator.cs
M Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/EnumInlineConverterGenerator.cs
M Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/FallbackInlineConverterGenerator.cs
M Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/ListInlineConverterGenerator.cs
M Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/StringInlineConverterGenerator.cs
M Packets/NosSmooth.PacketSerializersGenerator/PacketConverterGenerator.cs
M Tests/NosSmooth.Packets.Tests/Converters/Basic/BoolStringConverterTests.cs
M Tests/NosSmooth.Packets.Tests/Converters/Basic/StringConverterTests.cs
M Packets/NosSmooth.PacketSerializer.Abstractions/BaseStringConverter.cs => Packets/NosSmooth.PacketSerializer.Abstractions/BaseStringConverter.cs +6 -6
@@ 16,15 16,15 @@ namespace NosSmooth.PacketSerializer.Abstractions;
public abstract class BaseStringConverter<TParseType> : IStringConverter<TParseType>
{
    /// <inheritdoc />
    public abstract Result Serialize(TParseType? obj, in PacketStringBuilder builder);
    public abstract Result Serialize(TParseType? obj, ref PacketStringBuilder builder);

    /// <inheritdoc />
    public abstract Result<TParseType?> Deserialize(in PacketStringEnumerator stringEnumerator, DeserializeOptions options);
    public abstract Result<TParseType?> Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options);

    /// <inheritdoc/>
    Result<object?> IStringConverter.Deserialize(in PacketStringEnumerator stringEnumerator, DeserializeOptions options)
    Result<object?> IStringConverter.Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options)
    {
        var result = Deserialize(in stringEnumerator, options);
        var result = Deserialize(ref stringEnumerator, options);
        if (!result.IsSuccess)
        {
            return Result<object?>.FromError(result);


@@ 34,13 34,13 @@ public abstract class BaseStringConverter<TParseType> : IStringConverter<TParseT
    }

    /// <inheritdoc/>
    Result IStringConverter.Serialize(object? obj, in PacketStringBuilder builder)
    Result IStringConverter.Serialize(object? obj, ref PacketStringBuilder builder)
    {
        if (!(obj is TParseType parseType))
        {
            return new WrongTypeError(this, typeof(TParseType), obj);
        }

        return Serialize(parseType, in builder);
        return Serialize(parseType, ref builder);
    }
}

M Packets/NosSmooth.PacketSerializer.Abstractions/IStringConverter.cs => Packets/NosSmooth.PacketSerializer.Abstractions/IStringConverter.cs +4 -4
@@ 19,7 19,7 @@ public interface IStringConverter
    /// <param name="stringEnumerator">The packet string enumerator with the current position.</param>
    /// <param name="options">The deserialization options.</param>
    /// <returns>The parsed object or an error.</returns>
    public Result<object?> Deserialize(in PacketStringEnumerator stringEnumerator, DeserializeOptions options);
    public Result<object?> Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options);

    /// <summary>
    /// Serializes the given object to string by appending to the packet string builder.


@@ 27,7 27,7 @@ public interface IStringConverter
    /// <param name="obj">The object to serialize.</param>
    /// <param name="builder">The string builder to append to.</param>
    /// <returns>A result that may or may not have succeeded.</returns>
    public Result Serialize(object? obj, in PacketStringBuilder builder);
    public Result Serialize(object? obj, ref PacketStringBuilder builder);
}

/// <summary>


@@ 45,7 45,7 @@ public interface IStringConverter<TParseType> : IStringConverter
    /// <param name="stringEnumerator">The packet string enumerator with the current position.</param>
    /// <param name="options">The deserialization options.</param>
    /// <returns>The parsed object or an error.</returns>
    public new Result<TParseType?> Deserialize(in PacketStringEnumerator stringEnumerator, DeserializeOptions options);
    public new Result<TParseType?> Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options);

    /// <summary>
    /// Serializes the given object to string by appending to the packet string builder.


@@ 53,5 53,5 @@ public interface IStringConverter<TParseType> : IStringConverter
    /// <param name="obj">The object to serialize.</param>
    /// <param name="builder">The string builder to append to.</param>
    /// <returns>A result that may or may not have succeeded.</returns>
    public Result Serialize(TParseType? obj, in PacketStringBuilder builder);
    public Result Serialize(TParseType? obj, ref PacketStringBuilder builder);
}
\ No newline at end of file

M Packets/NosSmooth.PacketSerializer.Abstractions/IStringSerializer.cs => Packets/NosSmooth.PacketSerializer.Abstractions/IStringSerializer.cs +4 -4
@@ 20,7 20,7 @@ public interface IStringSerializer
    /// <param name="stringEnumerator">The packet string enumerator with the current position.</param>
    /// <param name="options">The deserialization options.</param>
    /// <returns>The parsed object or an error.</returns>
    public Result<object?> Deserialize(Type parseType, in PacketStringEnumerator stringEnumerator, DeserializeOptions options);
    public Result<object?> Deserialize(Type parseType, ref PacketStringEnumerator stringEnumerator, DeserializeOptions options);

    /// <summary>
    /// Serializes the given object to string by appending to the packet string builder.


@@ 29,7 29,7 @@ public interface IStringSerializer
    /// <param name="obj">The object to serialize.</param>
    /// <param name="builder">The string builder to append to.</param>
    /// <returns>A result that may or may not have succeeded.</returns>
    public Result Serialize(Type parseType, object? obj, in PacketStringBuilder builder);
    public Result Serialize(Type parseType, object? obj, ref PacketStringBuilder builder);

    /// <summary>
    /// Convert the data from the enumerator to the given type.


@@ 38,7 38,7 @@ public interface IStringSerializer
    /// <typeparam name="TParseType">The type of the object to serialize.</typeparam>
    /// <param name="options">The deserialization options.</param>
    /// <returns>The parsed object or an error.</returns>
    public Result<TParseType?> Deserialize<TParseType>(in PacketStringEnumerator stringEnumerator, DeserializeOptions options);
    public Result<TParseType?> Deserialize<TParseType>(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options);

    /// <summary>
    /// Serializes the given object to string by appending to the packet string builder.


@@ 47,5 47,5 @@ public interface IStringSerializer
    /// <param name="builder">The string builder to append to.</param>
    /// <typeparam name="TParseType">The type of the object to deserialize.</typeparam>
    /// <returns>A result that may or may not have succeeded.</returns>
    public Result Serialize<TParseType>(TParseType? obj, in PacketStringBuilder builder);
    public Result Serialize<TParseType>(TParseType? obj, ref PacketStringBuilder builder);
}
\ No newline at end of file

M Packets/NosSmooth.PacketSerializer/Converters/Basic/BasicTypeConverter.cs => Packets/NosSmooth.PacketSerializer/Converters/Basic/BasicTypeConverter.cs +2 -2
@@ 17,14 17,14 @@ namespace NosSmooth.PacketSerializer.Converters.Basic;
public abstract class BasicTypeConverter<TBasicType> : BaseStringConverter<TBasicType>
{
    /// <inheritdoc />
    public override Result Serialize(TBasicType? obj, in PacketStringBuilder builder)
    public override Result Serialize(TBasicType? obj, ref PacketStringBuilder builder)
    {
        builder.Append(obj?.ToString() ?? GetNullSymbol());
        return Result.FromSuccess();
    }

    /// <inheritdoc />
    public override Result<TBasicType?> Deserialize(in PacketStringEnumerator stringEnumerator, DeserializeOptions options)
    public override Result<TBasicType?> Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options)
    {
        var nextTokenResult = stringEnumerator.GetNextToken(out var packetToken);
        if (!nextTokenResult.IsSuccess)

M Packets/NosSmooth.PacketSerializer/Converters/Basic/BoolStringConverter.cs => Packets/NosSmooth.PacketSerializer/Converters/Basic/BoolStringConverter.cs +1 -1
@@ 16,7 16,7 @@ namespace NosSmooth.PacketSerializer.Converters.Basic;
public class BoolStringConverter : BasicTypeConverter<bool>
{
    /// <inheritdoc />
    public override Result Serialize(bool obj, in PacketStringBuilder builder)
    public override Result Serialize(bool obj, ref PacketStringBuilder builder)
    {
        builder.Append(obj ? '1' : '0');
        return Result.FromSuccess();

M Packets/NosSmooth.PacketSerializer/Converters/Basic/SpanFormattableTypeConverter.cs => Packets/NosSmooth.PacketSerializer/Converters/Basic/SpanFormattableTypeConverter.cs +1 -1
@@ 18,7 18,7 @@ public abstract class SpanFormattableTypeConverter<T> : BasicTypeConverter<T>
    where T : ISpanFormattable
{
    /// <inheritdoc />
    public override Result Serialize(T? obj, in PacketStringBuilder builder)
    public override Result Serialize(T? obj, ref PacketStringBuilder builder)
    {
        if (obj is not null)
        {

M Packets/NosSmooth.PacketSerializer/Converters/Common/NameStringConverter.cs => Packets/NosSmooth.PacketSerializer/Converters/Common/NameStringConverter.cs +2 -2
@@ 16,7 16,7 @@ namespace NosSmooth.PacketSerializer.Converters.Common;
public class NameStringConverter : BaseStringConverter<NameString>
{
    /// <inheritdoc />
    public override Result Serialize(NameString? obj, in PacketStringBuilder builder)
    public override Result Serialize(NameString? obj, ref PacketStringBuilder builder)
    {
        if (obj is null)
        {


@@ 29,7 29,7 @@ public class NameStringConverter : BaseStringConverter<NameString>
    }

    /// <inheritdoc />
    public override Result<NameString?> Deserialize(in PacketStringEnumerator stringEnumerator, DeserializeOptions options)
    public override Result<NameString?> Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options)
    {
        var tokenResult = stringEnumerator.GetNextToken(out var packetToken);
        if (!tokenResult.IsSuccess)

M Packets/NosSmooth.PacketSerializer/Converters/Common/NullableWrapperConverter.cs => Packets/NosSmooth.PacketSerializer/Converters/Common/NullableWrapperConverter.cs +4 -4
@@ 28,7 28,7 @@ public class NullableWrapperConverter<T> : BaseStringConverter<NullableWrapper<T
    }

    /// <inheritdoc />
    public override Result Serialize(NullableWrapper<T> obj, in PacketStringBuilder builder)
    public override Result Serialize(NullableWrapper<T> obj, ref PacketStringBuilder builder)
    {
        if (obj.Value is null)
        {


@@ 42,14 42,14 @@ public class NullableWrapperConverter<T> : BaseStringConverter<NullableWrapper<T
                return Result.FromError(converterResult);
            }

            return converter.Serialize(obj.Value, in builder);
            return converter.Serialize(obj.Value, ref builder);
        }

        return Result.FromSuccess();
    }

    /// <inheritdoc />
    public override Result<NullableWrapper<T>> Deserialize(in PacketStringEnumerator stringEnumerator, DeserializeOptions options)
    public override Result<NullableWrapper<T>> Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options)
    {
        var tokenResult = stringEnumerator.GetNextToken(out var packetToken, false);
        if (!tokenResult.IsSuccess)


@@ 68,7 68,7 @@ public class NullableWrapperConverter<T> : BaseStringConverter<NullableWrapper<T
            return Result<NullableWrapper<T>>.FromError(converterResult);
        }

        var deserializationResult = converter.Deserialize(in stringEnumerator, new DeserializeOptions(true));
        var deserializationResult = converter.Deserialize(ref stringEnumerator, new DeserializeOptions(true));
        if (!deserializationResult.IsDefined(out var deserialization))
        {
            return Result<NullableWrapper<T>>.FromError(deserializationResult);

M Packets/NosSmooth.PacketSerializer/Converters/Common/OptionalWrapperConverter.cs => Packets/NosSmooth.PacketSerializer/Converters/Common/OptionalWrapperConverter.cs +4 -4
@@ 28,7 28,7 @@ public class OptionalWrapperConverter<T> : BaseStringConverter<OptionalWrapper<T
    }

    /// <inheritdoc />
    public override Result Serialize(OptionalWrapper<T> obj, in PacketStringBuilder builder)
    public override Result Serialize(OptionalWrapper<T> obj, ref PacketStringBuilder builder)
    {
        if (obj.Value is null)
        {


@@ 41,12 41,12 @@ public class OptionalWrapperConverter<T> : BaseStringConverter<OptionalWrapper<T
            return Result.FromError(converterResult);
        }

        return converter.Serialize(obj.Value, in builder);
        return converter.Serialize(obj.Value, ref builder);

    }

    /// <inheritdoc />
    public override Result<OptionalWrapper<T>> Deserialize(in PacketStringEnumerator stringEnumerator, DeserializeOptions options)
    public override Result<OptionalWrapper<T>> Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options)
    {
        if (stringEnumerator.IsOnLastToken() ?? false)
        {


@@ 71,7 71,7 @@ public class OptionalWrapperConverter<T> : BaseStringConverter<OptionalWrapper<T
            return Result<OptionalWrapper<T>>.FromError(converterResult);
        }

        var deserializationResult = converter.Deserialize(in stringEnumerator, new DeserializeOptions(true));
        var deserializationResult = converter.Deserialize(ref stringEnumerator, new DeserializeOptions(true));
        if (!deserializationResult.IsDefined(out var deserialization))
        {
            return Result<OptionalWrapper<T>>.FromError(deserializationResult);

M Packets/NosSmooth.PacketSerializer/Converters/Packets/UpgradeRareSubPacketConverter.cs => Packets/NosSmooth.PacketSerializer/Converters/Packets/UpgradeRareSubPacketConverter.cs +2 -2
@@ 18,7 18,7 @@ namespace NosSmooth.PacketSerializer.Converters.Packets;
public class UpgradeRareSubPacketConverter : BaseStringConverter<UpgradeRareSubPacket>
{
    /// <inheritdoc />
    public override Result Serialize(UpgradeRareSubPacket? obj, in PacketStringBuilder builder)
    public override Result Serialize(UpgradeRareSubPacket? obj, ref PacketStringBuilder builder)
    {
        if (obj is null)
        {


@@ 31,7 31,7 @@ public class UpgradeRareSubPacketConverter : BaseStringConverter<UpgradeRareSubP
    }

    /// <inheritdoc />
    public override Result<UpgradeRareSubPacket?> Deserialize(in PacketStringEnumerator stringEnumerator, DeserializeOptions options)
    public override Result<UpgradeRareSubPacket?> Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options)
    {
        var tokenResult = stringEnumerator.GetNextToken(out var packetToken);
        if (!tokenResult.IsSuccess)

M Packets/NosSmooth.PacketSerializer/Converters/Special/Converters/EnumStringConverter.cs => Packets/NosSmooth.PacketSerializer/Converters/Special/Converters/EnumStringConverter.cs +3 -3
@@ 28,16 28,16 @@ public class EnumStringConverter<TEnum, TUnderlyingType> : BaseStringConverter<T
    }

    /// <inheritdoc />
    public override Result Serialize(TEnum? obj, in PacketStringBuilder builder)
    public override Result Serialize(TEnum? obj, ref PacketStringBuilder builder)
    {
        builder.Append(((TUnderlyingType?)(object?)obj)?.ToString() ?? "-");
        return Result.FromSuccess();
    }

    /// <inheritdoc />
    public override Result<TEnum?> Deserialize(in PacketStringEnumerator stringEnumerator, DeserializeOptions options)
    public override Result<TEnum?> Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options)
    {
        var result = _serializer.Deserialize<TUnderlyingType>(in stringEnumerator, options);
        var result = _serializer.Deserialize<TUnderlyingType>(ref stringEnumerator, options);
        if (!result.IsSuccess)
        {
            return Result<TEnum?>.FromError(result);

M Packets/NosSmooth.PacketSerializer/Converters/Special/Converters/ListStringConverter.cs => Packets/NosSmooth.PacketSerializer/Converters/Special/Converters/ListStringConverter.cs +4 -4
@@ 29,7 29,7 @@ public class ListStringConverter<TGeneric> : BaseStringConverter<IReadOnlyList<T
    }

    /// <inheritdoc />
    public override Result Serialize(IReadOnlyList<TGeneric>? obj, in PacketStringBuilder builder)
    public override Result Serialize(IReadOnlyList<TGeneric>? obj, ref PacketStringBuilder builder)
    {
        if (obj is null)
        {


@@ 44,7 44,7 @@ public class ListStringConverter<TGeneric> : BaseStringConverter<IReadOnlyList<T
                return new ArgumentInvalidError(nameof(builder), "The string builder has to have a prepared level for all lists.");
            }

            var serializeResult = _serializer.Serialize(item, in builder);
            var serializeResult = _serializer.Serialize(item, ref builder);
            builder.PopLevel();
            if (!serializeResult.IsSuccess)
            {


@@ 56,7 56,7 @@ public class ListStringConverter<TGeneric> : BaseStringConverter<IReadOnlyList<T
    }

    /// <inheritdoc />
    public override Result<IReadOnlyList<TGeneric>?> Deserialize(in PacketStringEnumerator stringEnumerator, DeserializeOptions options)
    public override Result<IReadOnlyList<TGeneric>?> Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options)
    {
        var list = new List<TGeneric>();



@@ 68,7 68,7 @@ public class ListStringConverter<TGeneric> : BaseStringConverter<IReadOnlyList<T
                return new ArgumentInvalidError(nameof(stringEnumerator), "The string enumerator has to have a prepared level for all lists.");
            }

            var result = _serializer.Deserialize<TGeneric>(in stringEnumerator, default);
            var result = _serializer.Deserialize<TGeneric>(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

M Packets/NosSmooth.PacketSerializer/Converters/Special/Converters/NullableStringConverter.cs => Packets/NosSmooth.PacketSerializer/Converters/Special/Converters/NullableStringConverter.cs +4 -4
@@ 31,7 31,7 @@ public class NullableStringConverter<T> : BaseStringConverter<Nullable<T>>
    }

    /// <inheritdoc />
    public override Result Serialize(T? obj, in PacketStringBuilder builder)
    public override Result Serialize(T? obj, ref PacketStringBuilder builder)
    {
        if (obj is null)
        {


@@ 39,11 39,11 @@ public class NullableStringConverter<T> : BaseStringConverter<Nullable<T>>
            return Result.FromSuccess();
        }

        return _stringSerializer.Serialize<T>(obj.Value, in builder);
        return _stringSerializer.Serialize<T>(obj.Value, ref builder);
    }

    /// <inheritdoc />
    public override Result<T?> Deserialize(in PacketStringEnumerator stringEnumerator, DeserializeOptions options)
    public override Result<T?> Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options)
    {
        var nextToken = stringEnumerator.GetNextToken(out var packetToken, false);
        if (!nextToken.IsSuccess)


@@ 63,7 63,7 @@ public class NullableStringConverter<T> : BaseStringConverter<Nullable<T>>
            }
        }

        var result = _stringSerializer.Deserialize<T>(in stringEnumerator, options);
        var result = _stringSerializer.Deserialize<T>(ref stringEnumerator, options);
        if (!result.IsSuccess)
        {
            return Result<T?>.FromError(result);

M Packets/NosSmooth.PacketSerializer/Converters/Special/StringSerializer.cs => Packets/NosSmooth.PacketSerializer/Converters/Special/StringSerializer.cs +8 -8
@@ 25,7 25,7 @@ public class StringSerializer : IStringSerializer
    }

    /// <inheritdoc />
    public Result<object?> Deserialize(Type parseType, in PacketStringEnumerator stringEnumerator, DeserializeOptions options)
    public Result<object?> 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<object?>.FromError(converterResult);
        }

        var deserializedResult = converterResult.Entity.Deserialize(in stringEnumerator, options);
        var deserializedResult = converterResult.Entity.Deserialize(ref stringEnumerator, options);
        if (!deserializedResult.IsSuccess)
        {
            return Result<object?>.FromError(deserializedResult);


@@ 43,7 43,7 @@ public class StringSerializer : IStringSerializer
    }

    /// <inheritdoc />
    public Result Serialize(Type parseType, object? obj, in PacketStringBuilder builder)
    public Result Serialize(Type parseType, object? obj, ref PacketStringBuilder builder)
    {
        var converterResult = _converterRepository.GetTypeConverter(parseType);
        if (!converterResult.IsSuccess)


@@ 51,11 51,11 @@ public class StringSerializer : IStringSerializer
            return Result.FromError(converterResult);
        }

        return converterResult.Entity.Serialize(obj, in builder);
        return converterResult.Entity.Serialize(obj, ref builder);
    }

    /// <inheritdoc />
    public Result<TParseType?> Deserialize<TParseType>(in PacketStringEnumerator stringEnumerator, DeserializeOptions options)
    public Result<TParseType?> Deserialize<TParseType>(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options)
    {
        var converterResult = _converterRepository.GetTypeConverter<TParseType>();
        if (!converterResult.IsSuccess)


@@ 63,11 63,11 @@ public class StringSerializer : IStringSerializer
            return Result<TParseType?>.FromError(converterResult);
        }

        return converterResult.Entity.Deserialize(in stringEnumerator, options);
        return converterResult.Entity.Deserialize(ref stringEnumerator, options);
    }

    /// <inheritdoc />
    public Result Serialize<TParseType>(TParseType? obj, in PacketStringBuilder builder)
    public Result Serialize<TParseType>(TParseType? obj, ref PacketStringBuilder builder)
    {
        var converterResult = _converterRepository.GetTypeConverter<TParseType>();
        if (!converterResult.IsSuccess)


@@ 75,6 75,6 @@ public class StringSerializer : IStringSerializer
            return Result.FromError(converterResult);
        }

        return converterResult.Entity.Serialize(obj, in builder);
        return converterResult.Entity.Serialize(obj, ref builder);
    }
}
\ No newline at end of file

M Packets/NosSmooth.PacketSerializer/PacketSerializer.cs => Packets/NosSmooth.PacketSerializer/PacketSerializer.cs +2 -2
@@ 48,7 48,7 @@ public class PacketSerializer : IPacketSerializer
        }

        stringBuilder.Append(info.Header);
        var serializeResult = info.PacketConverter.Serialize(obj, in stringBuilder);
        var serializeResult = info.PacketConverter.Serialize(obj, ref stringBuilder);
        if (!serializeResult.IsSuccess)
        {
            return Result<string>.FromError(serializeResult);


@@ 74,7 74,7 @@ public class PacketSerializer : IPacketSerializer
        }

        var packetInfo = packetInfoResult.Entity;
        var deserializedResult = packetInfo.PacketConverter.Deserialize(in packetStringEnumerator, default);
        var deserializedResult = packetInfo.PacketConverter.Deserialize(ref packetStringEnumerator, default);
        if (!deserializedResult.IsSuccess)
        {
            return Result<IPacket>.FromError(deserializedResult);

M Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BasicInlineConverterGenerator.cs => Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BasicInlineConverterGenerator.cs +2 -2
@@ 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, in stringEnumerator, {nullable.ToString().ToLower()});");
        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, in PacketStringEnumerator stringEnumerator, bool nullable)
public static Result<{type}?> ParseBasic{type}(IStringConverter typeConverter, ref PacketStringEnumerator stringEnumerator, bool nullable)
{{
    var tokenResult = stringEnumerator.GetNextToken(out var packetToken);
    if (!tokenResult.IsSuccess)

M Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BoolInlineConverterGenerator.cs => Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BoolInlineConverterGenerator.cs +2 -2
@@ 44,7 44,7 @@ public class BoolInlineConverterGenerator : IInlineConverterGenerator
    /// <inheritdoc />
    public IError? CallDeserialize(IndentedTextWriter textWriter, TypeSyntax? typeSyntax, ITypeSymbol? typeSymbol, bool nullable)
    {
        textWriter.WriteLine($"{Constants.HelperClass}.ParseBool(in stringEnumerator, {nullable.ToString().ToLower()});");
        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<bool?> ParseBool(in PacketStringEnumerator stringEnumerator, bool nullable)
public static Result<bool?> ParseBool(ref PacketStringEnumerator stringEnumerator, bool nullable)
{{
    var tokenResult = stringEnumerator.GetNextToken(out var packetToken);
    if (!tokenResult.IsSuccess)

M Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/EnumInlineConverterGenerator.cs => Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/EnumInlineConverterGenerator.cs +2 -2
@@ 66,7 66,7 @@ public class EnumInlineConverterGenerator : IInlineConverterGenerator

        textWriter.WriteLine
        (
            $"{Constants.HelperClass}.ParseEnum{typeSymbol?.ToString().TrimEnd('?').Replace('.', '_')}(typeConverter, in stringEnumerator, {nullable.ToString().ToLower()});"
            $"{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, in PacketStringEnumerator stringEnumerator, bool nullable)
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)

M Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/FallbackInlineConverterGenerator.cs => Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/FallbackInlineConverterGenerator.cs +2 -2
@@ 32,7 32,7 @@ public class FallbackInlineConverterGenerator : IInlineConverterGenerator
        var resultName = $"{variableName.Replace(".", string.Empty)}Result";
        textWriter.WriteLine
        (
            $"var {resultName} = _stringSerializer.Serialize<{(typeSyntax?.ToString() ?? typeSymbol!.ToString()).TrimEnd('?')}?>({variableName}, in builder);"
            $"var {resultName} = _stringSerializer.Serialize<{(typeSyntax?.ToString() ?? typeSymbol!.ToString()).TrimEnd('?')}?>({variableName}, ref builder);"
        );
        textWriter.WriteLine($"if (!{resultName}.IsSuccess)");
        textWriter.WriteLine("{");


@@ 49,7 49,7 @@ public class FallbackInlineConverterGenerator : IInlineConverterGenerator
        var options = nullable ? "DeserializeOptions.Nullable" : "default";
        textWriter.WriteLine
        (
            $"_stringSerializer.Deserialize<{(typeSyntax?.ToString() ?? typeSymbol!.ToString()).TrimEnd('?')}?>(in stringEnumerator, {options});"
            $"_stringSerializer.Deserialize<{(typeSyntax?.ToString() ?? typeSymbol!.ToString()).TrimEnd('?')}?>(ref stringEnumerator, {options});"
        );
        return null;
    }

M Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/ListInlineConverterGenerator.cs => Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/ListInlineConverterGenerator.cs +2 -2
@@ 89,7 89,7 @@ public class ListInlineConverterGenerator : IInlineConverterGenerator
        }

        textWriter.WriteLine
            ($"{Constants.HelperClass}.{GetMethodName(genericArgument, nullable)}(typeConverter, _stringSerializer, in stringEnumerator);");
            ($"{Constants.HelperClass}.{GetMethodName(genericArgument, nullable)}(typeConverter, _stringSerializer, ref stringEnumerator);");
        return null;
    }



@@ 106,7 106,7 @@ public class ListInlineConverterGenerator : IInlineConverterGenerator
            textWriter.WriteLine
            (
                @$"
public static Result<IReadOnlyList<{type.GetActualType()}>> {GetMethodName(type, nullable)}(IStringConverter typeConverter, IStringSerializer _stringSerializer, in PacketStringEnumerator stringEnumerator)
public static Result<IReadOnlyList<{type.GetActualType()}>> {GetMethodName(type, nullable)}(IStringConverter typeConverter, IStringSerializer _stringSerializer, ref PacketStringEnumerator stringEnumerator)
{{
    var data = new List<{type.GetActualType()}>();


M Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/StringInlineConverterGenerator.cs => Packets/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/StringInlineConverterGenerator.cs +2 -2
@@ 30,7 30,7 @@ public class StringInlineConverterGenerator : IInlineConverterGenerator
    /// <inheritdoc />
    public IError? CallDeserialize(IndentedTextWriter textWriter, TypeSyntax? typeSyntax, ITypeSymbol? typeSymbol, bool nullable)
    {
        textWriter.WriteLine($"{Constants.HelperClass}.ParseString(in stringEnumerator, {nullable.ToString().ToLower()});");
        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<string?> ParseString(in PacketStringEnumerator stringEnumerator, bool nullable)
public static Result<string?> ParseString(ref PacketStringEnumerator stringEnumerator, bool nullable)
{{
    var tokenResult = stringEnumerator.GetNextToken(out var packetToken);
    if (!tokenResult.IsSuccess)

M Packets/NosSmooth.PacketSerializersGenerator/PacketConverterGenerator.cs => Packets/NosSmooth.PacketSerializersGenerator/PacketConverterGenerator.cs +2 -2
@@ 75,7 75,7 @@ public {_packetInfo.Name}Converter(IStringSerializer stringSerializer)
}}

/// <inheritdoc />
public override Result Serialize({_packetInfo.Name}? obj, in PacketStringBuilder builder)
public override Result Serialize({_packetInfo.Name}? obj, ref PacketStringBuilder builder)
{{
    if (obj is null)
    {{


@@ 97,7 97,7 @@ public override Result Serialize({_packetInfo.Name}? obj, in PacketStringBuilder
}}

/// <inheritdoc />
public override Result<{_packetInfo.Name}?> Deserialize(in PacketStringEnumerator stringEnumerator, DeserializeOptions options)
public override Result<{_packetInfo.Name}?> Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options)
{{
    var typeConverter = this;
"

M Tests/NosSmooth.Packets.Tests/Converters/Basic/BoolStringConverterTests.cs => Tests/NosSmooth.Packets.Tests/Converters/Basic/BoolStringConverterTests.cs +4 -4
@@ 39,7 39,7 @@ public class BoolStringConverterTests
    {
        bool? test = null;
        var stringBuilder = new PacketStringBuilder(stackalloc char[500]);
        var serializeResult = _stringSerializer.Serialize(test, in stringBuilder);
        var serializeResult = _stringSerializer.Serialize(test, ref stringBuilder);
        Assert.True(serializeResult.IsSuccess, !serializeResult.IsSuccess ? serializeResult.Error.Message : string.Empty);
        Assert.Equal("-1", stringBuilder.ToString());
    }


@@ 52,7 52,7 @@ public class BoolStringConverterTests
    {
        var deserialize = "-1";
        var stringEnumerator = new PacketStringEnumerator(deserialize);
        var deserializeResult = _stringSerializer.Deserialize<bool?>(in stringEnumerator, DeserializeOptions.Nullable);
        var deserializeResult = _stringSerializer.Deserialize<bool?>(ref stringEnumerator, DeserializeOptions.Nullable);
        Assert.True(deserializeResult.IsSuccess, !deserializeResult.IsSuccess ? deserializeResult.Error.Message : string.Empty);
        Assert.Null(deserializeResult.Entity);
    }


@@ 65,7 65,7 @@ public class BoolStringConverterTests
    {
        var deserialize = "1";
        var stringEnumerator = new PacketStringEnumerator(deserialize);
        var deserializeResult = _stringSerializer.Deserialize<bool?>(in stringEnumerator, default);
        var deserializeResult = _stringSerializer.Deserialize<bool?>(ref stringEnumerator, default);
        Assert.True(deserializeResult.IsSuccess, !deserializeResult.IsSuccess ? deserializeResult.Error.Message : string.Empty);
        Assert.True(deserializeResult.Entity);
    }


@@ 78,7 78,7 @@ public class BoolStringConverterTests
    {
        var deserialize = "0";
        var stringEnumerator = new PacketStringEnumerator(deserialize);
        var deserializeResult = _stringSerializer.Deserialize<bool?>(in stringEnumerator, default);
        var deserializeResult = _stringSerializer.Deserialize<bool?>(ref stringEnumerator, default);
        Assert.True(deserializeResult.IsSuccess, !deserializeResult.IsSuccess ? deserializeResult.Error.Message : string.Empty);
        Assert.False(deserializeResult.Entity);
    }

M Tests/NosSmooth.Packets.Tests/Converters/Basic/StringConverterTests.cs => Tests/NosSmooth.Packets.Tests/Converters/Basic/StringConverterTests.cs +3 -3
@@ 39,7 39,7 @@ public class StringConverterTests
    {
        string? test = null;
        var stringBuilder = new PacketStringBuilder(stackalloc char[500]);
        var serializeResult = _stringSerializer.Serialize(test, in stringBuilder);
        var serializeResult = _stringSerializer.Serialize(test, ref stringBuilder);
        Assert.True(serializeResult.IsSuccess, !serializeResult.IsSuccess ? serializeResult.Error.Message : string.Empty);
        Assert.Equal("-", stringBuilder.ToString());
    }


@@ 52,7 52,7 @@ public class StringConverterTests
    {
        var deserialize = "-";
        var stringEnumerator = new PacketStringEnumerator(deserialize);
        var deserializeResult = _stringSerializer.Deserialize<string?>(in stringEnumerator, DeserializeOptions.Nullable);
        var deserializeResult = _stringSerializer.Deserialize<string?>(ref stringEnumerator, DeserializeOptions.Nullable);
        Assert.True(deserializeResult.IsSuccess, !deserializeResult.IsSuccess ? deserializeResult.Error.Message : string.Empty);
        Assert.Null(deserializeResult.Entity);
    }


@@ 65,7 65,7 @@ public class StringConverterTests
    {
        var deserialize = "-";
        var stringEnumerator = new PacketStringEnumerator(deserialize);
        var deserializeResult = _stringSerializer.Deserialize<string?>(in stringEnumerator, default);
        var deserializeResult = _stringSerializer.Deserialize<string?>(ref stringEnumerator, default);
        Assert.True(deserializeResult.IsSuccess, !deserializeResult.IsSuccess ? deserializeResult.Error.Message : string.Empty);
        Assert.NotNull(deserializeResult.Entity);
        Assert.Equal("-", deserializeResult.Entity);

Do not follow this link