From 41ba0b8e656baa61c9e156723178d1d6ebb4148c Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 11 Feb 2026 15:26:53 +0300 Subject: [PATCH 1/3] feat: executing commands from stdin --- src/devtools/StdinReader.cpp | 34 ++++++++++++++++++++++++++++++++++ src/devtools/StdinReader.hpp | 7 +++++++ src/engine/Engine.cpp | 3 +++ 3 files changed, 44 insertions(+) create mode 100644 src/devtools/StdinReader.cpp create mode 100644 src/devtools/StdinReader.hpp diff --git a/src/devtools/StdinReader.cpp b/src/devtools/StdinReader.cpp new file mode 100644 index 000000000..16752ec31 --- /dev/null +++ b/src/devtools/StdinReader.cpp @@ -0,0 +1,34 @@ +#include "StdinReader.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]() { + 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/StdinReader.hpp b/src/devtools/StdinReader.hpp new file mode 100644 index 000000000..d141db998 --- /dev/null +++ b/src/devtools/StdinReader.hpp @@ -0,0 +1,7 @@ +#pragma once + +namespace cmd { + class CommandsInterpreter; +} + +void start_stdin_reader(cmd::CommandsInterpreter& interpreter); diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp index 9afe0824a..1e9566fea 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/StdinReader.hpp" #include "EnginePaths.hpp" #include "frontend/locale.hpp" #include "frontend/menu.hpp" @@ -191,6 +192,8 @@ void Engine::initialize(CoreParameters coreParameters) { if (!params.headless) { project->loadProjectClientScript(); } + + start_stdin_reader(*cmd); } void Engine::loadSettings() { From 7c0772b5b69e8383994bdef1146fc8bf95141b8e Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 11 Feb 2026 15:57:38 +0300 Subject: [PATCH 2/3] rename --- src/devtools/{StdinReader.cpp => stdin_reader.cpp} | 2 +- src/devtools/{StdinReader.hpp => stdin_reader.hpp} | 0 src/engine/Engine.cpp | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename src/devtools/{StdinReader.cpp => stdin_reader.cpp} (97%) rename src/devtools/{StdinReader.hpp => stdin_reader.hpp} (100%) diff --git a/src/devtools/StdinReader.cpp b/src/devtools/stdin_reader.cpp similarity index 97% rename from src/devtools/StdinReader.cpp rename to src/devtools/stdin_reader.cpp index 16752ec31..adaa17c4c 100644 --- a/src/devtools/StdinReader.cpp +++ b/src/devtools/stdin_reader.cpp @@ -1,4 +1,4 @@ -#include "StdinReader.hpp" +#include "stdin_reader.hpp" #include "logic/CommandsInterpreter.hpp" #include "coders/json.hpp" diff --git a/src/devtools/StdinReader.hpp b/src/devtools/stdin_reader.hpp similarity index 100% rename from src/devtools/StdinReader.hpp rename to src/devtools/stdin_reader.hpp diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp index 1e9566fea..14d2af807 100644 --- a/src/engine/Engine.cpp +++ b/src/engine/Engine.cpp @@ -15,7 +15,7 @@ #include "devtools/DebuggingServer.hpp" #include "devtools/Editor.hpp" #include "devtools/Project.hpp" -#include "devtools/StdinReader.hpp" +#include "devtools/stdin_reader.hpp" #include "EnginePaths.hpp" #include "frontend/locale.hpp" #include "frontend/menu.hpp" From b200d38e48f6c944a040849959f5939e18a43de4 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 11 Feb 2026 16:01:46 +0300 Subject: [PATCH 3/3] add '--stdin-cmd' command line flag --- src/devtools/stdin_reader.cpp | 2 ++ src/engine/CoreParameters.hpp | 1 + src/engine/Engine.cpp | 5 +++-- src/util/command_line.cpp | 4 ++++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/devtools/stdin_reader.cpp b/src/devtools/stdin_reader.cpp index adaa17c4c..dba26b75d 100644 --- a/src/devtools/stdin_reader.cpp +++ b/src/devtools/stdin_reader.cpp @@ -13,6 +13,8 @@ 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()) { 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 14d2af807..50a6f921b 100644 --- a/src/engine/Engine.cpp +++ b/src/engine/Engine.cpp @@ -192,8 +192,9 @@ void Engine::initialize(CoreParameters coreParameters) { if (!params.headless) { project->loadProjectClientScript(); } - - start_stdin_reader(*cmd); + 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;