| @@ -61,10 +61,12 @@ namespace Discord.Commands | |||||
| return PreconditionResult.FromSuccess(); | return PreconditionResult.FromSuccess(); | ||||
| } | } | ||||
| public async Task<ParseResult> Parse(IMessage msg, SearchResult searchResult) | |||||
| public async Task<ParseResult> Parse(IMessage msg, SearchResult searchResult, PreconditionResult? preconditionResult = null) | |||||
| { | { | ||||
| if (!searchResult.IsSuccess) | if (!searchResult.IsSuccess) | ||||
| return ParseResult.FromError(searchResult); | return ParseResult.FromError(searchResult); | ||||
| if (preconditionResult != null && !preconditionResult.Value.IsSuccess) | |||||
| return ParseResult.FromError(preconditionResult.Value); | |||||
| return await CommandParser.ParseArgs(this, msg, searchResult.Text.Substring(Text.Length), 0).ConfigureAwait(false); | return await CommandParser.ParseArgs(this, msg, searchResult.Text.Substring(Text.Length), 0).ConfigureAwait(false); | ||||
| } | } | ||||
| @@ -209,7 +209,6 @@ namespace Discord.Commands | |||||
| return searchResult; | return searchResult; | ||||
| var commands = searchResult.Commands; | var commands = searchResult.Commands; | ||||
| for (int i = commands.Count - 1; i >= 0; i--) | for (int i = commands.Count - 1; i >= 0; i--) | ||||
| { | { | ||||
| var preconditionResult = await commands[i].CheckPreconditions(message); | var preconditionResult = await commands[i].CheckPreconditions(message); | ||||
| @@ -221,7 +220,7 @@ namespace Discord.Commands | |||||
| continue; | continue; | ||||
| } | } | ||||
| var parseResult = await commands[i].Parse(message, searchResult); | |||||
| var parseResult = await commands[i].Parse(message, searchResult, preconditionResult); | |||||
| if (!parseResult.IsSuccess) | if (!parseResult.IsSuccess) | ||||
| { | { | ||||
| if (commands.Count == 1) | if (commands.Count == 1) | ||||
| @@ -229,6 +228,7 @@ namespace Discord.Commands | |||||
| else | else | ||||
| continue; | continue; | ||||
| } | } | ||||
| var executeResult = await commands[i].Execute(message, parseResult); | var executeResult = await commands[i].Execute(message, parseResult); | ||||
| return executeResult; | return executeResult; | ||||
| } | } | ||||
| @@ -20,15 +20,13 @@ namespace Discord.Commands | |||||
| ErrorReason = errorReason; | ErrorReason = errorReason; | ||||
| } | } | ||||
| internal static ExecuteResult FromSuccess() | |||||
| public static ExecuteResult FromSuccess() | |||||
| => new ExecuteResult(null, null, null); | => new ExecuteResult(null, null, null); | ||||
| internal static ExecuteResult FromError(CommandError error, string reason) | |||||
| public static ExecuteResult FromError(CommandError error, string reason) | |||||
| => new ExecuteResult(null, error, reason); | => new ExecuteResult(null, error, reason); | ||||
| internal static ExecuteResult FromError(Exception ex) | |||||
| public static ExecuteResult FromError(Exception ex) | |||||
| => new ExecuteResult(ex, CommandError.Exception, ex.Message); | => new ExecuteResult(ex, CommandError.Exception, ex.Message); | ||||
| internal static ExecuteResult FromError(ParseResult result) | |||||
| => new ExecuteResult(null, result.Error, result.ErrorReason); | |||||
| internal static ExecuteResult FromError(PreconditionResult result) | |||||
| public static ExecuteResult FromError(IResult result) | |||||
| => new ExecuteResult(null, result.Error, result.ErrorReason); | => new ExecuteResult(null, result.Error, result.ErrorReason); | ||||
| public override string ToString() => IsSuccess ? "Success" : $"{Error}: {ErrorReason}"; | public override string ToString() => IsSuccess ? "Success" : $"{Error}: {ErrorReason}"; | ||||
| @@ -20,13 +20,11 @@ namespace Discord.Commands | |||||
| ErrorReason = errorReason; | ErrorReason = errorReason; | ||||
| } | } | ||||
| internal static ParseResult FromSuccess(IReadOnlyList<object> values) | |||||
| public static ParseResult FromSuccess(IReadOnlyList<object> values) | |||||
| => new ParseResult(values, null, null); | => new ParseResult(values, null, null); | ||||
| internal static ParseResult FromError(CommandError error, string reason) | |||||
| public static ParseResult FromError(CommandError error, string reason) | |||||
| => new ParseResult(null, error, reason); | => new ParseResult(null, error, reason); | ||||
| internal static ParseResult FromError(SearchResult result) | |||||
| => new ParseResult(null, result.Error, result.ErrorReason); | |||||
| internal static ParseResult FromError(TypeReaderResult result) | |||||
| public static ParseResult FromError(IResult result) | |||||
| => new ParseResult(null, result.Error, result.ErrorReason); | => new ParseResult(null, result.Error, result.ErrorReason); | ||||
| public override string ToString() => IsSuccess ? "Success" : $"{Error}: {ErrorReason}"; | public override string ToString() => IsSuccess ? "Success" : $"{Error}: {ErrorReason}"; | ||||
| @@ -16,10 +16,12 @@ namespace Discord.Commands | |||||
| ErrorReason = errorReason; | ErrorReason = errorReason; | ||||
| } | } | ||||
| internal static PreconditionResult FromSuccess() | |||||
| public static PreconditionResult FromSuccess() | |||||
| => new PreconditionResult(null, null); | => new PreconditionResult(null, null); | ||||
| internal static PreconditionResult FromError(string reason) | |||||
| public static PreconditionResult FromError(string reason) | |||||
| => new PreconditionResult(CommandError.UnmetPrecondition, reason); | => new PreconditionResult(CommandError.UnmetPrecondition, reason); | ||||
| public static PreconditionResult FromError(IResult result) | |||||
| => new PreconditionResult(result.Error, result.ErrorReason); | |||||
| public override string ToString() => IsSuccess ? "Success" : $"{Error}: {ErrorReason}"; | public override string ToString() => IsSuccess ? "Success" : $"{Error}: {ErrorReason}"; | ||||
| private string DebuggerDisplay => IsSuccess ? "Success" : $"{Error}: {ErrorReason}"; | private string DebuggerDisplay => IsSuccess ? "Success" : $"{Error}: {ErrorReason}"; | ||||
| @@ -22,10 +22,12 @@ namespace Discord.Commands | |||||
| ErrorReason = errorReason; | ErrorReason = errorReason; | ||||
| } | } | ||||
| internal static SearchResult FromSuccess(string text, IReadOnlyList<Command> commands) | |||||
| public static SearchResult FromSuccess(string text, IReadOnlyList<Command> commands) | |||||
| => new SearchResult(text, commands, null, null); | => new SearchResult(text, commands, null, null); | ||||
| internal static SearchResult FromError(CommandError error, string reason) | |||||
| public static SearchResult FromError(CommandError error, string reason) | |||||
| => new SearchResult(null, null, error, reason); | => new SearchResult(null, null, error, reason); | ||||
| public static SearchResult FromError(IResult result) | |||||
| => new SearchResult(null, null, result.Error, result.ErrorReason); | |||||
| public override string ToString() => IsSuccess ? "Success" : $"{Error}: {ErrorReason}"; | public override string ToString() => IsSuccess ? "Success" : $"{Error}: {ErrorReason}"; | ||||
| private string DebuggerDisplay => IsSuccess ? $"Success ({Commands.Count} Results)" : $"{Error}: {ErrorReason}"; | private string DebuggerDisplay => IsSuccess ? $"Success ({Commands.Count} Results)" : $"{Error}: {ErrorReason}"; | ||||
| @@ -1,5 +1,4 @@ | |||||
| using System.Diagnostics; | using System.Diagnostics; | ||||
| using System.Runtime.InteropServices; | |||||
| namespace Discord.Commands | namespace Discord.Commands | ||||
| { | { | ||||
| @@ -24,6 +23,8 @@ namespace Discord.Commands | |||||
| => new TypeReaderResult(value, null, null); | => new TypeReaderResult(value, null, null); | ||||
| public static TypeReaderResult FromError(CommandError error, string reason) | public static TypeReaderResult FromError(CommandError error, string reason) | ||||
| => new TypeReaderResult(null, error, 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}"; | public override string ToString() => IsSuccess ? "Success" : $"{Error}: {ErrorReason}"; | ||||
| private string DebuggerDisplay => IsSuccess ? $"Success ({Value})" : $"{Error}: {ErrorReason}"; | private string DebuggerDisplay => IsSuccess ? $"Success ({Value})" : $"{Error}: {ErrorReason}"; | ||||