Browse Source

Add Nullable (to Value Types) at TypeReaders

pull/484/head
Paulo Anjos 8 years ago
parent
commit
c6e6539e9d
2 changed files with 38 additions and 1 deletions
  1. +5
    -1
      src/Discord.Net.Commands/CommandService.cs
  2. +33
    -0
      src/Discord.Net.Commands/Readers/NullableTypeReader.cs

+ 5
- 1
src/Discord.Net.Commands/CommandService.cs View File

@@ -43,8 +43,12 @@ namespace Discord.Commands
_typeReaders = new ConcurrentDictionary<Type, ConcurrentDictionary<Type, TypeReader>>();

_defaultTypeReaders = new ConcurrentDictionary<Type, TypeReader>();
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<Tuple<Type, Type>>();
entityTypeReaders.Add(new Tuple<Type, Type>(typeof(IMessage), typeof(MessageTypeReader<>)));


+ 33
- 0
src/Discord.Net.Commands/Readers/NullableTypeReader.cs View File

@@ -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<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)
{
T value;
if (_tryParse(input, out value))
return Task.FromResult(TypeReaderResult.FromSuccess(new Nullable<T>(value)));
return Task.FromResult(TypeReaderResult.FromSuccess(new Nullable<T>()));
}
}
}

Loading…
Cancel
Save