//
// NullableWrapperConverter.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 NullableWrapperConverter : BaseStringConverter>
{
private readonly IStringConverterRepository _converterRepository;
///
/// Initializes a new instance of the class.
///
/// The converter repository.
public NullableWrapperConverter(IStringConverterRepository converterRepository)
{
_converterRepository = converterRepository;
}
///
public override Result Serialize(NullableWrapper obj, PacketStringBuilder builder)
{
if (obj.Value is null)
{
builder.Append("-1");
}
else
{
var converterResult = _converterRepository.GetTypeConverter();
if (!converterResult.IsDefined(out var converter))
{
return Result.FromError(converterResult);
}
return converter.Serialize(obj.Value, builder);
}
return Result.FromSuccess();
}
///
public override Result> Deserialize(ref PacketStringEnumerator stringEnumerator, DeserializeOptions options)
{
var tokenResult = stringEnumerator.GetNextToken(out var packetToken, false);
if (!tokenResult.IsSuccess)
{
return Result>.FromError(tokenResult);
}
if (packetToken.Token.Length == 2 && packetToken.Token.StartsWith("-1"))
{
return Result>.FromSuccess(new NullableWrapper(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 NullableWrapper(deserialization);
}
}