// // OptionalWrapperConverter.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.PacketSerializer.Abstractions; using Remora.Results; namespace NosSmooth.PacketSerializer.Converters.Common; /// /// Converter of . /// /// The underlying type. public class OptionalWrapperConverter : BaseStringConverter> { private readonly IStringConverterRepository _converterRepository; /// /// Initializes a new instance of the class. /// /// The converter repository. public OptionalWrapperConverter(IStringConverterRepository converterRepository) { _converterRepository = converterRepository; } /// public override Result Serialize(OptionalWrapper obj, PacketStringBuilder builder) { if (obj.Value is null) { return Result.FromSuccess(); } var converterResult = _converterRepository.GetTypeConverter(); if (!converterResult.IsDefined(out var converter)) { return Result.FromError(converterResult); } return converter.Serialize(obj.Value, builder); } /// public override Result> Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options) { if (stringEnumerator.IsOnLastToken() ?? false) { return Result>.FromSuccess(new OptionalWrapper(false, default)); } var tokenResult = stringEnumerator.GetNextToken(out var token, false); if (!tokenResult.IsSuccess) { return Result>.FromError(tokenResult); } if (token.Token.Length == 0) { stringEnumerator.GetNextToken(out _); // seek return Result>.FromSuccess(new OptionalWrapper(false, default)); } var converterResult = _converterRepository.GetTypeConverter(); if (!converterResult.IsDefined(out var converter)) { return Result>.FromError(converterResult); } var deserializationResult = converter.Deserialize(ref stringEnumerator, new DeserializeOptions(true)); if (!deserializationResult.IsDefined(out var deserialization)) { return Result>.FromError(deserializationResult); } return new OptionalWrapper(true, deserialization); } }