diff --git a/src/Discord.Net.Commands/CommandService.cs b/src/Discord.Net.Commands/CommandService.cs index 0d27bd178..7dedb4dd7 100644 --- a/src/Discord.Net.Commands/CommandService.cs +++ b/src/Discord.Net.Commands/CommandService.cs @@ -43,8 +43,12 @@ namespace Discord.Commands _typeReaders = new ConcurrentDictionary>(); _defaultTypeReaders = new ConcurrentDictionary(); - foreach (var type in PrimitiveParsers.SupportedTypes) + foreach (Type type in PrimitiveParsers.SupportedTypes) + { _defaultTypeReaders[type] = PrimitiveTypeReader.Create(type); + if (type.GetTypeInfo().IsValueType) + _defaultTypeReaders[typeof(Nullable<>).MakeGenericType(type)] = NullableTypeReader.Create(type); + } var entityTypeReaders = ImmutableList.CreateBuilder>(); entityTypeReaders.Add(new Tuple(typeof(IMessage), typeof(MessageTypeReader<>))); diff --git a/src/Discord.Net.Commands/Readers/NullableTypeReader.cs b/src/Discord.Net.Commands/Readers/NullableTypeReader.cs new file mode 100644 index 000000000..ce5ad611a --- /dev/null +++ b/src/Discord.Net.Commands/Readers/NullableTypeReader.cs @@ -0,0 +1,33 @@ +using System; +using System.Threading.Tasks; + +namespace Discord.Commands +{ + internal static class NullableTypeReader + { + public static TypeReader Create(Type type) + { + type = typeof(NullableTypeReader<>).MakeGenericType(type); + return Activator.CreateInstance(type) as TypeReader; + } + } + + internal class NullableTypeReader : TypeReader + where T : struct + { + private readonly TryParseDelegate _tryParse; + + public NullableTypeReader() + { + _tryParse = PrimitiveParsers.Get(); + } + + public override Task Read(ICommandContext context, string input) + { + T value; + if (_tryParse(input, out value)) + return Task.FromResult(TypeReaderResult.FromSuccess(new Nullable(value))); + return Task.FromResult(TypeReaderResult.FromSuccess(new Nullable())); + } + } +}