/// <summary> /// Returns the hash code for this Syntax /// </summary> /// <returns></returns> public override int GetHashCode() { if (HasAlternateSyntax) { return(Items.GetHashCode() ^ AlternateSyntax.GetHashCode() ^ InfiniteTrailingArguments.GetHashCode()); } return(Items.GetHashCode() ^ InfiniteTrailingArguments.GetHashCode()); }
/// <summary> /// Creates a syntax string of this syntax and any alternate syntaxes /// </summary> /// <returns></returns> public string CreateSyntaxString() { string _ = ""; if (HasAlternateSyntax) { _ += AlternateSyntax.CreateSyntaxString() + "\n"; } if (!Items.Any()) { _ += "(none) "; } foreach (SyntaxItem i in Items) { _ += "<"; _ += i.Name; switch (i.Type) { case SyntaxItemType.Free: break; case SyntaxItemType.Number: case SyntaxItemType.Integer: _ += " " + i.Range.ToString(); break; case SyntaxItemType.List: if (i.ValidItems == BOOLEAN_VALUES || i.ValidItems == BOOLEAN_VALUES_STRICT) { _ += " (true|false)"; } else { _ += " (" + string.Join("|", i.ValidItems) + ")"; } break; } _ += "> "; } if (InfiniteTrailingArguments) { _ += "... "; } return(_.TrimStart()); }
/// <summary> /// Syntax checks a list of arguments /// </summary> /// <param name="cmd">Command to pass to SyntaxErrors if any are present, not required if throwIf is set to false</param> /// <param name="args">Arguments to check</param> /// <param name="throwIf">If true: Throws an exception if syntax errors are found (generally passed to the IConsoleOuput target)</param> /// <returns></returns> internal bool IsCorrectSyntax(Command cmd, Params args, bool throwIf) { if (args.Count < Items.Count()) { bool b = (AlternateSyntax?.IsCorrectSyntax(args)).GetValueOrDefault(false); if (!b && throwIf) { Command.ThrowSyntaxError(cmd, args, ErrorCode.NOT_ENOUGH_ARGUMENTS); } return(b); } if (!InfiniteTrailingArguments) { if (args.Count > Items.Count()) { bool b = (AlternateSyntax?.IsCorrectSyntax(args)).GetValueOrDefault(false); if (!b && throwIf) { Command.ThrowSyntaxError(cmd, args, ErrorCode.TOO_MANY_ARGUMENTS); } return(b); } } for (int i = 0; i < Items.Count; i++) { switch (Items[i].Type) { case SyntaxItemType.Free: continue; case SyntaxItemType.Number: if (args.IsDouble(i) && Items[i].Range.IsInRange(args.ToDouble(i))) { continue; } bool b = (AlternateSyntax?.IsCorrectSyntax(args)).GetValueOrDefault(false); if (!b && throwIf) { if (!args.IsDouble(i)) { Command.ThrowNaNError(args[i], ErrorCode.NOT_A_NUMBER); } else { Command.ThrowOutOfRangeError(args.ToDouble(i), Items[i].Range, ErrorCode.NUMBER_OUT_OF_RANGE); } } return(b); case SyntaxItemType.Integer: if (args.IsInteger(i) && Items[i].Range.IsInRange(args.ToInt(i))) { continue; } bool b2 = (AlternateSyntax?.IsCorrectSyntax(args)).GetValueOrDefault(false); if (!b2 && throwIf) { if (!args.IsInteger(i)) { if (args.IsDouble(i)) { Command.ThrowNoFloatsAllowedError(args.ToDouble(i), ErrorCode.NUMBER_NOT_INTEGER); } else { Command.ThrowNaNError(args[i], ErrorCode.NOT_A_NUMBER); } } else { Command.ThrowOutOfRangeError(args.ToDouble(i), Items[i].Range, ErrorCode.NUMBER_OUT_OF_RANGE); } } return(b2); case SyntaxItemType.List: if (Items[i].ValidItems.Contains(args[i])) { continue; } bool b3 = (AlternateSyntax?.IsCorrectSyntax(args)).GetValueOrDefault(false); if (!b3 && throwIf) { Command.ThrowArgumentError(args[i], Items[i].ValidItems, ErrorCode.ARGUMENT_UNLISTED); } return(b3); } } return(true); }