Browse Source

Merge pull request #140 from RogueException/khio-enumpatch

Enum TypeReader
pull/141/head
RogueException GitHub 9 years ago
parent
commit
c101c44c04
2 changed files with 67 additions and 2 deletions
  1. +13
    -2
      src/Discord.Net.Commands/Command.cs
  2. +54
    -0
      src/Discord.Net.Commands/Readers/EnumTypeReader.cs

+ 13
- 2
src/Discord.Net.Commands/Command.cs View File

@@ -77,11 +77,22 @@ namespace Discord.Commands

var typeInfo = type.GetTypeInfo();
if (typeInfo.IsEnum)
type = Enum.GetUnderlyingType(type);
Module.Service.AddTypeReader(type, new EnumTypeReader(type));

var reader = Module.Service.GetTypeReader(type);

if (reader == null)
throw new InvalidOperationException($"{type.FullName} is not supported as a command parameter, are you missing a TypeReader?");
{
if (typeInfo.IsEnum)
{
type = Enum.GetUnderlyingType(type);

reader = Module.Service.GetTypeReader(type);
}

if (reader == null)
throw new InvalidOperationException($"{type.FullName} is not supported as a command parameter, are you missing a TypeReader?");
}

bool isUnparsed = parameter.GetCustomAttribute<UnparsedAttribute>() != null;
if (isUnparsed)


+ 54
- 0
src/Discord.Net.Commands/Readers/EnumTypeReader.cs View File

@@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Discord.Commands
{
internal class EnumTypeReader : TypeReader
{
private readonly Dictionary<string, object> stringValues;
private readonly Dictionary<int, object> intValues;
private readonly Type enumType;

public override Task<TypeReaderResult> Read(IMessage context, string input)
{
int inputAsInt;
object enumValue;

if (int.TryParse(input, out inputAsInt))
{
if (intValues.TryGetValue(inputAsInt, out enumValue))
return Task.FromResult(TypeReaderResult.FromSuccess(enumValue));
else
return Task.FromResult(TypeReaderResult.FromError(CommandError.CastFailed, $"Value is not a {enumType.Name}"));
}
else
{
if (stringValues.TryGetValue(input.ToLower(), out enumValue))
return Task.FromResult(TypeReaderResult.FromSuccess(enumValue));
else
return Task.FromResult(TypeReaderResult.FromError(CommandError.CastFailed, $"Value is not a {enumType.Name}"));
}
}

public EnumTypeReader(Type type)
{
enumType = type;

var stringValuesBuilder = new Dictionary<string, object>();
var intValuesBuilder = new Dictionary<int, object>();

var values = Enum.GetValues(enumType);

foreach (var v in values)
{
stringValuesBuilder.Add(v.ToString().ToLower(), v);
intValuesBuilder.Add((int)v, v);
}

stringValues = stringValuesBuilder;
intValues = intValuesBuilder;
}
}
}

Loading…
Cancel
Save