예제 #1
0
        /// <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());
        }
예제 #2
0
        /// <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());
        }
예제 #3
0
        /// <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);
        }