diff --git a/src/devtools/stdin_reader.cpp b/src/devtools/stdin_reader.cpp new file mode 100644 index 000000000..dba26b75d --- /dev/null +++ b/src/devtools/stdin_reader.cpp @@ -0,0 +1,36 @@ +#include "stdin_reader.hpp" + +#include "logic/CommandsInterpreter.hpp" +#include "coders/json.hpp" +#include "debug/Logger.hpp" + +#include +#include + +static debug::Logger logger("stdin-reader"); + +static std::thread reader_thread; + +void start_stdin_reader(cmd::CommandsInterpreter& interpreter) { + reader_thread = std::thread([&interpreter]() { + logger.info() << "reader thread started"; + + std::string line; + while (std::getline(std::cin, line)) { + if (line.empty()) { + continue; + } + try { + auto result = interpreter.execute(line); + if (result.isString()) { + logger.info() << result.asString(); + } else { + logger.info() << json::stringify(result, true); + } + } catch (const std::exception& err) { + logger.error() << err.what(); + } + } + }); + reader_thread.detach(); +} diff --git a/src/devtools/stdin_reader.hpp b/src/devtools/stdin_reader.hpp new file mode 100644 index 000000000..d141db998 --- /dev/null +++ b/src/devtools/stdin_reader.hpp @@ -0,0 +1,7 @@ +#pragma once + +namespace cmd { + class CommandsInterpreter; +} + +void start_stdin_reader(cmd::CommandsInterpreter& interpreter); diff --git a/src/engine/CoreParameters.hpp b/src/engine/CoreParameters.hpp index c937bf3ad..b482f2bb5 100644 --- a/src/engine/CoreParameters.hpp +++ b/src/engine/CoreParameters.hpp @@ -6,6 +6,7 @@ struct CoreParameters { bool headless = false; bool testMode = false; + bool stdinCommands = false; std::filesystem::path resFolder = "res"; std::filesystem::path userFolder = "."; std::filesystem::path scriptFile; diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp index 9afe0824a..50a6f921b 100644 --- a/src/engine/Engine.cpp +++ b/src/engine/Engine.cpp @@ -15,6 +15,7 @@ #include "devtools/DebuggingServer.hpp" #include "devtools/Editor.hpp" #include "devtools/Project.hpp" +#include "devtools/stdin_reader.hpp" #include "EnginePaths.hpp" #include "frontend/locale.hpp" #include "frontend/menu.hpp" @@ -191,6 +192,9 @@ void Engine::initialize(CoreParameters coreParameters) { if (!params.headless) { project->loadProjectClientScript(); } + if (params.stdinCommands) { + start_stdin_reader(*cmd); + } } void Engine::loadSettings() { diff --git a/src/util/command_line.cpp b/src/util/command_line.cpp index 7cb3614ef..e41a0ea57 100644 --- a/src/util/command_line.cpp +++ b/src/util/command_line.cpp @@ -62,6 +62,10 @@ static bool perform_keyword( params.headless = true; return true; }, "", "run in headless mode."), + ArgC("--stdin-cmd", [¶ms]() -> bool { + params.stdinCommands = true; + return true; + }, "", "run commands from stdin."), ArgC("--tps", [¶ms, &reader]() -> bool { params.tps = reader.nextInt(); return true;