//
// 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);
}
}