From 7f45f96e9a0ff9e0c0110b6184eb41aee91667af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Fri, 7 Jan 2022 15:36:43 +0100 Subject: [PATCH] refactor: split string converters --- .../BasicInlineConverterGenerator.cs | 2 +- .../EnumInlineConverterGenerator.cs | 2 +- .../FallbackInlineConverterGenerator.cs | 4 +- .../ListInlineConverterGenerator.cs | 4 +- .../PacketConverterGenerator.cs | 8 +- ...ypeConverter.cs => BaseStringConverter.cs} | 8 +- .../Converters/Basic/BasicTypeConverter.cs | 2 +- ...ypeConverter.cs => BoolStringConverter.cs} | 4 +- ...ypeConverter.cs => ByteStringConverter.cs} | 4 +- ...ypeConverter.cs => CharStringConverter.cs} | 4 +- ...TypeConverter.cs => IntStringConverter.cs} | 4 +- ...ypeConverter.cs => LongStringConverter.cs} | 4 +- ...peConverter.cs => ShortStringConverter.cs} | 4 +- ...ypeConverter.cs => UIntStringConverter.cs} | 4 +- ...peConverter.cs => ULongStringConverter.cs} | 4 +- ...eConverter.cs => UShortStringConverter.cs} | 4 +- .../Converters/Common/NameStringConverter.cs | 2 +- ...{ITypeConverter.cs => IStringConverter.cs} | 6 +- .../Converters/IStringConverterRepository.cs | 32 +++ ...rterRepository.cs => IStringSerializer.cs} | 22 +- .../Packets/UpgradeRareSubPacketConverter.cs | 2 +- .../Special/Converters/EnumStringConverter.cs | 49 ++++ .../Special/Converters/ListStringConverter.cs | 98 +++++++ .../Converters/NullableStringConverter.cs | 56 ++++ .../Special/EnumStringConverterFactory.cs | 55 ++++ .../Converters/Special/EnumTypeConverter.cs | 45 ---- .../Special/ISpecialTypeConverter.cs | 41 --- .../Special/IStringConverterFactory.cs | 38 +++ .../Special/ListStringConverterFactory.cs | 62 +++++ .../Converters/Special/ListTypeConverter.cs | 147 ----------- .../Special/NullableStringConverterFactory.cs | 61 +++++ .../Special/NullableTypeConverter.cs | 37 --- .../Converters/Special/StringSerializer.cs | 80 ++++++ .../Converters/StringConverterRepository.cs | 106 ++++++++ .../Converters/TypeConverterRepository.cs | 245 ------------------ .../Errors/CouldNotConvertError.cs | 2 +- .../Errors/PacketEndNotExpectedError.cs | 2 +- .../Errors/PacketParameterSerializerError.cs | 2 +- .../Errors/WrongTypeError.cs | 2 +- .../ConcurrentDictionaryExtensions.cs | 52 ++++ .../Extensions/ResultExtensions.cs | 35 +++ .../Extensions/ServiceCollectionExtensions.cs | 68 ++--- Core/NosSmooth.Packets/Packets/PacketInfo.cs | 2 +- .../Packets/PacketTypesRepository.cs | 10 +- 44 files changed, 809 insertions(+), 616 deletions(-) rename Core/NosSmooth.Packets/Converters/{BaseTypeConverter.cs => BaseStringConverter.cs} (80%) rename Core/NosSmooth.Packets/Converters/Basic/{BoolTypeConverter.cs => BoolStringConverter.cs} (92%) rename Core/NosSmooth.Packets/Converters/Basic/{ByteTypeConverter.cs => ByteStringConverter.cs} (87%) rename Core/NosSmooth.Packets/Converters/Basic/{CharTypeConverter.cs => CharStringConverter.cs} (87%) rename Core/NosSmooth.Packets/Converters/Basic/{IntTypeConverter.cs => IntStringConverter.cs} (88%) rename Core/NosSmooth.Packets/Converters/Basic/{LongTypeConverter.cs => LongStringConverter.cs} (87%) rename Core/NosSmooth.Packets/Converters/Basic/{ShortTypeConverter.cs => ShortStringConverter.cs} (87%) rename Core/NosSmooth.Packets/Converters/Basic/{UIntTypeConverter.cs => UIntStringConverter.cs} (87%) rename Core/NosSmooth.Packets/Converters/Basic/{ULongTypeConverter.cs => ULongStringConverter.cs} (87%) rename Core/NosSmooth.Packets/Converters/Basic/{UShortTypeConverter.cs => UShortStringConverter.cs} (87%) rename Core/NosSmooth.Packets/Converters/{ITypeConverter.cs => IStringConverter.cs} (94%) create mode 100644 Core/NosSmooth.Packets/Converters/IStringConverterRepository.cs rename Core/NosSmooth.Packets/Converters/{ITypeConverterRepository.cs => IStringSerializer.cs} (73%) create mode 100644 Core/NosSmooth.Packets/Converters/Special/Converters/EnumStringConverter.cs create mode 100644 Core/NosSmooth.Packets/Converters/Special/Converters/ListStringConverter.cs create mode 100644 Core/NosSmooth.Packets/Converters/Special/Converters/NullableStringConverter.cs create mode 100644 Core/NosSmooth.Packets/Converters/Special/EnumStringConverterFactory.cs delete mode 100644 Core/NosSmooth.Packets/Converters/Special/EnumTypeConverter.cs delete mode 100644 Core/NosSmooth.Packets/Converters/Special/ISpecialTypeConverter.cs create mode 100644 Core/NosSmooth.Packets/Converters/Special/IStringConverterFactory.cs create mode 100644 Core/NosSmooth.Packets/Converters/Special/ListStringConverterFactory.cs delete mode 100644 Core/NosSmooth.Packets/Converters/Special/ListTypeConverter.cs create mode 100644 Core/NosSmooth.Packets/Converters/Special/NullableStringConverterFactory.cs delete mode 100644 Core/NosSmooth.Packets/Converters/Special/NullableTypeConverter.cs create mode 100644 Core/NosSmooth.Packets/Converters/Special/StringSerializer.cs create mode 100644 Core/NosSmooth.Packets/Converters/StringConverterRepository.cs delete mode 100644 Core/NosSmooth.Packets/Converters/TypeConverterRepository.cs create mode 100644 Core/NosSmooth.Packets/Extensions/ConcurrentDictionaryExtensions.cs create mode 100644 Core/NosSmooth.Packets/Extensions/ResultExtensions.cs diff --git a/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BasicInlineConverterGenerator.cs b/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BasicInlineConverterGenerator.cs index 364e7aa..2ad5e7c 100644 --- a/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BasicInlineConverterGenerator.cs +++ b/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/BasicInlineConverterGenerator.cs @@ -67,7 +67,7 @@ public class BasicInlineConverterGenerator : IInlineConverterGenerator foreach (var type in HandleTypes) { textWriter.WriteMultiline($@" -public static Result<{type}?> ParseBasic{type}(ITypeConverter typeConverter, PacketStringEnumerator stringEnumerator) +public static Result<{type}?> ParseBasic{type}(IStringConverter typeConverter, PacketStringEnumerator stringEnumerator) {{ var tokenResult = stringEnumerator.GetNextToken(); if (!tokenResult.IsSuccess) diff --git a/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/EnumInlineConverterGenerator.cs b/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/EnumInlineConverterGenerator.cs index 5f163a1..f8e9930 100644 --- a/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/EnumInlineConverterGenerator.cs +++ b/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/EnumInlineConverterGenerator.cs @@ -80,7 +80,7 @@ public class EnumInlineConverterGenerator : IInlineConverterGenerator textWriter.WriteMultiline ( $@" -public static Result<{type}?> ParseEnum{type.ToString().Replace('.', '_')}(ITypeConverter typeConverter, PacketStringEnumerator stringEnumerator) +public static Result<{type}?> ParseEnum{type.ToString().Replace('.', '_')}(IStringConverter typeConverter, PacketStringEnumerator stringEnumerator) {{ var tokenResult = stringEnumerator.GetNextToken(); if (!tokenResult.IsSuccess) diff --git a/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/FallbackInlineConverterGenerator.cs b/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/FallbackInlineConverterGenerator.cs index 32856dc..69fd6cd 100644 --- a/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/FallbackInlineConverterGenerator.cs +++ b/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/FallbackInlineConverterGenerator.cs @@ -32,7 +32,7 @@ public class FallbackInlineConverterGenerator : IInlineConverterGenerator var resultName = $"{variableName.Replace(".", string.Empty)}Result"; textWriter.WriteLine ( - $"var {resultName} = _typeConverterRepository.Serialize<{(typeSyntax?.ToString() ?? typeSymbol!.ToString()).TrimEnd('?')}?>({variableName}, builder);" + $"var {resultName} = _stringSerializer.Serialize<{(typeSyntax?.ToString() ?? typeSymbol!.ToString()).TrimEnd('?')}?>({variableName}, builder);" ); textWriter.WriteLine($"if (!{resultName}.IsSuccess)"); textWriter.WriteLine("{"); @@ -48,7 +48,7 @@ public class FallbackInlineConverterGenerator : IInlineConverterGenerator { textWriter.WriteLine ( - $"_typeConverterRepository.Deserialize<{(typeSyntax?.ToString() ?? typeSymbol!.ToString()).TrimEnd('?')}?>(stringEnumerator);" + $"_stringSerializer.Deserialize<{(typeSyntax?.ToString() ?? typeSymbol!.ToString()).TrimEnd('?')}?>(stringEnumerator);" ); return null; } diff --git a/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/ListInlineConverterGenerator.cs b/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/ListInlineConverterGenerator.cs index b8b6e56..59b6f80 100644 --- a/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/ListInlineConverterGenerator.cs +++ b/Core/NosSmooth.PacketSerializersGenerator/InlineConverterGenerators/ListInlineConverterGenerator.cs @@ -89,7 +89,7 @@ public class ListInlineConverterGenerator : IInlineConverterGenerator } textWriter.WriteLine - ($"{Constants.HelperClass}.{GetMethodName(genericArgument)}(typeConverter, _typeConverterRepository, stringEnumerator);"); + ($"{Constants.HelperClass}.{GetMethodName(genericArgument)}(typeConverter, _stringSerializer, stringEnumerator);"); return null; } @@ -107,7 +107,7 @@ public class ListInlineConverterGenerator : IInlineConverterGenerator textWriter.WriteLine ( @$" -public static Result> {GetMethodName(type)}(ITypeConverter typeConverter, ITypeConverterRepository _typeConverterRepository, PacketStringEnumerator stringEnumerator) +public static Result> {GetMethodName(type)}(IStringConverter typeConverter, IStringSerializer _stringSerializer, PacketStringEnumerator stringEnumerator) {{ var data = new List<{type.GetActualType()}>(); diff --git a/Core/NosSmooth.PacketSerializersGenerator/PacketConverterGenerator.cs b/Core/NosSmooth.PacketSerializersGenerator/PacketConverterGenerator.cs index eb2aeee..c40c270 100644 --- a/Core/NosSmooth.PacketSerializersGenerator/PacketConverterGenerator.cs +++ b/Core/NosSmooth.PacketSerializersGenerator/PacketConverterGenerator.cs @@ -58,18 +58,18 @@ using Remora.Results; namespace {_packetInfo.Namespace}.Generated; -public class {_packetInfo.Name}Converter : BaseTypeConverter<{_packetInfo.Name}> +public class {_packetInfo.Name}Converter : BaseStringConverter<{_packetInfo.Name}> {{" ); textWriter.Indent++; textWriter.WriteLine ( $@" -private readonly ITypeConverterRepository _typeConverterRepository; +private readonly IStringSerializer _stringSerializer; -public {_packetInfo.Name}Converter(ITypeConverterRepository typeConverterRepository) +public {_packetInfo.Name}Converter(IStringSerializer stringSerializer) {{ - _typeConverterRepository = typeConverterRepository; + _stringSerializer = stringSerializer; }} /// diff --git a/Core/NosSmooth.Packets/Converters/BaseTypeConverter.cs b/Core/NosSmooth.Packets/Converters/BaseStringConverter.cs similarity index 80% rename from Core/NosSmooth.Packets/Converters/BaseTypeConverter.cs rename to Core/NosSmooth.Packets/Converters/BaseStringConverter.cs index 035ee18..e020e74 100644 --- a/Core/NosSmooth.Packets/Converters/BaseTypeConverter.cs +++ b/Core/NosSmooth.Packets/Converters/BaseStringConverter.cs @@ -1,5 +1,5 @@ // -// BaseTypeConverter.cs +// BaseStringConverter.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. @@ -13,7 +13,7 @@ namespace NosSmooth.Packets.Converters; /// Base type for converting objects that maps object converting methods to the actual type. /// /// The type of the object that this converts. -public abstract class BaseTypeConverter : ITypeConverter +public abstract class BaseStringConverter : IStringConverter { /// public abstract Result Serialize(TParseType? obj, PacketStringBuilder builder); @@ -22,7 +22,7 @@ public abstract class BaseTypeConverter : ITypeConverter public abstract Result Deserialize(PacketStringEnumerator stringEnumerator); /// - Result ITypeConverter.Deserialize(PacketStringEnumerator stringEnumerator) + Result IStringConverter.Deserialize(PacketStringEnumerator stringEnumerator) { var result = Deserialize(stringEnumerator); if (!result.IsSuccess) @@ -34,7 +34,7 @@ public abstract class BaseTypeConverter : ITypeConverter } /// - Result ITypeConverter.Serialize(object? obj, PacketStringBuilder builder) + Result IStringConverter.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 16cf5af..817cebc 100644 --- a/Core/NosSmooth.Packets/Converters/Basic/BasicTypeConverter.cs +++ b/Core/NosSmooth.Packets/Converters/Basic/BasicTypeConverter.cs @@ -13,7 +13,7 @@ namespace NosSmooth.Packets.Converters.Basic; /// Basic type converter for converting using . /// /// The basic type, that contains correct to string. -public abstract class BasicTypeConverter : BaseTypeConverter +public abstract class BasicTypeConverter : BaseStringConverter { /// public override Result Serialize(TBasicType? obj, PacketStringBuilder builder) diff --git a/Core/NosSmooth.Packets/Converters/Basic/BoolTypeConverter.cs b/Core/NosSmooth.Packets/Converters/Basic/BoolStringConverter.cs similarity index 92% rename from Core/NosSmooth.Packets/Converters/Basic/BoolTypeConverter.cs rename to Core/NosSmooth.Packets/Converters/Basic/BoolStringConverter.cs index d87a5cd..a1ad76a 100644 --- a/Core/NosSmooth.Packets/Converters/Basic/BoolTypeConverter.cs +++ b/Core/NosSmooth.Packets/Converters/Basic/BoolStringConverter.cs @@ -1,5 +1,5 @@ // -// BoolTypeConverter.cs +// BoolStringConverter.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. @@ -12,7 +12,7 @@ namespace NosSmooth.Packets.Converters.Basic; /// /// Converter of . /// -public class BoolTypeConverter : BaseTypeConverter +public class BoolStringConverter : BaseStringConverter { /// public override Result Serialize(bool obj, PacketStringBuilder builder) diff --git a/Core/NosSmooth.Packets/Converters/Basic/ByteTypeConverter.cs b/Core/NosSmooth.Packets/Converters/Basic/ByteStringConverter.cs similarity index 87% rename from Core/NosSmooth.Packets/Converters/Basic/ByteTypeConverter.cs rename to Core/NosSmooth.Packets/Converters/Basic/ByteStringConverter.cs index baab668..2a9cab5 100644 --- a/Core/NosSmooth.Packets/Converters/Basic/ByteTypeConverter.cs +++ b/Core/NosSmooth.Packets/Converters/Basic/ByteStringConverter.cs @@ -1,5 +1,5 @@ // -// ByteTypeConverter.cs +// ByteStringConverter.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. @@ -12,7 +12,7 @@ namespace NosSmooth.Packets.Converters.Basic; /// /// Converter of . /// -public class ByteTypeConverter : BasicTypeConverter +public class ByteStringConverter : BasicTypeConverter { /// protected override Result Deserialize(string value) diff --git a/Core/NosSmooth.Packets/Converters/Basic/CharTypeConverter.cs b/Core/NosSmooth.Packets/Converters/Basic/CharStringConverter.cs similarity index 87% rename from Core/NosSmooth.Packets/Converters/Basic/CharTypeConverter.cs rename to Core/NosSmooth.Packets/Converters/Basic/CharStringConverter.cs index f41fc4c..f0dd83f 100644 --- a/Core/NosSmooth.Packets/Converters/Basic/CharTypeConverter.cs +++ b/Core/NosSmooth.Packets/Converters/Basic/CharStringConverter.cs @@ -1,5 +1,5 @@ // -// CharTypeConverter.cs +// CharStringConverter.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. @@ -12,7 +12,7 @@ namespace NosSmooth.Packets.Converters.Basic; /// /// Converter of . /// -public class CharTypeConverter : BasicTypeConverter +public class CharStringConverter : BasicTypeConverter { /// protected override Result Deserialize(string value) diff --git a/Core/NosSmooth.Packets/Converters/Basic/IntTypeConverter.cs b/Core/NosSmooth.Packets/Converters/Basic/IntStringConverter.cs similarity index 88% rename from Core/NosSmooth.Packets/Converters/Basic/IntTypeConverter.cs rename to Core/NosSmooth.Packets/Converters/Basic/IntStringConverter.cs index fc73fba..4ced867 100644 --- a/Core/NosSmooth.Packets/Converters/Basic/IntTypeConverter.cs +++ b/Core/NosSmooth.Packets/Converters/Basic/IntStringConverter.cs @@ -1,5 +1,5 @@ // -// IntTypeConverter.cs +// IntStringConverter.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. @@ -12,7 +12,7 @@ namespace NosSmooth.Packets.Converters.Basic; /// /// Converter of . /// -public class IntTypeConverter : BasicTypeConverter +public class IntStringConverter : BasicTypeConverter { /// protected override Result Deserialize(string value) diff --git a/Core/NosSmooth.Packets/Converters/Basic/LongTypeConverter.cs b/Core/NosSmooth.Packets/Converters/Basic/LongStringConverter.cs similarity index 87% rename from Core/NosSmooth.Packets/Converters/Basic/LongTypeConverter.cs rename to Core/NosSmooth.Packets/Converters/Basic/LongStringConverter.cs index 94a836f..521d613 100644 --- a/Core/NosSmooth.Packets/Converters/Basic/LongTypeConverter.cs +++ b/Core/NosSmooth.Packets/Converters/Basic/LongStringConverter.cs @@ -1,5 +1,5 @@ // -// LongTypeConverter.cs +// LongStringConverter.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. @@ -12,7 +12,7 @@ namespace NosSmooth.Packets.Converters.Basic; /// /// Converter of . /// -public class LongTypeConverter : BasicTypeConverter +public class LongStringConverter : BasicTypeConverter { /// protected override Result Deserialize(string value) diff --git a/Core/NosSmooth.Packets/Converters/Basic/ShortTypeConverter.cs b/Core/NosSmooth.Packets/Converters/Basic/ShortStringConverter.cs similarity index 87% rename from Core/NosSmooth.Packets/Converters/Basic/ShortTypeConverter.cs rename to Core/NosSmooth.Packets/Converters/Basic/ShortStringConverter.cs index f726f8e..aa9568c 100644 --- a/Core/NosSmooth.Packets/Converters/Basic/ShortTypeConverter.cs +++ b/Core/NosSmooth.Packets/Converters/Basic/ShortStringConverter.cs @@ -1,5 +1,5 @@ // -// ShortTypeConverter.cs +// ShortStringConverter.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. @@ -12,7 +12,7 @@ namespace NosSmooth.Packets.Converters.Basic; /// /// Converter of . /// -public class ShortTypeConverter : BasicTypeConverter +public class ShortStringConverter : BasicTypeConverter { /// protected override Result Deserialize(string value) diff --git a/Core/NosSmooth.Packets/Converters/Basic/UIntTypeConverter.cs b/Core/NosSmooth.Packets/Converters/Basic/UIntStringConverter.cs similarity index 87% rename from Core/NosSmooth.Packets/Converters/Basic/UIntTypeConverter.cs rename to Core/NosSmooth.Packets/Converters/Basic/UIntStringConverter.cs index 8d4c9cc..2344e15 100644 --- a/Core/NosSmooth.Packets/Converters/Basic/UIntTypeConverter.cs +++ b/Core/NosSmooth.Packets/Converters/Basic/UIntStringConverter.cs @@ -1,5 +1,5 @@ // -// UIntTypeConverter.cs +// UIntStringConverter.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. @@ -12,7 +12,7 @@ namespace NosSmooth.Packets.Converters.Basic; /// /// Converter of . /// -public class UIntTypeConverter : BasicTypeConverter +public class UIntStringConverter : BasicTypeConverter { /// protected override Result Deserialize(string value) diff --git a/Core/NosSmooth.Packets/Converters/Basic/ULongTypeConverter.cs b/Core/NosSmooth.Packets/Converters/Basic/ULongStringConverter.cs similarity index 87% rename from Core/NosSmooth.Packets/Converters/Basic/ULongTypeConverter.cs rename to Core/NosSmooth.Packets/Converters/Basic/ULongStringConverter.cs index c0f7e15..5b9c378 100644 --- a/Core/NosSmooth.Packets/Converters/Basic/ULongTypeConverter.cs +++ b/Core/NosSmooth.Packets/Converters/Basic/ULongStringConverter.cs @@ -1,5 +1,5 @@ // -// ULongTypeConverter.cs +// ULongStringConverter.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. @@ -12,7 +12,7 @@ namespace NosSmooth.Packets.Converters.Basic; /// /// Converter of . /// -public class ULongTypeConverter : BasicTypeConverter +public class ULongStringConverter : BasicTypeConverter { /// protected override Result Deserialize(string value) diff --git a/Core/NosSmooth.Packets/Converters/Basic/UShortTypeConverter.cs b/Core/NosSmooth.Packets/Converters/Basic/UShortStringConverter.cs similarity index 87% rename from Core/NosSmooth.Packets/Converters/Basic/UShortTypeConverter.cs rename to Core/NosSmooth.Packets/Converters/Basic/UShortStringConverter.cs index 818770a..4d1c7d9 100644 --- a/Core/NosSmooth.Packets/Converters/Basic/UShortTypeConverter.cs +++ b/Core/NosSmooth.Packets/Converters/Basic/UShortStringConverter.cs @@ -1,5 +1,5 @@ // -// UShortTypeConverter.cs +// UShortStringConverter.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. @@ -12,7 +12,7 @@ namespace NosSmooth.Packets.Converters.Basic; /// /// Converter of . /// -public class UShortTypeConverter : BasicTypeConverter +public class UShortStringConverter : BasicTypeConverter { /// protected override Result Deserialize(string value) diff --git a/Core/NosSmooth.Packets/Converters/Common/NameStringConverter.cs b/Core/NosSmooth.Packets/Converters/Common/NameStringConverter.cs index 7fe3940..0e63ea5 100644 --- a/Core/NosSmooth.Packets/Converters/Common/NameStringConverter.cs +++ b/Core/NosSmooth.Packets/Converters/Common/NameStringConverter.cs @@ -13,7 +13,7 @@ namespace NosSmooth.Packets.Converters.Common; /// /// Converter of . /// -public class NameStringConverter : BaseTypeConverter +public class NameStringConverter : BaseStringConverter { /// public override Result Serialize(NameString? obj, PacketStringBuilder builder) diff --git a/Core/NosSmooth.Packets/Converters/ITypeConverter.cs b/Core/NosSmooth.Packets/Converters/IStringConverter.cs similarity index 94% rename from Core/NosSmooth.Packets/Converters/ITypeConverter.cs rename to Core/NosSmooth.Packets/Converters/IStringConverter.cs index a68ee8c..ba4f3f4 100644 --- a/Core/NosSmooth.Packets/Converters/ITypeConverter.cs +++ b/Core/NosSmooth.Packets/Converters/IStringConverter.cs @@ -1,5 +1,5 @@ // -// ITypeConverter.cs +// IStringConverter.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. @@ -11,7 +11,7 @@ namespace NosSmooth.Packets.Converters; /// /// Base type for converting types. /// -public interface ITypeConverter +public interface IStringConverter { /// /// Convert the data from the enumerator to the given type. @@ -36,7 +36,7 @@ public interface ITypeConverter /// Used for converting packets. /// /// The type that can be parsed. -public interface ITypeConverter : ITypeConverter +public interface IStringConverter : IStringConverter { /// /// Convert the data from the enumerator to the given type. diff --git a/Core/NosSmooth.Packets/Converters/IStringConverterRepository.cs b/Core/NosSmooth.Packets/Converters/IStringConverterRepository.cs new file mode 100644 index 0000000..b1b9a8c --- /dev/null +++ b/Core/NosSmooth.Packets/Converters/IStringConverterRepository.cs @@ -0,0 +1,32 @@ +// +// IStringConverterRepository.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; +using NosSmooth.Packets.Converters.Special; +using NosSmooth.Packets.Errors; +using Remora.Results; + +namespace NosSmooth.Packets.Converters; + +/// +/// Repository for . +/// +public interface IStringConverterRepository +{ + /// + /// Gets the type converter for the given type. + /// + /// The type to find converter for. + /// The type converter or an error. + public Result GetTypeConverter(Type type); + + /// + /// Gets the type converter for the given type. + /// + /// The type to find converter for. + /// The type converter or an error. + public Result> GetTypeConverter(); +} \ No newline at end of file diff --git a/Core/NosSmooth.Packets/Converters/ITypeConverterRepository.cs b/Core/NosSmooth.Packets/Converters/IStringSerializer.cs similarity index 73% rename from Core/NosSmooth.Packets/Converters/ITypeConverterRepository.cs rename to Core/NosSmooth.Packets/Converters/IStringSerializer.cs index ab41c69..67786ff 100644 --- a/Core/NosSmooth.Packets/Converters/ITypeConverterRepository.cs +++ b/Core/NosSmooth.Packets/Converters/IStringSerializer.cs @@ -1,35 +1,19 @@ // -// ITypeConverterRepository.cs +// IStringSerializer.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; -using NosSmooth.Packets.Converters.Special; -using NosSmooth.Packets.Errors; using Remora.Results; namespace NosSmooth.Packets.Converters; /// -/// Repository for . +/// Serializer of values from NosTale packet strings. /// -public interface ITypeConverterRepository +public interface IStringSerializer { - /// - /// Gets the type converter for the given type. - /// - /// The type to find converter for. - /// The type converter or an error. - public Result GetTypeConverter(Type type); - - /// - /// Gets the type converter for the given type. - /// - /// The type to find converter for. - /// The type converter or an error. - public Result> GetTypeConverter(); - /// /// Convert the data from the enumerator to the given type. /// diff --git a/Core/NosSmooth.Packets/Converters/Packets/UpgradeRareSubPacketConverter.cs b/Core/NosSmooth.Packets/Converters/Packets/UpgradeRareSubPacketConverter.cs index e325bed..5e7d13e 100644 --- a/Core/NosSmooth.Packets/Converters/Packets/UpgradeRareSubPacketConverter.cs +++ b/Core/NosSmooth.Packets/Converters/Packets/UpgradeRareSubPacketConverter.cs @@ -13,7 +13,7 @@ namespace NosSmooth.Packets.Converters.Packets; /// /// Converter for . /// -public class UpgradeRareSubPacketConverter : BaseTypeConverter +public class UpgradeRareSubPacketConverter : BaseStringConverter { /// public override Result Serialize(UpgradeRareSubPacket? obj, PacketStringBuilder builder) diff --git a/Core/NosSmooth.Packets/Converters/Special/Converters/EnumStringConverter.cs b/Core/NosSmooth.Packets/Converters/Special/Converters/EnumStringConverter.cs new file mode 100644 index 0000000..125f16c --- /dev/null +++ b/Core/NosSmooth.Packets/Converters/Special/Converters/EnumStringConverter.cs @@ -0,0 +1,49 @@ +// +// EnumStringConverter.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; +using Remora.Results; + +namespace NosSmooth.Packets.Converters.Special.Converters; + +/// +/// Converts enum with the given underlying type. +/// +/// The enum. +/// The enum's underlying type. +public class EnumStringConverter : BaseStringConverter + where TEnum : TUnderlyingType +{ + private readonly IStringSerializer _serializer; + + /// + /// Initializes a new instance of the class. + /// + /// The string serializer. + public EnumStringConverter(IStringSerializer serializer) + { + _serializer = serializer; + } + + /// + public override Result Serialize(TEnum? obj, PacketStringBuilder builder) + { + builder.Append(((TUnderlyingType?)obj)?.ToString() ?? "-"); + return Result.FromSuccess(); + } + + /// + public override Result Deserialize(PacketStringEnumerator stringEnumerator) + { + var result = _serializer.Deserialize(stringEnumerator); + if (!result.IsSuccess) + { + return Result.FromError(result); + } + + return (TEnum?)result.Entity; + } +} \ No newline at end of file diff --git a/Core/NosSmooth.Packets/Converters/Special/Converters/ListStringConverter.cs b/Core/NosSmooth.Packets/Converters/Special/Converters/ListStringConverter.cs new file mode 100644 index 0000000..1b5e2a0 --- /dev/null +++ b/Core/NosSmooth.Packets/Converters/Special/Converters/ListStringConverter.cs @@ -0,0 +1,98 @@ +// +// ListStringConverter.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; +using System.Collections; +using System.Collections.Generic; +using NosSmooth.Packets.Errors; +using Remora.Results; + +namespace NosSmooth.Packets.Converters.Special.Converters; + +/// +/// Converter for list types. +/// +/// The generic type argument of the list. +public class ListStringConverter : BaseStringConverter> +{ + private readonly IStringSerializer _serializer; + + /// + /// Initializes a new instance of the class. + /// + /// The string serializer. + public ListStringConverter(IStringSerializer serializer) + { + _serializer = serializer; + + } + + /// + public override Result Serialize(IReadOnlyList? obj, PacketStringBuilder builder) + { + if (obj is null) + { + builder.Append('-'); + return Result.FromSuccess(); + } + + foreach (var item in obj) + { + if (!builder.PushPreparedLevel()) + { + return new ArgumentInvalidError(nameof(builder), "The string builder has to have a prepared level for all lists."); + } + + var serializeResult = _serializer.Serialize(item, builder); + builder.PopLevel(); + if (!serializeResult.IsSuccess) + { + return serializeResult; + } + } + + return Result.FromSuccess(); + } + + /// + public override Result?> Deserialize(PacketStringEnumerator stringEnumerator) + { + var list = new List(); + + while (!(stringEnumerator.IsOnLastToken() ?? false)) + { + if (!stringEnumerator.PushPreparedLevel()) + { + return new ArgumentInvalidError(nameof(stringEnumerator), "The string enumerator has to have a prepared level for all lists."); + } + + var result = _serializer.Deserialize(stringEnumerator); + + // 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 + // or the packet has more fields. + while (stringEnumerator.IsOnLastToken() == false) + { + stringEnumerator.GetNextToken(); + } + + stringEnumerator.PopLevel(); + if (!result.IsSuccess) + { + return Result?>.FromError(new ListSerializerError(result, list.Count), result); + } + + if (result.Entity is null) + { + return new DeserializedValueNullError(typeof(IReadOnlyList)); + } + + list.Add(result.Entity); + } + + return list; + } +} \ No newline at end of file diff --git a/Core/NosSmooth.Packets/Converters/Special/Converters/NullableStringConverter.cs b/Core/NosSmooth.Packets/Converters/Special/Converters/NullableStringConverter.cs new file mode 100644 index 0000000..d42681c --- /dev/null +++ b/Core/NosSmooth.Packets/Converters/Special/Converters/NullableStringConverter.cs @@ -0,0 +1,56 @@ +// +// NullableStringConverter.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; +using Remora.Results; + +namespace NosSmooth.Packets.Converters.Special.Converters; + +#pragma warning disable SA1125 +/// +/// Converter of nullable types. +/// +/// The nonnullable underlying type. +public class NullableStringConverter : BaseStringConverter> + where T : struct +{ + private readonly IStringSerializer _stringSerializer; + + /// + /// Initializes a new instance of the class. + /// + /// The string serializer. + public NullableStringConverter(IStringSerializer stringSerializer) + { + _stringSerializer = stringSerializer; + + } + + /// + public override Result Serialize(T? obj, PacketStringBuilder builder) + { + if (obj is null) + { + builder.Append('-'); + return Result.FromSuccess(); + } + + return _stringSerializer.Serialize(obj.Value, builder); + } + + /// + public override Result Deserialize(PacketStringEnumerator stringEnumerator) + { + var result = _stringSerializer.Deserialize(stringEnumerator); + if (!result.IsSuccess) + { + return Result.FromError(result); + } + + return Result.FromSuccess(result.Entity); + } +} +#pragma warning restore SA1125 diff --git a/Core/NosSmooth.Packets/Converters/Special/EnumStringConverterFactory.cs b/Core/NosSmooth.Packets/Converters/Special/EnumStringConverterFactory.cs new file mode 100644 index 0000000..8db79b5 --- /dev/null +++ b/Core/NosSmooth.Packets/Converters/Special/EnumStringConverterFactory.cs @@ -0,0 +1,55 @@ +// +// EnumStringConverterFactory.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; +using Microsoft.Extensions.DependencyInjection; +using NosSmooth.Packets.Converters.Special.Converters; +using NosSmooth.Packets.Extensions; +using Remora.Results; + +namespace NosSmooth.Packets.Converters.Special; + +/// +/// Factory for all enum converters. +/// +public class EnumStringConverterFactory : IStringConverterFactory +{ + private readonly IServiceProvider _serviceProvider; + + /// + /// Initializes a new instance of the class. + /// + /// The service provider. + public EnumStringConverterFactory(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + /// + public bool ShouldHandle(Type type) + => type.IsEnum; + + /// + public Result CreateTypeSerializer(Type type) + { + var underlyingType = type.GetEnumUnderlyingType(); + var serializerType = typeof(EnumStringConverter<,>).MakeGenericType(type, underlyingType); + + try + { + return Result.FromSuccess + ((IStringConverter)ActivatorUtilities.CreateInstance(_serviceProvider, serializerType)); + } + catch (Exception e) + { + return e; + } + } + + /// + public Result> CreateTypeSerializer() + => CreateTypeSerializer(typeof(T)).Cast, IStringConverter>(); +} \ No newline at end of file diff --git a/Core/NosSmooth.Packets/Converters/Special/EnumTypeConverter.cs b/Core/NosSmooth.Packets/Converters/Special/EnumTypeConverter.cs deleted file mode 100644 index a5e8c42..0000000 --- a/Core/NosSmooth.Packets/Converters/Special/EnumTypeConverter.cs +++ /dev/null @@ -1,45 +0,0 @@ -// -// EnumTypeConverter.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; -using Remora.Results; - -namespace NosSmooth.Packets.Converters.Special; - -/// -/// Converts all enums. -/// -public class EnumTypeConverter : ISpecialTypeConverter -{ - /// - public bool ShouldHandle(Type type) - => type.IsEnum; - - /// - public Result Deserialize(Type type, PacketStringEnumerator stringEnumerator) - { - var tokenResult = stringEnumerator.GetNextToken(); - if (!tokenResult.IsSuccess) - { - return Result.FromError(tokenResult); - } - - return Enum.Parse(type, tokenResult.Entity.Token); - } - - /// - public Result Serialize(Type type, object? obj, PacketStringBuilder builder) - { - if (obj is null) - { - builder.Append('-'); - return Result.FromSuccess(); - } - - builder.Append(Convert.ToInt64(obj)); - return Result.FromSuccess(); - } -} \ No newline at end of file diff --git a/Core/NosSmooth.Packets/Converters/Special/ISpecialTypeConverter.cs b/Core/NosSmooth.Packets/Converters/Special/ISpecialTypeConverter.cs deleted file mode 100644 index 6dc4f8a..0000000 --- a/Core/NosSmooth.Packets/Converters/Special/ISpecialTypeConverter.cs +++ /dev/null @@ -1,41 +0,0 @@ -// -// ISpecialTypeConverter.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; -using NosSmooth.Packets.Errors; -using Remora.Results; - -namespace NosSmooth.Packets.Converters.Special; - -/// -/// Converts special types such as enums or lists. -/// -public interface ISpecialTypeConverter -{ - /// - /// Whether this type converter should handle the given type. - /// - /// The type to handle. - /// Whether the type should be handled. - public bool ShouldHandle(Type type); - - /// - /// Deserialize the given string to the object. - /// - /// The type to deserialize. - /// The packets string enumerator. - /// A result that may or may not have succeeded. - public Result Deserialize(Type type, PacketStringEnumerator stringEnumerator); - - /// - /// Deserialize the given object into string. - /// - /// The type to serialize. - /// The object to serialize. - /// The packet string builder. - /// A result that may or may not have succeeded. - public Result Serialize(Type type, object? obj, PacketStringBuilder builder); -} \ No newline at end of file diff --git a/Core/NosSmooth.Packets/Converters/Special/IStringConverterFactory.cs b/Core/NosSmooth.Packets/Converters/Special/IStringConverterFactory.cs new file mode 100644 index 0000000..6b94acd --- /dev/null +++ b/Core/NosSmooth.Packets/Converters/Special/IStringConverterFactory.cs @@ -0,0 +1,38 @@ +// +// IStringConverterFactory.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; +using NosSmooth.Packets.Errors; +using Remora.Results; + +namespace NosSmooth.Packets.Converters.Special; + +/// +/// Converts special types such as enums or lists. +/// +public interface IStringConverterFactory +{ + /// + /// Whether this type converter should handle the given type. + /// + /// The type to handle. + /// Whether the type should be handled. + public bool ShouldHandle(Type type); + + /// + /// Create converter for the given type. + /// + /// The type to create converter for. + /// The type converter or an error. + public Result CreateTypeSerializer(Type type); + + /// + /// Create generic converter for the given type. + /// + /// The type to create converter for. + /// The type converter or an error. + public Result> CreateTypeSerializer(); +} \ No newline at end of file diff --git a/Core/NosSmooth.Packets/Converters/Special/ListStringConverterFactory.cs b/Core/NosSmooth.Packets/Converters/Special/ListStringConverterFactory.cs new file mode 100644 index 0000000..e3b4e2f --- /dev/null +++ b/Core/NosSmooth.Packets/Converters/Special/ListStringConverterFactory.cs @@ -0,0 +1,62 @@ +// +// ListStringConverterFactory.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; +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using System.Text; +using Microsoft.Extensions.DependencyInjection; +using NosSmooth.Packets.Converters.Special.Converters; +using NosSmooth.Packets.Errors; +using NosSmooth.Packets.Extensions; +using Remora.Results; + +namespace NosSmooth.Packets.Converters.Special; + +/// +/// Converts lists. +/// +public class ListStringConverterFactory : IStringConverterFactory +{ + private readonly IServiceProvider _serviceProvider; + + /// + /// Initializes a new instance of the class. + /// + /// The service provider. + public ListStringConverterFactory(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + /// + public bool ShouldHandle(Type type) + => type.IsGenericType && typeof(IEnumerable).IsAssignableFrom(type); + + /// + public Result CreateTypeSerializer(Type type) + { + var elementType = type.GetElementType() ?? type.GetGenericArguments()[0]; + var converterType = typeof(ListStringConverter<>).MakeGenericType(elementType); + try + { + return Result + .FromSuccess((IStringConverter)ActivatorUtilities.CreateInstance(_serviceProvider, converterType)); + } + catch (Exception e) + { + return e; + } + } + + /// + public Result> CreateTypeSerializer() + => CreateTypeSerializer(typeof(T)).Cast, IStringConverter>(); +} \ No newline at end of file diff --git a/Core/NosSmooth.Packets/Converters/Special/ListTypeConverter.cs b/Core/NosSmooth.Packets/Converters/Special/ListTypeConverter.cs deleted file mode 100644 index fb5336c..0000000 --- a/Core/NosSmooth.Packets/Converters/Special/ListTypeConverter.cs +++ /dev/null @@ -1,147 +0,0 @@ -// -// ListTypeConverter.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; -using System.Collections; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Reflection; -using System.Text; -using NosSmooth.Packets.Errors; -using Remora.Results; - -namespace NosSmooth.Packets.Converters.Special; - -/// -/// Converts lists. -/// -public class ListTypeConverter : ISpecialTypeConverter -{ - private readonly ITypeConverterRepository _typeConverterRepository; - private readonly ConcurrentDictionary, object>> _fillFunctions; - - /// - /// Initializes a new instance of the class. - /// - /// The type converter repository. - public ListTypeConverter(ITypeConverterRepository typeConverterRepository) - { - _typeConverterRepository = typeConverterRepository; - _fillFunctions = new ConcurrentDictionary, object>>(); - } - - /// - public bool ShouldHandle(Type type) - => type.IsGenericType && typeof(IEnumerable).IsAssignableFrom(type); - - /// - public Result Deserialize(Type type, PacketStringEnumerator stringEnumerator) - { - var data = new List(); - var genericType = type.GetElementType() ?? type.GetGenericArguments()[0]; - - while (!(stringEnumerator.IsOnLastToken() ?? false)) - { - if (!stringEnumerator.PushPreparedLevel()) - { - return new ArgumentInvalidError(nameof(stringEnumerator), "The string enumerator has to have a prepared level for all lists."); - } - - var result = _typeConverterRepository.Deserialize(genericType, stringEnumerator); - - // 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 - // or the packet has more fields. - while (stringEnumerator.IsOnLastToken() == false) - { - stringEnumerator.GetNextToken(); - } - - stringEnumerator.PopLevel(); - if (!result.IsSuccess) - { - return Result.FromError(new ListSerializerError(result, data.Count), result); - } - - data.Add(result.Entity); - } - - return _fillFunctions.GetOrAdd(genericType, GetAndFillListMethod)(data); - } - - /// - public Result Serialize(Type type, object? obj, PacketStringBuilder builder) - { - if (obj is null) - { - builder.Append('-'); - return Result.FromSuccess(); - } - - var items = (IEnumerable)obj; - var genericType = type.GetElementType() ?? type.GetGenericArguments()[0]; - - foreach (var item in items) - { - if (!builder.PushPreparedLevel()) - { - return new ArgumentInvalidError(nameof(builder), "The string builder has to have a prepared level for all lists."); - } - - var serializeResult = _typeConverterRepository.Serialize(genericType, item, builder); - builder.PopLevel(); - if (!serializeResult.IsSuccess) - { - return serializeResult; - } - } - - return Result.FromSuccess(); - } - - // TODO: cache the functions? - - /// - /// From https://stackoverflow.com/questions/35913495/moving-from-reflection-to-expression-tree. - /// - /// The generic type. - /// The function. - private Func, object> GetAndFillListMethod(Type genericType) - { - var listType = typeof(List<>); - var listGenericType = listType.MakeGenericType(genericType); - - var values = Expression.Parameter(typeof(IEnumerable), "values"); - - var ctor = listGenericType.GetConstructor(BindingFlags.Instance | BindingFlags.Public, null, new Type[0], null); - - // I prefer using Expression.Variable to Expression.Parameter - // for internal variables - var instance = Expression.Variable(listGenericType, "list"); - - var assign = Expression.Assign(instance, Expression.New(ctor!)); - - var addMethod = listGenericType.GetMethod("AddRange", new[] { typeof(IEnumerable<>).MakeGenericType(genericType) }); - - // Enumerable.Cast - var castMethod = typeof(Enumerable).GetMethod("Cast", new[] { typeof(IEnumerable) })!.MakeGenericMethod(genericType); - - // For the parameters there is a params Expression[], so no explicit array necessary - var castCall = Expression.Call(castMethod, values); - var addCall = Expression.Call(instance, addMethod!, castCall); - - var block = Expression.Block( - new[] { instance }, - assign, - addCall, - Expression.Convert(instance, typeof(object)) - ); - - return (Func, object>)Expression.Lambda(block, values).Compile(); - } -} \ No newline at end of file diff --git a/Core/NosSmooth.Packets/Converters/Special/NullableStringConverterFactory.cs b/Core/NosSmooth.Packets/Converters/Special/NullableStringConverterFactory.cs new file mode 100644 index 0000000..0ba9626 --- /dev/null +++ b/Core/NosSmooth.Packets/Converters/Special/NullableStringConverterFactory.cs @@ -0,0 +1,61 @@ +// +// NullableStringConverterFactory.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; +using Microsoft.Extensions.DependencyInjection; +using NosSmooth.Packets.Converters.Special.Converters; +using NosSmooth.Packets.Extensions; +using Remora.Results; + +namespace NosSmooth.Packets.Converters.Special; + +/// +public class NullableStringConverterFactory : IStringConverterFactory +{ + private readonly IServiceProvider _serviceProvider; + + /// + /// Initializes a new instance of the class. + /// + /// The service provider. + public NullableStringConverterFactory(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + /// + public bool ShouldHandle(Type type) + => Nullable.GetUnderlyingType(type) != null; + + /// + public Result CreateTypeSerializer(Type type) + { + var underlyingType = Nullable.GetUnderlyingType(type); + if (underlyingType is null) + { + throw new InvalidOperationException("Accepts only nullable types."); + } + + var nullableConverterType = typeof(NullableStringConverter<>).MakeGenericType(underlyingType); + try + { + return Result + .FromSuccess + ((IStringConverter)ActivatorUtilities.CreateInstance(_serviceProvider, nullableConverterType)); + } + catch (Exception e) + { + return e; + } + } + + /// + public Result> CreateTypeSerializer() + { + return CreateTypeSerializer(typeof(T)) + .Cast, IStringConverter>(); + } +} \ No newline at end of file diff --git a/Core/NosSmooth.Packets/Converters/Special/NullableTypeConverter.cs b/Core/NosSmooth.Packets/Converters/Special/NullableTypeConverter.cs deleted file mode 100644 index 3d60cc7..0000000 --- a/Core/NosSmooth.Packets/Converters/Special/NullableTypeConverter.cs +++ /dev/null @@ -1,37 +0,0 @@ -// -// NullableTypeConverter.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; -using Remora.Results; - -namespace NosSmooth.Packets.Converters.Special; - -/// -public class NullableTypeConverter : ISpecialTypeConverter -{ - private readonly ITypeConverterRepository _typeConverterRepository; - - /// - /// Initializes a new instance of the class. - /// - /// The type converter repository. - public NullableTypeConverter(ITypeConverterRepository typeConverterRepository) - { - _typeConverterRepository = typeConverterRepository; - } - - /// - public bool ShouldHandle(Type type) - => Nullable.GetUnderlyingType(type) != null; - - /// - public Result Deserialize(Type type, PacketStringEnumerator stringEnumerator) - => _typeConverterRepository.Deserialize(Nullable.GetUnderlyingType(type)!, stringEnumerator); - - /// - public Result Serialize(Type type, object? obj, PacketStringBuilder builder) - => _typeConverterRepository.Serialize(Nullable.GetUnderlyingType(type)!, obj, builder); -} \ No newline at end of file diff --git a/Core/NosSmooth.Packets/Converters/Special/StringSerializer.cs b/Core/NosSmooth.Packets/Converters/Special/StringSerializer.cs new file mode 100644 index 0000000..af1dc35 --- /dev/null +++ b/Core/NosSmooth.Packets/Converters/Special/StringSerializer.cs @@ -0,0 +1,80 @@ +// +// StringSerializer.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; +using NosSmooth.Packets.Errors; +using Remora.Results; + +namespace NosSmooth.Packets.Converters.Special; + +/// +public class StringSerializer : IStringSerializer +{ + private readonly IStringConverterRepository _converterRepository; + + /// + /// Initializes a new instance of the class. + /// + /// The repository of string converters. + public StringSerializer(IStringConverterRepository converterRepository) + { + _converterRepository = converterRepository; + } + + /// + public Result Deserialize(Type parseType, PacketStringEnumerator stringEnumerator) + { + var converterResult = _converterRepository.GetTypeConverter(parseType); + if (!converterResult.IsSuccess) + { + return Result.FromError(converterResult); + } + + var deserializedResult = converterResult.Entity.Deserialize(stringEnumerator); + if (!deserializedResult.IsSuccess) + { + return Result.FromError(deserializedResult); + } + + return Result.FromSuccess(deserializedResult.Entity); + } + + /// + public Result Serialize(Type parseType, object? obj, PacketStringBuilder builder) + { + var converterResult = _converterRepository.GetTypeConverter(parseType); + if (!converterResult.IsSuccess) + { + return Result.FromError(converterResult); + } + + return converterResult.Entity.Serialize(obj, builder); + } + + /// + public Result Deserialize(PacketStringEnumerator stringEnumerator) + { + var converterResult = _converterRepository.GetTypeConverter(); + if (!converterResult.IsSuccess) + { + return Result.FromError(converterResult); + } + + return converterResult.Entity.Deserialize(stringEnumerator); + } + + /// + public Result Serialize(TParseType? obj, PacketStringBuilder builder) + { + var converterResult = _converterRepository.GetTypeConverter(); + if (!converterResult.IsSuccess) + { + return Result.FromError(converterResult); + } + + return converterResult.Entity.Serialize(obj, builder); + } +} \ No newline at end of file diff --git a/Core/NosSmooth.Packets/Converters/StringConverterRepository.cs b/Core/NosSmooth.Packets/Converters/StringConverterRepository.cs new file mode 100644 index 0000000..e2a9d29 --- /dev/null +++ b/Core/NosSmooth.Packets/Converters/StringConverterRepository.cs @@ -0,0 +1,106 @@ +// +// StringConverterRepository.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; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using Microsoft.Extensions.DependencyInjection; +using NosSmooth.Packets.Converters.Special; +using NosSmooth.Packets.Errors; +using NosSmooth.Packets.Extensions; +using Remora.Results; + +namespace NosSmooth.Packets.Converters; + +/// +/// Repository for . +/// +public class StringConverterRepository : IStringConverterRepository +{ + private readonly IServiceProvider _serviceProvider; + private readonly ConcurrentDictionary _typeConverters; + private IReadOnlyList? _converterFactories; + + /// + /// Initializes a new instance of the class. + /// + /// The dependency injection service provider. + public StringConverterRepository(IServiceProvider serviceProvider) + { + _typeConverters = new ConcurrentDictionary(); + _converterFactories = null; + _serviceProvider = serviceProvider; + } + + private IReadOnlyList ConverterFactories + { + get + { + if (_converterFactories is null) + { + _converterFactories = _serviceProvider + .GetServices() + .ToArray(); + } + + return _converterFactories; + } + } + + /// + /// Gets the type converter for the given type. + /// + /// The type to find converter for. + /// The type converter or an error. + public Result GetTypeConverter(Type type) + { + var typeConverter = _typeConverters.GetOrAddResult + ( + type, + (getType) => + { + foreach (var converterFactory in ConverterFactories) + { + if (converterFactory.ShouldHandle(getType)) + { + var result = converterFactory.CreateTypeSerializer(getType); + if (!result.IsSuccess) + { + return Result.FromError(result); + } + + return Result.FromSuccess(result.Entity); + } + } + + var converterType = typeof(IStringConverter<>).MakeGenericType(type); + return Result.FromSuccess + ((IStringConverter?)_serviceProvider.GetService(converterType)); + } + ); + + if (!typeConverter.IsSuccess) + { + return Result.FromError(typeConverter); + } + + if (typeConverter.Entity is null) + { + return new TypeConverterNotFoundError(type); + } + + return Result.FromSuccess(typeConverter.Entity); + } + + /// + /// Gets the type converter for the given type. + /// + /// The type to find converter for. + /// The type converter or an error. + public Result> GetTypeConverter() + => GetTypeConverter(typeof(TParseType)).Cast, IStringConverter>(); +} \ No newline at end of file diff --git a/Core/NosSmooth.Packets/Converters/TypeConverterRepository.cs b/Core/NosSmooth.Packets/Converters/TypeConverterRepository.cs deleted file mode 100644 index feb9567..0000000 --- a/Core/NosSmooth.Packets/Converters/TypeConverterRepository.cs +++ /dev/null @@ -1,245 +0,0 @@ -// -// TypeConverterRepository.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; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using Microsoft.Extensions.DependencyInjection; -using NosSmooth.Packets.Converters.Special; -using NosSmooth.Packets.Errors; -using Remora.Results; - -namespace NosSmooth.Packets.Converters; - -/// -/// Repository for . -/// -public class TypeConverterRepository : ITypeConverterRepository -{ - private readonly IServiceProvider _serviceProvider; - private readonly ConcurrentDictionary _typeConverters; - private readonly ConcurrentDictionary _specialConverter; - private IReadOnlyList? _specialTypeConverters; - - /// - /// Initializes a new instance of the class. - /// - /// The dependency injection service provider. - public TypeConverterRepository(IServiceProvider serviceProvider) - { - _typeConverters = new ConcurrentDictionary(); - _specialConverter = new ConcurrentDictionary(); - _specialTypeConverters = null; - _serviceProvider = serviceProvider; - } - - /// - /// Gets the type converter for the given type. - /// - /// The type to find converter for. - /// The type converter or an error. - public Result GetTypeConverter(Type type) - { - var typeConverter = _typeConverters.GetOrAdd - ( - type, - (getType) => - { - var converterType = typeof(ITypeConverter<>).MakeGenericType(type); - return (ITypeConverter?)_serviceProvider.GetService(converterType); - } - ); - - if (typeConverter is null) - { - return new TypeConverterNotFoundError(type); - } - - return Result.FromSuccess(typeConverter); - } - - /// - /// Gets the type converter for the given type. - /// - /// The type to find converter for. - /// The type converter or an error. - public Result> GetTypeConverter() - { - var typeConverter = _typeConverters.GetOrAdd - ( - typeof(TParseType), - _ => _serviceProvider.GetService>() - ); - - if (typeConverter is null) - { - return new TypeConverterNotFoundError(typeof(TParseType)); - } - - return Result>.FromSuccess((ITypeConverter)typeConverter); - } - - /// - /// Convert the data from the enumerator to the given type. - /// - /// The type of the object to serialize. - /// The packet string enumerator with the current position. - /// The parsed object or an error. - public Result Deserialize(Type parseType, PacketStringEnumerator stringEnumerator) - { - var specialConverter = GetSpecialConverter(parseType); - if (specialConverter is not null) - { - var deserializeResult = specialConverter.Deserialize(parseType, stringEnumerator); - if (!deserializeResult.IsSuccess) - { - return Result.FromError(deserializeResult); - } - - if (deserializeResult.Entity is null) - { - if (parseType.DeclaringType == typeof(Nullable<>)) - { - return default; - } - - return Result.FromError(new DeserializedValueNullError(parseType)); - } - - return deserializeResult.Entity; - } - - var converterResult = GetTypeConverter(parseType); - if (!converterResult.IsSuccess) - { - return Result.FromError(converterResult); - } - - var deserializedResult = converterResult.Entity.Deserialize(stringEnumerator); - if (!deserializedResult.IsSuccess) - { - return Result.FromError(deserializedResult); - } - - return Result.FromSuccess(deserializedResult.Entity); - } - - /// - /// Serializes the given object to string by appending to the packet string builder. - /// - /// The type of the object to serialize. - /// The object to serialize. - /// The string builder to append to. - /// A result that may or may not have succeeded. - public Result Serialize(Type parseType, object? obj, PacketStringBuilder builder) - { - var specialConverter = GetSpecialConverter(parseType); - if (specialConverter is not null) - { - return specialConverter.Serialize(parseType, obj, builder); - } - - var converterResult = GetTypeConverter(parseType); - if (!converterResult.IsSuccess) - { - return Result.FromError(converterResult); - } - - return converterResult.Entity.Serialize(obj, builder); - } - - /// - /// Convert the data from the enumerator to the given type. - /// - /// 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) - { - var specialConverter = GetSpecialConverter(typeof(TParseType)); - if (specialConverter is not null) - { - var deserializeResult = specialConverter.Deserialize(typeof(TParseType), stringEnumerator); - if (!deserializeResult.IsSuccess) - { - return Result.FromError(deserializeResult); - } - - if (deserializeResult.Entity is null) - { - if (typeof(TParseType).DeclaringType == typeof(Nullable<>)) - { - return default; - } - - return Result.FromError(new DeserializedValueNullError(typeof(TParseType))); - } - - return (TParseType?)deserializeResult.Entity; - } - - var converterResult = GetTypeConverter(); - if (!converterResult.IsSuccess) - { - return Result.FromError(converterResult); - } - - return converterResult.Entity.Deserialize(stringEnumerator); - } - - /// - /// Serializes the given object to string by appending to the packet string builder. - /// - /// The object to serialize. - /// The string builder to append to. - /// The type of the object to deserialize. - /// A result that may or may not have succeeded. - public Result Serialize(TParseType? obj, PacketStringBuilder builder) - { - if (obj is null) - { - builder.Append("-"); - return Result.FromSuccess(); - } - - var specialConverter = GetSpecialConverter(typeof(TParseType)); - if (specialConverter is not null) - { - return specialConverter.Serialize(typeof(TParseType), obj, builder); - } - - var converterResult = GetTypeConverter(); - if (!converterResult.IsSuccess) - { - return Result.FromError(converterResult); - } - - return converterResult.Entity.Serialize(obj, builder); - } - - private ISpecialTypeConverter? GetSpecialConverter(Type type) - { - return _specialConverter.GetOrAdd - ( - type, - (t) => - { - _specialTypeConverters ??= _serviceProvider.GetServices().ToList(); - - foreach (var specialConverter in _specialTypeConverters) - { - if (specialConverter.ShouldHandle(t)) - { - return specialConverter; - } - } - - return null; - } - ); - } -} \ No newline at end of file diff --git a/Core/NosSmooth.Packets/Errors/CouldNotConvertError.cs b/Core/NosSmooth.Packets/Errors/CouldNotConvertError.cs index 48aee5d..64f23de 100644 --- a/Core/NosSmooth.Packets/Errors/CouldNotConvertError.cs +++ b/Core/NosSmooth.Packets/Errors/CouldNotConvertError.cs @@ -16,5 +16,5 @@ namespace NosSmooth.Packets.Errors; /// The converter that failed the parsing. /// The value that failed to parse. /// The reason for the error. -public record CouldNotConvertError(ITypeConverter Converter, string Value, string Reason) +public record CouldNotConvertError(IStringConverter Converter, string Value, string Reason) : ResultError($"Converter {Converter.GetType().FullName} could not convert value \"{Value}\" due to {Reason}."); \ No newline at end of file diff --git a/Core/NosSmooth.Packets/Errors/PacketEndNotExpectedError.cs b/Core/NosSmooth.Packets/Errors/PacketEndNotExpectedError.cs index 813ab45..ea89263 100644 --- a/Core/NosSmooth.Packets/Errors/PacketEndNotExpectedError.cs +++ b/Core/NosSmooth.Packets/Errors/PacketEndNotExpectedError.cs @@ -15,5 +15,5 @@ namespace NosSmooth.Packets.Errors; /// /// The type converter. /// The property name. -public record PacketEndNotExpectedError(ITypeConverter Converter, string PropertyName) +public record PacketEndNotExpectedError(IStringConverter Converter, string PropertyName) : ResultError($"Unexpected packet end reached in {Converter.GetType()} during deserializing the property {PropertyName}"); \ No newline at end of file diff --git a/Core/NosSmooth.Packets/Errors/PacketParameterSerializerError.cs b/Core/NosSmooth.Packets/Errors/PacketParameterSerializerError.cs index 220ea3c..289612c 100644 --- a/Core/NosSmooth.Packets/Errors/PacketParameterSerializerError.cs +++ b/Core/NosSmooth.Packets/Errors/PacketParameterSerializerError.cs @@ -17,5 +17,5 @@ namespace NosSmooth.Packets.Errors; /// The name of the property. /// The underlying result. /// The reason for the error, if known. -public record PacketParameterSerializerError(ITypeConverter Converter, string PropertyName, IResult Result, string? Reason = null) +public record PacketParameterSerializerError(IStringConverter Converter, string PropertyName, IResult Result, string? Reason = null) : ResultError($"There was an error deserializing property {PropertyName} in converter {Converter.GetType().FullName}{(Reason is not null ? (", reason: " + Reason) : string.Empty)}"); \ No newline at end of file diff --git a/Core/NosSmooth.Packets/Errors/WrongTypeError.cs b/Core/NosSmooth.Packets/Errors/WrongTypeError.cs index 7f28fda..54ccf95 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) +public record WrongTypeError(IStringConverter 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 diff --git a/Core/NosSmooth.Packets/Extensions/ConcurrentDictionaryExtensions.cs b/Core/NosSmooth.Packets/Extensions/ConcurrentDictionaryExtensions.cs new file mode 100644 index 0000000..fdb22d5 --- /dev/null +++ b/Core/NosSmooth.Packets/Extensions/ConcurrentDictionaryExtensions.cs @@ -0,0 +1,52 @@ +// +// ConcurrentDictionaryExtensions.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; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Net.Http; +using Remora.Results; + +namespace NosSmooth.Packets.Extensions; + +/// +/// Extension methods for . +/// +public static class ConcurrentDictionaryExtensions +{ + /// + /// Adds the value from the factory if it doesn't exist already, + /// otherwise returns the existing avlue. + /// + /// The dictionary. + /// The key to add the value at. + /// The factory to obtain the value to add. + /// The type of the key. + /// The type of the value. + /// The added value. + public static Result GetOrAddResult + ( + this ConcurrentDictionary dictionary, + TKey key, + Func> valueFactory + ) + where TKey : notnull + { + if (dictionary.TryGetValue(key, out var val)) + { + return val; + } + + var result = valueFactory(key); + if (!result.IsSuccess) + { + return result; + } + + dictionary.TryAdd(key, result.Entity); + return result; + } +} \ No newline at end of file diff --git a/Core/NosSmooth.Packets/Extensions/ResultExtensions.cs b/Core/NosSmooth.Packets/Extensions/ResultExtensions.cs new file mode 100644 index 0000000..c73c6cc --- /dev/null +++ b/Core/NosSmooth.Packets/Extensions/ResultExtensions.cs @@ -0,0 +1,35 @@ +// +// ResultExtensions.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; +using Remora.Results; + +namespace NosSmooth.Packets.Extensions; + +/// +/// Extensions for class. +/// +public static class ResultExtensions +{ + /// + /// Cast the given non-nullable result type to another type. + /// + /// The result to cast. + /// The type to cast to. + /// The type to cast from. + /// The casted result. + public static Result Cast(this Result result) + where TTo : notnull + where TFrom : notnull + { + if (!result.IsSuccess) + { + return Result.FromError(result); + } + + return Result.FromSuccess((TTo)(object)result.Entity); + } +} \ No newline at end of file diff --git a/Core/NosSmooth.Packets/Extensions/ServiceCollectionExtensions.cs b/Core/NosSmooth.Packets/Extensions/ServiceCollectionExtensions.cs index 5896de7..170cf0d 100644 --- a/Core/NosSmooth.Packets/Extensions/ServiceCollectionExtensions.cs +++ b/Core/NosSmooth.Packets/Extensions/ServiceCollectionExtensions.cs @@ -14,7 +14,6 @@ using NosSmooth.Packets.Converters.Common; using NosSmooth.Packets.Converters.Packets; using NosSmooth.Packets.Converters.Special; using NosSmooth.Packets.Packets; -using NosSmooth.Packets.Packets.Server.Weapons; namespace NosSmooth.Packets.Extensions; @@ -27,7 +26,7 @@ public static class ServiceCollectionExtensions /// Add packet serialization classes. /// /// - /// All generic implementations of ITypeConverter the class + /// All generic implementations of IStringConverter the class /// implements will be registered. /// /// The service collection. @@ -35,11 +34,12 @@ public static class ServiceCollectionExtensions public static IServiceCollection AddPacketSerialization(this IServiceCollection serviceCollection) { return serviceCollection - .AddSingleton() + .AddSingleton() + .AddSingleton() .AddSingleton() .AddSingleton(p => { - var repository = new PacketTypesRepository(p.GetRequiredService()); + var repository = new PacketTypesRepository(p.GetRequiredService()); var packetTypes = typeof(ServiceCollectionExtensions).Assembly .GetExportedTypes() .Where(x => x != typeof(UnresolvedPacket) && !x.IsAbstract && typeof(IPacket).IsAssignableFrom(x)); @@ -70,11 +70,11 @@ public static class ServiceCollectionExtensions var types = assembly.GetExportedTypes() .Where(x => x.Namespace?.Contains("Generated") ?? false) .Where(x => x.GetInterfaces().Any( - i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(ITypeConverter<>) + i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IStringConverter<>) )); foreach (var type in types) { - serviceCollection.AddTypeConverter(type); + serviceCollection.AddStringConverter(type); } return serviceCollection; @@ -89,62 +89,62 @@ public static class ServiceCollectionExtensions public static IServiceCollection AddBasicConverters(this IServiceCollection serviceCollection) { return serviceCollection - .AddSpecialConverter() - .AddSpecialConverter() - .AddSpecialConverter() - .AddTypeConverter() - .AddTypeConverter() - .AddTypeConverter() - .AddTypeConverter() - .AddTypeConverter() - .AddTypeConverter() - .AddTypeConverter() - .AddTypeConverter() - .AddTypeConverter() - .AddTypeConverter() - .AddTypeConverter() - .AddTypeConverter(); + .AddStringConverterFactory() + .AddStringConverterFactory() + .AddStringConverterFactory() + .AddStringConverter() + .AddStringConverter() + .AddStringConverter() + .AddStringConverter() + .AddStringConverter() + .AddStringConverter() + .AddStringConverter() + .AddStringConverter() + .AddStringConverter() + .AddStringConverter() + .AddStringConverter() + .AddStringConverter(); } /// /// Add generic type converter. /// /// - /// All generic implementations of ITypeConverter the class + /// All generic implementations of IStringConverter the class /// implements will be registered. /// /// The service collection. /// The type of the converter. /// The collection. - public static IServiceCollection AddTypeConverter(this IServiceCollection serviceCollection) - where TConverter : ITypeConverter - => serviceCollection.AddTypeConverter(typeof(TConverter)); + public static IServiceCollection AddStringConverter(this IServiceCollection serviceCollection) + where TConverter : IStringConverter + => serviceCollection.AddStringConverter(typeof(TConverter)); /// /// Add generic type converter. /// /// - /// All generic implementations of ITypeConverter the class + /// All generic implementations of IStringConverter the class /// implements will be registered. /// /// The service collection. /// The type of the converter. /// The collection. - public static IServiceCollection AddTypeConverter(this IServiceCollection serviceCollection, Type converterType) + public static IServiceCollection AddStringConverter(this IServiceCollection serviceCollection, Type converterType) { if (!converterType.GetInterfaces().Any( - i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(ITypeConverter<>) + i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IStringConverter<>) )) { throw new ArgumentException( - $"{nameof(converterType)} should implement ITypeConverter.", + $"{nameof(converterType)} should implement IStringConverter.", nameof(converterType)); } var handlerTypeInterfaces = converterType.GetInterfaces(); var handlerInterfaces = handlerTypeInterfaces.Where ( - r => r.IsGenericType && r.GetGenericTypeDefinition() == typeof(ITypeConverter<>) + r => r.IsGenericType && r.GetGenericTypeDefinition() == typeof(IStringConverter<>) ); foreach (var handlerInterface in handlerInterfaces) @@ -159,11 +159,11 @@ public static class ServiceCollectionExtensions /// Add the specified converter as a special converter. /// /// The service collection. - /// The type to add as a special converter. + /// The type to add as a special converter. /// The collection. - public static IServiceCollection AddSpecialConverter(this IServiceCollection serviceCollection) - where TSpecialConverter : class, ISpecialTypeConverter + public static IServiceCollection AddStringConverterFactory(this IServiceCollection serviceCollection) + where TConverterFactory : class, IStringConverterFactory { - return serviceCollection.AddSingleton(); + return serviceCollection.AddSingleton(); } } \ No newline at end of file diff --git a/Core/NosSmooth.Packets/Packets/PacketInfo.cs b/Core/NosSmooth.Packets/Packets/PacketInfo.cs index b250027..28cd768 100644 --- a/Core/NosSmooth.Packets/Packets/PacketInfo.cs +++ b/Core/NosSmooth.Packets/Packets/PacketInfo.cs @@ -15,4 +15,4 @@ namespace NosSmooth.Packets.Packets; /// The packet's header, if any. /// The packet's type. /// The packet's converter. -public record PacketInfo(string? Header, Type PacketType, ITypeConverter PacketConverter); \ No newline at end of file +public record PacketInfo(string? Header, Type PacketType, IStringConverter PacketConverter); \ No newline at end of file diff --git a/Core/NosSmooth.Packets/Packets/PacketTypesRepository.cs b/Core/NosSmooth.Packets/Packets/PacketTypesRepository.cs index 9fadb39..17e097c 100644 --- a/Core/NosSmooth.Packets/Packets/PacketTypesRepository.cs +++ b/Core/NosSmooth.Packets/Packets/PacketTypesRepository.cs @@ -21,17 +21,17 @@ namespace NosSmooth.Packets.Packets; /// public class PacketTypesRepository : IPacketTypesRepository { - private readonly ITypeConverterRepository _typeConverterRepository; + private readonly IStringConverterRepository _stringConverterRepository; private readonly Dictionary> _headerToPacket; private readonly Dictionary _typeToPacket; /// /// Initializes a new instance of the class. /// - /// The type converter repository. - public PacketTypesRepository(ITypeConverterRepository typeConverterRepository) + /// The type converter repository. + public PacketTypesRepository(IStringConverterRepository stringConverterRepository) { - _typeConverterRepository = typeConverterRepository; + _stringConverterRepository = stringConverterRepository; _headerToPacket = new Dictionary>(); _typeToPacket = new Dictionary(); } @@ -54,7 +54,7 @@ public class PacketTypesRepository : IPacketTypesRepository return new ArgumentInvalidError(nameof(type), "Every packet has to specify the header."); } - var converterResult = _typeConverterRepository.GetTypeConverter(type); + var converterResult = _stringConverterRepository.GetTypeConverter(type); if (!converterResult.IsSuccess) { return Result.FromError(converterResult); -- 2.48.1