Browse Source

Merge fbe8ccb5da into 32feb0a9cf

pull/484/merge
Paulo GitHub 8 years ago
parent
commit
4e2bedc63d
2 changed files with 39 additions and 0 deletions
  1. +4
    -0
      src/Discord.Net.Commands/CommandService.cs
  2. +35
    -0
      src/Discord.Net.Commands/Readers/NullableTypeReader.cs

+ 4
- 0
src/Discord.Net.Commands/CommandService.cs View File

@@ -57,7 +57,11 @@ namespace Discord.Commands

_defaultTypeReaders = new ConcurrentDictionary<Type, TypeReader>();
foreach (var 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<>)));


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

@@ -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}"));
}
}
}

Loading…
Cancel
Save