Пример #1
0
        /// <summary>
        /// Parse a simple command with flags and no paramters.
        /// </summary>
        /// <param name="line">Input line.</param>
        /// <param name="command">Command to parse.</param>
        /// <param name="flags">Out Flags containted in the input line. See BoolFlag.</param>
        /// <returns>Result of the parsing.
        /// Possible result types are Success, WrongCommand and ParsingFailure.
        /// See ParsingResult.</returns>
        public static ParsingResult ParseSimpleCommandWithFlags(string line, ICommand command, out IEnumerable <BoolFlag> flags)
        {
            string remainder   = "";
            var    resultFlags = new List <BoolFlag>();

            flags = resultFlags;

            var result = ParseSimpleCommandBody(line, command, out remainder);

            // Flags are optional
            if (result.Type == ParsingResultType.SuccessReachedEnd)
            {
                result.Type = ParsingResultType.Success;
                return(result);
            }

            var flagsResult = ParsingHelpers.TryFlags(remainder);

            if (flagsResult.WasSuccessful == false || flagsResult.Remainder.AtEnd == false)
            {
                GConsole.WriteLine(Resources.text.FailureParsingFlags, remainder, command.Name());
                result.Type = ParsingResultType.ParsingFailure;
                return(result);
            }

            var parsedFlags = flagsResult.Value.ToList();

            foreach (var flag in command.GetFlags())
            {
                if (flag.FindInList(ref parsedFlags))
                {
                    resultFlags.Add(flag);
                }
            }

            flags = resultFlags;

            if (parsedFlags.Count > 0)
            {
                GConsole.WriteLine(Resources.text.UnknownFlags, String.Join(",", parsedFlags), command.Name());
                result.Type = ParsingResultType.ParsingFailure;
                return(result);
            }

            result.Type = ParsingResultType.Success;
            return(result);
        }
Пример #2
0
        /// <summary>
        /// Parse a command with parameters and flags.
        /// </summary>
        /// <param name="line">Input line.</param>
        /// <param name="command">Command to parse.</param>
        /// <param name="hasRequiredParams">Whether the command has at least on required parameters.</param>
        /// <returns>Result of the parsing.
        /// Possible result types are Success, WrongCommand, MissingParam and ParsingFailure.
        /// It splits all the parameters by space into ParsingResult.Parameters.
        /// See ParsingResult.</returns>
        public static ParsingResult ParseCommand(string line, ICommand command, bool hasRequiredParams)
        {
            string remainder = "";

            var result = ParseSimpleCommandBody(line, command, out remainder);

            if (result.Type == ParsingResultType.SuccessReachedEnd)
            {
                if (hasRequiredParams == true)
                {
                    result.Type = ParsingResultType.MissingParam;
                    GConsole.WriteLine(-1.0f, Resources.text.MissingParam, command.Name());
                    return(result);
                }
                else
                {
                    result.Type = ParsingResultType.Success;
                    return(result);
                }
            }

            if (result.Type != ParsingResultType.Success)
            {
                return(result);
            }

            var paramResult = TryTextParam(remainder);

            if (paramResult.WasSuccessful == false && hasRequiredParams == true)
            {
                GConsole.WriteLine(Resources.text.FailureParsingRequiredParam, command.Name());
                result.Type = ParsingResultType.ParsingFailure;
                return(result);
            }

            string parameters = paramResult.Value.TrimEnd();

            result.Parameters = parameters.Split(new char[] { ' ', '\t' }).ToList();

            if (paramResult.Remainder.AtEnd == true)
            {
                result.Type = ParsingResultType.Success;
                return(result);
            }

            remainder = remainder.Substring(paramResult.Remainder.Position - 1).TrimEnd();

            var flagsResult = ParsingHelpers.TryFlags(remainder);

            if (flagsResult.WasSuccessful == false || flagsResult.Remainder.AtEnd == false)
            {
                GConsole.WriteLine(Resources.text.FailureParsingFlags, remainder, command.Name());
                result.Type = ParsingResultType.ParsingFailure;
                return(result);
            }

            var parsedFlags = flagsResult.Value.ToList();

            foreach (var flag in command.GetFlags())
            {
                if (flag.FindInList(ref parsedFlags))
                {
                    result.Flags.Add(flag);
                }
            }

            if (parsedFlags.Count > 0)
            {
                GConsole.WriteLine(Resources.text.UnknownFlags, String.Join(",", parsedFlags), command.Name());
                result.Type = ParsingResultType.ParsingFailure;
                return(result);
            }

            result.Type = ParsingResultType.Success;
            return(result);
        }