//
// NullableWrapperConverterFactory.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.PacketSerializer.Abstractions;
using NosSmooth.PacketSerializer.Converters.Special;
using NosSmooth.PacketSerializer.Converters.Special.Converters;
using NosSmooth.PacketSerializer.Extensions;
using Remora.Results;
namespace NosSmooth.PacketSerializer.Converters.Common;
///
/// Converts .
///
public class NullableWrapperConverterFactory : IStringConverterFactory
{
private readonly IServiceProvider _serviceProvider;
///
/// Initializes a new instance of the class.
///
/// The service provider.
public NullableWrapperConverterFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
///
public bool ShouldHandle(Type type)
=> type.GetGenericTypeDefinition() == typeof(NullableWrapper<>);
///
public Result CreateTypeSerializer(Type type)
{
var underlyingType = type.GetGenericArguments()[0];
var serializerType = typeof(NullableWrapperConverter<>).MakeGenericType(underlyingType);
try
{
return Result.FromSuccess
((IStringConverter)ActivatorUtilities.CreateInstance(_serviceProvider, serializerType));
}
catch (Exception e)
{
return e;
}
}
///
public Result> CreateTypeSerializer()
=> CreateTypeSerializer(typeof(T)).Cast, IStringConverter>();
}