using System; using System.Linq; using System.Threading.Tasks; using System.Collections.Generic; using System.Diagnostics; using CommandCallback = System.Func; namespace Discord.Commands.Builders { public class OverloadBuilder { private readonly List _preconditions; private readonly List _parameters; public CommandBuilder Command { get; } public CommandCallback Callback { get; set; } public RunMode RunMode { get; set; } public int Priority { get; set; } public IReadOnlyList Preconditions => _preconditions; public IReadOnlyList Parameters => _parameters; internal OverloadBuilder(CommandBuilder command) { Command = command; _preconditions = new List(); _parameters = new List(); } public OverloadBuilder WithRunMode(RunMode runMode) { RunMode = runMode; return this; } public OverloadBuilder WithPriority(int priority) { Priority = priority; return this; } public OverloadBuilder WithCallback(CommandCallback callback) { Callback = callback; return this; } public OverloadBuilder AddPrecondition(PreconditionAttribute precondition) { _preconditions.Add(precondition); return this; } internal OverloadBuilder AddParameter(Action createFunc) { var param = new ParameterBuilder(this); createFunc(param); _parameters.Add(param); return this; } public OverloadBuilder AddParameter(string name, Type type, Action createFunc) { var param = new ParameterBuilder(this, name, type); createFunc(param); _parameters.Add(param); return this; } internal OverloadInfo Build(CommandInfo info, CommandService service) { Discord.Preconditions.NotNull(Callback, nameof(Callback)); if (_parameters.Count > 0) { var lastParam = _parameters[_parameters.Count - 1]; var firstMultipleParam = _parameters.FirstOrDefault(x => x.IsMultiple); if ((firstMultipleParam != null) && (firstMultipleParam != lastParam)) throw new InvalidOperationException("Only the last parameter in a command may have the Multiple flag."); var firstRemainderParam = _parameters.FirstOrDefault(x => x.IsRemainder); if ((firstRemainderParam != null) && (firstRemainderParam != lastParam)) throw new InvalidOperationException("Only the last parameter in a command may have the Remainder flag."); } return new OverloadInfo(this, info, service); } } }