From 430f6486fce53e492e4782f2c175aeb9c12c642c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20=C5=A0torc?= <storcond@fit.cvut.cz> Date: Mon, 27 Mar 2023 13:15:48 +0200 Subject: [PATCH] cli: Use REPL in cli --- aql2/src/aql.cpp | 9 ++++++--- aql2/src/prompt/Prompt.cpp | 8 +++++++- aql2/src/prompt/Prompt.h | 2 +- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/aql2/src/aql.cpp b/aql2/src/aql.cpp index eb07ae7fc8..85b61ed4c3 100644 --- a/aql2/src/aql.cpp +++ b/aql2/src/aql.cpp @@ -39,6 +39,7 @@ std::istream& operator>>(std::istream& in, std::pair<T, U>& value) #include <common/ResultInterpret.h> +#include "REPL.h" #include "aql.h" namespace TCLAP { @@ -66,7 +67,6 @@ class InteractiveVisitor : public TCLAP::Visitor { public: void visit() override { - Prompt::getPrompt().appendCharSequence(ReadlineLineInterface(true)); } }; @@ -93,6 +93,7 @@ class QueriesVisitor : public MultiArgVisitor { public: void visit() override { + std::istringstream iss{m_arg->getValue().back()}; Prompt::getPrompt().appendCharSequence(cli::StringLineInterface(m_arg->getValue().back())); } }; @@ -174,15 +175,15 @@ int main(int argc, char* argv[]) /* --------------------------------------------------------------------------------------------------------- */ + bool runInteractive = interactive.isSet(); // if no -f, -c, or -i, go interactive. if (!queries.isSet() && !files.isSet() && !interactive.isSet()) { if (isatty(fileno(stdin)) || interactive.isSet()) - Prompt::getPrompt().appendCharSequence(ReadlineLineInterface(true)); + runInteractive = true; else Prompt::getPrompt().appendCharSequence(cli::IstreamLineInterface<std::istream&>(std::cin)); } - cli::CommandResult res = Prompt::getPrompt().run(); /* --------------------------------------------------------------------------------------------------------- */ @@ -190,6 +191,8 @@ int main(int argc, char* argv[]) delete fileVisitor; delete interactiveVisitor; + cli::CommandResult res = Prompt::getPrompt().run(runInteractive); + if (res == cli::CommandResult::QUIT || res == cli::CommandResult::RETURN) return cli::ResultInterpret::cli(Prompt::getPrompt().getEnvironment().getResult()); else if (res == cli::CommandResult::EOT || res == cli::CommandResult::OK) diff --git a/aql2/src/prompt/Prompt.cpp b/aql2/src/prompt/Prompt.cpp index e4f51eb9f5..29719c5663 100644 --- a/aql2/src/prompt/Prompt.cpp +++ b/aql2/src/prompt/Prompt.cpp @@ -1,12 +1,13 @@ #include <global/GlobalData.h> #include "Prompt.h" +#include "REPL.h" Prompt::Prompt(cli::Environment environment) : m_environment(std::move(environment)) { } -cli::CommandResult Prompt::run() +cli::CommandResult Prompt::run(bool runInteractive) { cli::CommandResult res = cli::CommandResult::OK; @@ -28,5 +29,10 @@ cli::CommandResult Prompt::run() m_lineInterfaces.pop_front(); } + if (runInteractive) { + REPL repl; + res = repl.run(getEnvironment()); + } + return res; } diff --git a/aql2/src/prompt/Prompt.h b/aql2/src/prompt/Prompt.h index 02075d9a9b..37f43b9858 100644 --- a/aql2/src/prompt/Prompt.h +++ b/aql2/src/prompt/Prompt.h @@ -38,7 +38,7 @@ public: m_lineInterfaces.push_front(std::make_shared<LineInterface>(std::forward<LineInterface>(lineInterface))); } - cli::CommandResult run(); + cli::CommandResult run(bool runInteractive); cli::Environment& getEnvironment() { -- GitLab