diff --git a/src/Discord.Net.Commands/Info/CommandInfo.cs b/src/Discord.Net.Commands/Info/CommandInfo.cs index 15d63d25a..8d43ec204 100644 --- a/src/Discord.Net.Commands/Info/CommandInfo.cs +++ b/src/Discord.Net.Commands/Info/CommandInfo.cs @@ -64,11 +64,11 @@ namespace Discord.Commands _action = builder.Callback; } - public async Task CheckPreconditionsAsync(ICommandContext context, IServiceProvider services = null) + public async Task CheckPreconditionsAsync(ICommandContext context, IServiceProvider services = null) { services = services ?? EmptyServiceProvider.Instance; - async Task CheckGroups(IEnumerable preconditions, string type) + async Task CheckGroups(IEnumerable preconditions, string type) { foreach (IGrouping preconditionGroup in preconditions.GroupBy(p => p.Group)) { @@ -78,7 +78,7 @@ namespace Discord.Commands { var result = await precondition.CheckPermissions(context, this, services).ConfigureAwait(false); if (!result.IsSuccess) - return result; + return PreconditionGroupResult.FromError($"{type} default precondition group failed", new[] { result }); } } else @@ -88,10 +88,10 @@ namespace Discord.Commands results.Add(await precondition.CheckPermissions(context, this, services).ConfigureAwait(false)); if (!results.Any(p => p.IsSuccess)) - return PreconditionResult.FromError($"{type} precondition group {preconditionGroup.Key} failed: {String.Join("\n", results.Select(r => r.ErrorReason))}."); + return PreconditionGroupResult.FromError($"{type} precondition group {preconditionGroup.Key} failed", results); } } - return PreconditionResult.FromSuccess(); + return PreconditionGroupResult.FromSuccess(); } var moduleResult = await CheckGroups(Module.Preconditions, "Module"); diff --git a/src/Discord.Net.Commands/Results/PreconditionGroupResult.cs b/src/Discord.Net.Commands/Results/PreconditionGroupResult.cs new file mode 100644 index 000000000..44f722f52 --- /dev/null +++ b/src/Discord.Net.Commands/Results/PreconditionGroupResult.cs @@ -0,0 +1,35 @@ +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; + +namespace Discord.Commands +{ + [DebuggerDisplay(@"{DebuggerDisplay,nq}")] + public struct PreconditionGroupResult : IResult + { + public CommandError? Error { get; } + + public string ErrorReason { get; } + + public bool IsSuccess => !Error.HasValue; + + public IEnumerable Preconditions { get; } + + private PreconditionGroupResult(CommandError? error, string errorReason, IEnumerable preconditions) + { + Error = error; + ErrorReason = errorReason; + Preconditions = preconditions ?? Enumerable.Empty(); + } + + public static PreconditionGroupResult FromSuccess() + => new PreconditionGroupResult(null, null, null); + public static PreconditionGroupResult FromError(string reason, IEnumerable preconditions) + => new PreconditionGroupResult(CommandError.UnmetPrecondition, reason, preconditions); + public static PreconditionGroupResult FromError(IResult result) //needed? + => new PreconditionGroupResult(result.Error, result.ErrorReason, null); + + public override string ToString() => IsSuccess ? "Success" : $"{Error}: {ErrorReason}"; + private string DebuggerDisplay => IsSuccess ? "Success" : $"{Error}: {ErrorReason}"; + } +}