* add nullable ComponentTypeConverter and TypeReader * add converter and reader to interactionservicetags/3.7.0
@@ -223,7 +223,8 @@ namespace Discord.Interactions | |||||
new ConcurrentDictionary<Type, Type> | new ConcurrentDictionary<Type, Type> | ||||
{ | { | ||||
[typeof(Array)] = typeof(DefaultArrayComponentConverter<>), | [typeof(Array)] = typeof(DefaultArrayComponentConverter<>), | ||||
[typeof(IConvertible)] = typeof(DefaultValueComponentConverter<>) | |||||
[typeof(IConvertible)] = typeof(DefaultValueComponentConverter<>), | |||||
[typeof(Nullable<>)] = typeof(NullableComponentConverter<>) | |||||
}); | }); | ||||
_typeReaderMap = new TypeMap<TypeReader, string>(this, new ConcurrentDictionary<Type, TypeReader>(), | _typeReaderMap = new TypeMap<TypeReader, string>(this, new ConcurrentDictionary<Type, TypeReader>(), | ||||
@@ -234,7 +235,8 @@ namespace Discord.Interactions | |||||
[typeof(IUser)] = typeof(DefaultUserReader<>), | [typeof(IUser)] = typeof(DefaultUserReader<>), | ||||
[typeof(IMessage)] = typeof(DefaultMessageReader<>), | [typeof(IMessage)] = typeof(DefaultMessageReader<>), | ||||
[typeof(IConvertible)] = typeof(DefaultValueReader<>), | [typeof(IConvertible)] = typeof(DefaultValueReader<>), | ||||
[typeof(Enum)] = typeof(EnumReader<>) | |||||
[typeof(Enum)] = typeof(EnumReader<>), | |||||
[typeof(Nullable<>)] = typeof(NullableReader<>) | |||||
}); | }); | ||||
} | } | ||||
@@ -0,0 +1,23 @@ | |||||
using System; | |||||
using System.Threading.Tasks; | |||||
namespace Discord.Interactions | |||||
{ | |||||
internal class NullableComponentConverter<T> : ComponentTypeConverter<T> | |||||
{ | |||||
private readonly ComponentTypeConverter _typeConverter; | |||||
public NullableComponentConverter(InteractionService interactionService, IServiceProvider services) | |||||
{ | |||||
var type = Nullable.GetUnderlyingType(typeof(T)); | |||||
if (type is null) | |||||
throw new ArgumentException($"No type {nameof(TypeConverter)} is defined for this {type.FullName}", "type"); | |||||
_typeConverter = interactionService.GetComponentTypeConverter(type, services); | |||||
} | |||||
public override Task<TypeConverterResult> ReadAsync(IInteractionContext context, IComponentInteractionData option, IServiceProvider services) | |||||
=> string.IsNullOrEmpty(option.Value) ? Task.FromResult(TypeConverterResult.FromSuccess(null)) : _typeConverter.ReadAsync(context, option, services); | |||||
} | |||||
} |
@@ -0,0 +1,23 @@ | |||||
using System; | |||||
using System.Threading.Tasks; | |||||
namespace Discord.Interactions | |||||
{ | |||||
internal class NullableReader<T> : TypeReader<T> | |||||
{ | |||||
private readonly TypeReader _typeReader; | |||||
public NullableReader(InteractionService interactionService, IServiceProvider services) | |||||
{ | |||||
var type = Nullable.GetUnderlyingType(typeof(T)); | |||||
if (type is null) | |||||
throw new ArgumentException($"No type {nameof(TypeConverter)} is defined for this {type.FullName}", "type"); | |||||
_typeReader = interactionService.GetTypeReader(type, services); | |||||
} | |||||
public override Task<TypeConverterResult> ReadAsync(IInteractionContext context, string option, IServiceProvider services) | |||||
=> string.IsNullOrEmpty(option) ? Task.FromResult(TypeConverterResult.FromSuccess(null)) : _typeReader.ReadAsync(context, option, services); | |||||
} | |||||
} |