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