Esempio n. 1
0
        private object VisitCommandCall(CommandCallExpression statement)
        {
            var(cmdFound, cmd, _) = CommandFinder.Find(statement.CommandName, statement.Arguments.Length);

            if (!cmdFound)
            {
                throw Error($"command with name '{statement.CommandName}' and {statement.Arguments.Length} parameters not found");
            }

            if (statement.Arguments.Length < cmd.Params.Count(o => !o.Optional))
            {
                throw Error("argument count mismatch");
            }

            object[] args = Enumerable.Repeat(Type.Missing, cmd.Params.Length).ToArray();

            for (int i = 0; i < statement.Arguments.Length; i++)
            {
                object argValue = Visit(statement.Arguments[i]);

                if (argValue is float && cmd.Params[i].Type == typeof(string))
                {
                    args[i] = argValue.ToString();
                    continue;
                }

                try
                {
                    args[i] = Convert.ChangeType(argValue, cmd.Params[i].Type);
                }
                catch (Exception ex)
                {
                    throw Error($"failed to convert parameter {cmd.Params[i].Name}'s value", ex);
                }
            }

            return(CommandExecutor.Execute(cmd, args));
        }
Esempio n. 2
0
        ///<summary>Executes a single line</summary>
        /// <exception cref="CommandNotFoundException"></exception>
        /// <exception cref="ParserException"></exception>
        public void ExecuteLine(string line, bool addToHistory = true)
        {
            if (string.IsNullOrWhiteSpace(line))
            {
                return;
            }

            line = line.Trim();

            if (addToHistory)
            {
                History.AddNewItem(line);
            }

            int    cmdNameSeparatorIndex = line.IndexOf(' ');
            string cmdName  = cmdNameSeparatorIndex == -1 ? line.Substring(0) : line.Substring(0, cmdNameSeparatorIndex).Trim();
            string argsLine = cmdNameSeparatorIndex == -1 ? null : line.Substring(cmdNameSeparatorIndex + 1).Trim();

            argsLine = ReplaceVariables(argsLine);

            if (cmdName.StartsWith("$"))
            {
                HandleVariable(cmdName.Substring(1), argsLine);
                return;
            }

            var strArgs = GetArgs(argsLine).ToArray();

            var(success, _, commandsWithSameName) = CommandFinder.Find(cmdName, strArgs.Length);

            if (!success)
            {
                if (commandsWithSameName == null || commandsWithSameName.Length == 0)
                {
                    LConsole.WriteLine("Command not found");
                }
                else
                {
                    foreach (var item in commandsWithSameName)
                    {
                        item.PrintUsage();
                    }
                }

                return;
            }

            object[] cmdArgs = null;
            Command  cmd     = null;

            foreach (var possibleCmd in commandsWithSameName)
            {
                if (possibleCmd.RequiredParamCount > strArgs.Length)
                {
                    continue;
                }

                var(transformSuccess, transformError) = TryTransformParameters(argsLine, strArgs, possibleCmd, out cmdArgs);

                if (transformSuccess)
                {
                    cmd = possibleCmd;
                    break;
                }
            }

            if (cmd == null)
            {
                return;
            }

            object result = null;

            try
            {
                CommandExecutor.Execute(cmd, cmdArgs);
            }
            catch (TargetInvocationException ex)
            {
                if (ex.InnerException.GetType().Name == "SuccessException") //For NUnit
                {
                    throw ex.InnerException;
                }

                HandleException(ex.InnerException);
            }
            catch (Exception ex)
            {
                HandleException(ex);
            }

            if (result != null)
            {
                LConsole.WriteLine("Command returned: " + result, ConsoleColor.DarkGray);
            }

            void HandleException(Exception ex)
            {
                _LastException = ex;

                LConsole.Frontend.PrintException(ex);
            }
        }