| @@ -57,7 +57,11 @@ namespace Discord.Commands | |||||
| _defaultTypeReaders = new ConcurrentDictionary<Type, TypeReader>(); | _defaultTypeReaders = new ConcurrentDictionary<Type, TypeReader>(); | ||||
| foreach (var type in PrimitiveParsers.SupportedTypes) | foreach (var type in PrimitiveParsers.SupportedTypes) | ||||
| { | |||||
| _defaultTypeReaders[type] = PrimitiveTypeReader.Create(type); | _defaultTypeReaders[type] = PrimitiveTypeReader.Create(type); | ||||
| if (type.GetTypeInfo().IsValueType) | |||||
| _defaultTypeReaders[typeof(Nullable<>).MakeGenericType(type)] = NullableTypeReader.Create(type); | |||||
| } | |||||
| var entityTypeReaders = ImmutableList.CreateBuilder<Tuple<Type, Type>>(); | var entityTypeReaders = ImmutableList.CreateBuilder<Tuple<Type, Type>>(); | ||||
| entityTypeReaders.Add(new Tuple<Type, Type>(typeof(IMessage), typeof(MessageTypeReader<>))); | entityTypeReaders.Add(new Tuple<Type, Type>(typeof(IMessage), typeof(MessageTypeReader<>))); | ||||
| @@ -0,0 +1,35 @@ | |||||
| 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<T> : TypeReader | |||||
| where T : struct | |||||
| { | |||||
| private readonly TryParseDelegate<T> _tryParse; | |||||
| public NullableTypeReader() | |||||
| { | |||||
| _tryParse = PrimitiveParsers.Get<T>(); | |||||
| } | |||||
| public override Task<TypeReaderResult> Read(ICommandContext context, string input) | |||||
| { | |||||
| if(input == null) | |||||
| return Task.FromResult(TypeReaderResult.FromSuccess(new Nullable<T>())); | |||||
| T value; | |||||
| if (_tryParse(input, out value)) | |||||
| return Task.FromResult(TypeReaderResult.FromSuccess(new Nullable<T>(value))); | |||||
| return Task.FromResult(TypeReaderResult.FromError(CommandError.ParseFailed, $"Failed to parse {typeof(T).Name}")); | |||||
| } | |||||
| } | |||||
| } | |||||