Browse Source

Renamed Unparsed -> Remainder. Fixed non-string remainder parameters.

tags/1.0-rc
RogueException 8 years ago
parent
commit
c5569a44ea
4 changed files with 20 additions and 15 deletions
  1. +1
    -1
      src/Discord.Net.Commands/Attributes/RemainderAttribute.cs
  2. +4
    -4
      src/Discord.Net.Commands/Command.cs
  3. +4
    -4
      src/Discord.Net.Commands/CommandParameter.cs
  4. +11
    -6
      src/Discord.Net.Commands/CommandParser.cs

src/Discord.Net.Commands/Attributes/UnparsedAttribute.cs → src/Discord.Net.Commands/Attributes/RemainderAttribute.cs View File

@@ -3,7 +3,7 @@
namespace Discord.Commands
{
[AttributeUsage(AttributeTargets.Parameter)]
public class UnparsedAttribute : Attribute
public class RemainderAttribute : Attribute
{
}
}

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

@@ -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<UnparsedAttribute>() != null;
if (isUnparsed && i != parameters.Length - 1)
throw new InvalidOperationException("Unparsed parameters must be the last parameter in a command.");
bool isRemainder = parameter.GetCustomAttribute<RemainderAttribute>() != 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<DescriptionAttribute>()?.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();
}


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

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

+ 11
- 6
src/Discord.Net.Commands/CommandParser.cs View File

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


Loading…
Cancel
Save