From be2b87ed4dda865406096196804b784f4c293687 Mon Sep 17 00:00:00 2001 From: Jade Lovelace Date: Sat, 9 Mar 2024 23:59:50 -0800 Subject: add automated usage mode to the repl This is definitely not a stable thing, but it does feel slightly crimes to put it as an experimental feature. Shrug, up for bikeshedding. Change-Id: I6ef176e3dee6fb1cac9c0a7a60d553a2c63ea728 --- src/libcmd/repl-interacter.cc | 22 ++++++++++++++++++++++ src/libcmd/repl-interacter.hh | 9 +++++++++ src/libcmd/repl.cc | 8 +++++++- 3 files changed, 38 insertions(+), 1 deletion(-) (limited to 'src/libcmd') diff --git a/src/libcmd/repl-interacter.cc b/src/libcmd/repl-interacter.cc index 18c1cad0f..829383add 100644 --- a/src/libcmd/repl-interacter.cc +++ b/src/libcmd/repl-interacter.cc @@ -1,4 +1,6 @@ #include +#include +#include #ifdef READLINE #include @@ -183,4 +185,24 @@ ReadlineLikeInteracter::~ReadlineLikeInteracter() write_history(historyFile.c_str()); } +AutomationInteracter::Guard AutomationInteracter::init(detail::ReplCompleterMixin *) +{ + return Guard([] {}); +} + +// ASCII ENQ character +constexpr const char * automationPrompt = "\x05"; + +bool AutomationInteracter::getLine(std::string & input, ReplPromptType promptType) +{ + std::cout << std::unitbuf; + std::cout << automationPrompt; + if (!std::getline(std::cin, input)) { + // reset failure bits on EOF + std::cin.clear(); + return false; + } + return true; +} + }; diff --git a/src/libcmd/repl-interacter.hh b/src/libcmd/repl-interacter.hh index cc70efd07..c31b1a1e6 100644 --- a/src/libcmd/repl-interacter.hh +++ b/src/libcmd/repl-interacter.hh @@ -45,4 +45,13 @@ public: virtual ~ReadlineLikeInteracter() override; }; +class AutomationInteracter : public virtual ReplInteracter +{ +public: + AutomationInteracter() = default; + virtual Guard init(detail::ReplCompleterMixin * repl) override; + virtual bool getLine(std::string & input, ReplPromptType promptType) override; + virtual ~AutomationInteracter() override = default; +}; + }; diff --git a/src/libcmd/repl.cc b/src/libcmd/repl.cc index 5809ab285..9e5599152 100644 --- a/src/libcmd/repl.cc +++ b/src/libcmd/repl.cc @@ -121,6 +121,12 @@ std::string removeWhitespace(std::string s) return s; } +static box_ptr makeInteracter() { + if (experimentalFeatureSettings.isEnabled(Xp::ReplAutomation)) + return make_box_ptr(); + else + return make_box_ptr(getDataDir() + "/nix/repl-history"); +} NixRepl::NixRepl(const SearchPath & searchPath, nix::ref store, ref state, std::function getValues) @@ -128,7 +134,7 @@ NixRepl::NixRepl(const SearchPath & searchPath, nix::ref store, refstaticBaseEnv.get())) - , interacter(make_box_ptr(getDataDir() + "/nix/repl-history")) + , interacter(makeInteracter()) { } -- cgit v1.2.3