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)); }
///<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); } }