Browse Source

Added Dynamic Enum TypeParsing, to support all enums

pull/140/head
Khionu Terabite 9 years ago
parent
commit
523b862525
2 changed files with 64 additions and 5 deletions
  1. +10
    -5
      src/Discord.Net.Commands/Command.cs
  2. +54
    -0
      src/Discord.Net.Commands/Readers/EnumTypeReader.cs

+ 10
- 5
src/Discord.Net.Commands/Command.cs View File

@@ -75,19 +75,24 @@ namespace Discord.Commands
continue;
}

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

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

if (reader == null)
{
var typeInfo = type.GetTypeInfo();
if (typeInfo.IsEnum)
{
type = Enum.GetUnderlyingType(type);

reader = Module.Service.GetTypeReader(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?");
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