Added new parameter scoring, support multiple matches
This commit is contained in:
@@ -6,28 +6,53 @@ namespace Discord.Commands
|
||||
[DebuggerDisplay(@"{DebuggerDisplay,nq}")]
|
||||
public struct ParseResult : IResult
|
||||
{
|
||||
public IReadOnlyList<object> Values { get; }
|
||||
public IReadOnlyList<TypeReaderResult> ArgValues { get; }
|
||||
public IReadOnlyList<TypeReaderResult> ParamValues { get; }
|
||||
|
||||
public CommandError? Error { get; }
|
||||
public string ErrorReason { get; }
|
||||
|
||||
public bool IsSuccess => !Error.HasValue;
|
||||
|
||||
private ParseResult(IReadOnlyList<object> values, CommandError? error, string errorReason)
|
||||
private ParseResult(IReadOnlyList<TypeReaderResult> argValues, IReadOnlyList<TypeReaderResult> paramValue, CommandError? error, string errorReason)
|
||||
{
|
||||
Values = values;
|
||||
ArgValues = argValues;
|
||||
ParamValues = paramValue;
|
||||
Error = error;
|
||||
ErrorReason = errorReason;
|
||||
}
|
||||
|
||||
public static ParseResult FromSuccess(IReadOnlyList<object> values)
|
||||
=> new ParseResult(values, null, null);
|
||||
public static ParseResult FromSuccess(IReadOnlyList<TypeReaderResult> argValues, IReadOnlyList<TypeReaderResult> paramValues)
|
||||
{
|
||||
for (int i = 0; i < argValues.Count; i++)
|
||||
{
|
||||
if (argValues[i].Values.Count > 1)
|
||||
return new ParseResult(argValues, paramValues, CommandError.MultipleMatches, "Multiple matches found.");
|
||||
}
|
||||
for (int i = 0; i < paramValues.Count; i++)
|
||||
{
|
||||
if (paramValues[i].Values.Count > 1)
|
||||
return new ParseResult(argValues, paramValues, CommandError.MultipleMatches, "Multiple matches found.");
|
||||
}
|
||||
return new ParseResult(argValues, paramValues, null, null);
|
||||
}
|
||||
public static ParseResult FromSuccess(IReadOnlyList<TypeReaderValue> argValues, IReadOnlyList<TypeReaderValue> paramValues)
|
||||
{
|
||||
var argList = new TypeReaderResult[argValues.Count];
|
||||
for (int i = 0; i < argValues.Count; i++)
|
||||
argList[i] = TypeReaderResult.FromSuccess(argValues[i]);
|
||||
var paramList = new TypeReaderResult[paramValues.Count];
|
||||
for (int i = 0; i < paramValues.Count; i++)
|
||||
paramList[i] = TypeReaderResult.FromSuccess(paramValues[i]);
|
||||
return new ParseResult(argList, paramList, null, null);
|
||||
}
|
||||
|
||||
public static ParseResult FromError(CommandError error, string reason)
|
||||
=> new ParseResult(null, error, reason);
|
||||
=> new ParseResult(null, null, error, reason);
|
||||
public static ParseResult FromError(IResult result)
|
||||
=> new ParseResult(null, result.Error, result.ErrorReason);
|
||||
=> new ParseResult(null, null, result.Error, result.ErrorReason);
|
||||
|
||||
public override string ToString() => IsSuccess ? "Success" : $"{Error}: {ErrorReason}";
|
||||
private string DebuggerDisplay => IsSuccess ? $"Success ({Values.Count} Values)" : $"{Error}: {ErrorReason}";
|
||||
private string DebuggerDisplay => IsSuccess ? $"Success ({ArgValues.Count}{(ParamValues != null ? $" +{ParamValues.Count} Values" : "")})" : $"{Error}: {ErrorReason}";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,32 +1,56 @@
|
||||
using System.Diagnostics;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Immutable;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
|
||||
namespace Discord.Commands
|
||||
{
|
||||
[DebuggerDisplay(@"{DebuggerDisplay,nq}")]
|
||||
public struct TypeReaderResult : IResult
|
||||
public struct TypeReaderValue
|
||||
{
|
||||
public object Value { get; }
|
||||
public float Score { get; }
|
||||
|
||||
public TypeReaderValue(object value, float score)
|
||||
{
|
||||
Value = value;
|
||||
Score = score;
|
||||
}
|
||||
|
||||
public override string ToString() => Value?.ToString();
|
||||
private string DebuggerDisplay => $"[{Value}, {Math.Round(Score, 2)}]";
|
||||
}
|
||||
|
||||
[DebuggerDisplay(@"{DebuggerDisplay,nq}")]
|
||||
public struct TypeReaderResult : IResult
|
||||
{
|
||||
public IReadOnlyCollection<TypeReaderValue> Values { get; }
|
||||
|
||||
public CommandError? Error { get; }
|
||||
public string ErrorReason { get; }
|
||||
|
||||
public bool IsSuccess => !Error.HasValue;
|
||||
|
||||
private TypeReaderResult(object value, CommandError? error, string errorReason)
|
||||
private TypeReaderResult(IReadOnlyCollection<TypeReaderValue> values, CommandError? error, string errorReason)
|
||||
{
|
||||
Value = value;
|
||||
Values = values;
|
||||
Error = error;
|
||||
ErrorReason = errorReason;
|
||||
}
|
||||
|
||||
public static TypeReaderResult FromSuccess(object value)
|
||||
=> new TypeReaderResult(value, null, null);
|
||||
=> new TypeReaderResult(ImmutableArray.Create(new TypeReaderValue(value, 1.0f)), null, null);
|
||||
public static TypeReaderResult FromSuccess(TypeReaderValue value)
|
||||
=> new TypeReaderResult(ImmutableArray.Create(value), null, null);
|
||||
public static TypeReaderResult FromSuccess(IReadOnlyCollection<TypeReaderValue> values)
|
||||
=> new TypeReaderResult(values, null, null);
|
||||
public static TypeReaderResult FromError(CommandError error, string reason)
|
||||
=> new TypeReaderResult(null, error, reason);
|
||||
public static TypeReaderResult FromError(IResult result)
|
||||
=> new TypeReaderResult(null, result.Error, result.ErrorReason);
|
||||
|
||||
public override string ToString() => IsSuccess ? "Success" : $"{Error}: {ErrorReason}";
|
||||
private string DebuggerDisplay => IsSuccess ? $"Success ({Value})" : $"{Error}: {ErrorReason}";
|
||||
private string DebuggerDisplay => IsSuccess ? $"Success ({string.Join(", ", Values)})" : $"{Error}: {ErrorReason}";
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user