diff --git a/src/Discord.Net.Commands/Attributes/UnparsedAttribute.cs b/src/Discord.Net.Commands/Attributes/RemainderAttribute.cs similarity index 69% rename from src/Discord.Net.Commands/Attributes/UnparsedAttribute.cs rename to src/Discord.Net.Commands/Attributes/RemainderAttribute.cs index 9440b78af..4aa16bebb 100644 --- a/src/Discord.Net.Commands/Attributes/UnparsedAttribute.cs +++ b/src/Discord.Net.Commands/Attributes/RemainderAttribute.cs @@ -3,7 +3,7 @@ namespace Discord.Commands { [AttributeUsage(AttributeTargets.Parameter)] - public class UnparsedAttribute : Attribute + public class RemainderAttribute : Attribute { } } diff --git a/src/Discord.Net.Commands/Command.cs b/src/Discord.Net.Commands/Command.cs index 9b8ed98e1..2ada4f736 100644 --- a/src/Discord.Net.Commands/Command.cs +++ b/src/Discord.Net.Commands/Command.cs @@ -87,16 +87,16 @@ namespace Discord.Commands if (reader == null) throw new InvalidOperationException($"{type.FullName} is not supported as a command parameter, are you missing a TypeReader?"); - bool isUnparsed = parameter.GetCustomAttribute() != null; - if (isUnparsed && i != parameters.Length - 1) - throw new InvalidOperationException("Unparsed parameters must be the last parameter in a command."); + bool isRemainder = parameter.GetCustomAttribute() != null; + if (isRemainder && i != parameters.Length - 1) + throw new InvalidOperationException("Remainder parameters must be the last parameter in a command."); string name = parameter.Name; string description = typeInfo.GetCustomAttribute()?.Text; bool isOptional = parameter.IsOptional; object defaultValue = parameter.HasDefaultValue ? parameter.DefaultValue : null; - paramBuilder.Add(new CommandParameter(name, description, reader, isOptional, isUnparsed, defaultValue)); + paramBuilder.Add(new CommandParameter(name, description, reader, isOptional, isRemainder, defaultValue)); } return paramBuilder.ToImmutable(); } diff --git a/src/Discord.Net.Commands/CommandParameter.cs b/src/Discord.Net.Commands/CommandParameter.cs index e5b272ebe..23b76951d 100644 --- a/src/Discord.Net.Commands/CommandParameter.cs +++ b/src/Discord.Net.Commands/CommandParameter.cs @@ -12,15 +12,15 @@ namespace Discord.Commands public string Name { get; } public string Description { get; } public bool IsOptional { get; } - public bool IsUnparsed { get; } + public bool IsRemainder { get; } internal object DefaultValue { get; } - public CommandParameter(string name, string description, TypeReader reader, bool isOptional, bool isUnparsed, object defaultValue) + public CommandParameter(string name, string description, TypeReader reader, bool isOptional, bool isRemainder, object defaultValue) { _reader = reader; Name = name; IsOptional = isOptional; - IsUnparsed = isUnparsed; + IsRemainder = isRemainder; DefaultValue = defaultValue; } @@ -30,6 +30,6 @@ namespace Discord.Commands } public override string ToString() => Name; - private string DebuggerDisplay => $"{Name}{(IsOptional ? " (Optional)" : "")}{(IsUnparsed ? " (Unparsed)" : "")}"; + private string DebuggerDisplay => $"{Name}{(IsOptional ? " (Optional)" : "")}{(IsRemainder ? " (Remainder)" : "")}"; } } diff --git a/src/Discord.Net.Commands/CommandParser.cs b/src/Discord.Net.Commands/CommandParser.cs index 039d7e723..27a5194c5 100644 --- a/src/Discord.Net.Commands/CommandParser.cs +++ b/src/Discord.Net.Commands/CommandParser.cs @@ -42,14 +42,14 @@ namespace Discord.Commands } } //Are we escaping the next character? - if (c == '\\' && (curParam == null || !curParam.IsUnparsed)) + if (c == '\\' && (curParam == null || !curParam.IsRemainder)) { isEscaping = true; continue; } - //If we're processing an unparsed parameter, ignore all other logic - if (curParam != null && curParam.IsUnparsed && curPos != endPos) + //If we're processing an remainder parameter, ignore all other logic + if (curParam != null && curParam.IsRemainder && curPos != endPos) { argBuilder.Append(c); continue; @@ -65,7 +65,7 @@ namespace Discord.Commands else { curParam = command.Parameters.Count > argList.Count ? command.Parameters[argList.Count] : null; - if (curParam != null && curParam.IsUnparsed) + if (curParam != null && curParam.IsRemainder) { argBuilder.Append(c); continue; @@ -118,8 +118,13 @@ namespace Discord.Commands } } - if (curParam != null && curParam.IsUnparsed) - argList.Add(argBuilder.ToString()); + if (curParam != null && curParam.IsRemainder) + { + var typeReaderResult = await curParam.Parse(context, argBuilder.ToString()).ConfigureAwait(false); + if (!typeReaderResult.IsSuccess) + return ParseResult.FromError(typeReaderResult); + argList.Add(typeReaderResult.Value); + } if (isEscaping) return ParseResult.FromError(CommandError.ParseFailed, "Input text may not end on an incomplete escape.");