Browse Source

Considering a new result type

pull/672/head
Joe4evr 8 years ago
parent
commit
07079f57e9
2 changed files with 40 additions and 5 deletions
  1. +5
    -5
      src/Discord.Net.Commands/Info/CommandInfo.cs
  2. +35
    -0
      src/Discord.Net.Commands/Results/PreconditionGroupResult.cs

+ 5
- 5
src/Discord.Net.Commands/Info/CommandInfo.cs View File

@@ -64,11 +64,11 @@ namespace Discord.Commands
_action = builder.Callback; _action = builder.Callback;
} }


public async Task<PreconditionResult> CheckPreconditionsAsync(ICommandContext context, IServiceProvider services = null)
public async Task<IResult> CheckPreconditionsAsync(ICommandContext context, IServiceProvider services = null)
{ {
services = services ?? EmptyServiceProvider.Instance; services = services ?? EmptyServiceProvider.Instance;


async Task<PreconditionResult> CheckGroups(IEnumerable<PreconditionAttribute> preconditions, string type)
async Task<PreconditionGroupResult> CheckGroups(IEnumerable<PreconditionAttribute> preconditions, string type)
{ {
foreach (IGrouping<int, PreconditionAttribute> preconditionGroup in preconditions.GroupBy(p => p.Group)) foreach (IGrouping<int, PreconditionAttribute> preconditionGroup in preconditions.GroupBy(p => p.Group))
{ {
@@ -78,7 +78,7 @@ namespace Discord.Commands
{ {
var result = await precondition.CheckPermissions(context, this, services).ConfigureAwait(false); var result = await precondition.CheckPermissions(context, this, services).ConfigureAwait(false);
if (!result.IsSuccess) if (!result.IsSuccess)
return result;
return PreconditionGroupResult.FromError($"{type} default precondition group failed", new[] { result });
} }
} }
else else
@@ -88,10 +88,10 @@ namespace Discord.Commands
results.Add(await precondition.CheckPermissions(context, this, services).ConfigureAwait(false)); results.Add(await precondition.CheckPermissions(context, this, services).ConfigureAwait(false));


if (!results.Any(p => p.IsSuccess)) 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"); var moduleResult = await CheckGroups(Module.Preconditions, "Module");


+ 35
- 0
src/Discord.Net.Commands/Results/PreconditionGroupResult.cs View File

@@ -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<PreconditionResult> Preconditions { get; }

private PreconditionGroupResult(CommandError? error, string errorReason, IEnumerable<PreconditionResult> preconditions)
{
Error = error;
ErrorReason = errorReason;
Preconditions = preconditions ?? Enumerable.Empty<PreconditionResult>();
}

public static PreconditionGroupResult FromSuccess()
=> new PreconditionGroupResult(null, null, null);
public static PreconditionGroupResult FromError(string reason, IEnumerable<PreconditionResult> 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}";
}
}

Loading…
Cancel
Save