File indexing completed on 2024-05-19 05:33:30

0001 /*
0002     SPDX-FileCopyrightText: 2018, 2019 Ivan Čukić <ivan.cukic(at)kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 // std, boost
0008 #include <iostream>
0009 #include <future>
0010 #include <boost/thread/thread.hpp>
0011 
0012 // Voy
0013 #include <voy/basic/sink.h>
0014 #include <voy/basic/values.h>
0015 #include <voy/basic/delayed.h>
0016 
0017 #include <voy/dsl.h>
0018 #include <voy/operations/transform.h>
0019 #include <voy/operations/filter.h>
0020 #include <voy/operations/debounce.h>
0021 #include <voy/wrappers/qt/connect.h>
0022 
0023 // Qt
0024 #include <QGuiApplication>
0025 #include <QQmlApplicationEngine>
0026 #include <QQmlContext>
0027 #include <QDebug>
0028 #include <QThread>
0029 
0030 // Blade
0031 #include "transport/Serialization.h"
0032 #include "transport/ControllerMessage.h"
0033 #include "ui/UiBackend.h"
0034 namespace s11n = blade::serialization;
0035 
0036 // Utils
0037 #include <utils/qstringliterals.h>
0038 #include <utils/overloaded.h>
0039 #include <utils/constructor_fn.h>
0040 #include <utils/bind_front.h>
0041 using std_ex::overloaded;
0042 using std_ex::bind_front;
0043 
0044 // Runners
0045 #include "runners/AbstractRunner.h"
0046 #include "runners/plugins/services/ServicesRunner.h"
0047 
0048 using namespace std::literals::string_literals;
0049 using namespace std::literals::chrono_literals;
0050 
0051 using namespace voy;
0052 
0053 
0054 class QueryGenerator {
0055 public:
0056     template <typename T>
0057     blade::QueryMessage operator() (T&& value) const
0058     {
0059         ++m_id;
0060         return { m_id, voy_fwd(value) };
0061     }
0062 
0063 private:
0064     mutable std::uint64_t m_id = 0;
0065 };
0066 
0067 
0068 class RunnerManager {
0069     using runners_t = std::vector<std::unique_ptr<AbstractRunner>>;
0070 
0071 public:
0072     RunnerManager()
0073     {
0074         m_runners.emplace_back(std::make_unique<ServicesRunner>());
0075     }
0076 
0077     void runQuery(const QString &queryString)
0078     {
0079         for (const auto& runner: m_runners) {
0080             runner->runQuery(queryString);
0081         }
0082     }
0083 
0084 private:
0085     runners_t m_runners;
0086 };
0087 
0088 
0089 int main(int argc, char *argv[])
0090 {
0091     QGuiApplication app(argc, argv);
0092     QQmlApplicationEngine engine;
0093 
0094     UiBackend backend;
0095 
0096     auto context = engine.rootContext();
0097     context->setContextProperty("BladeUiBackend", &backend);
0098 
0099     engine.load(app.arguments()[1]);
0100     if (engine.rootObjects().isEmpty()) throw "QML not loaded properly";
0101 
0102     boost::thread voy_thread([&backend] {
0103         auto cout = [] (auto&& value) {
0104             qDebug() << "SINK: " << value;
0105         };
0106 
0107         RunnerManager rm;
0108 
0109         using voy::dsl::operator|;
0110 
0111         auto pipeline =
0112             qt::signal(&backend, &UiBackend::searchRequested)
0113                 | remove_if(&QString::isEmpty)
0114                 | debounce<QString>(200ms)
0115                 | transform(QueryGenerator{})
0116                 | transform(bind_front(initialize<blade::ControllerMessage>{}, "42", "0"))
0117                 // | transform(s11n::asStdString)
0118                 // | transform(s11n::readControllerMessage)
0119                 | transform([] (auto&& cm) {
0120                       qDebug() << cm;
0121                       return std::visit(
0122                           overloaded {
0123                               [] (const blade::PingMessage& msg) {
0124                                   return "PING"_qs;
0125                               },
0126                               [] (const blade::QueryMessage& msg) {
0127                                   return msg.text;
0128                               },
0129                               [] (const blade::ErrorMessage& msg) {
0130                                   return QString::fromLatin1(msg.message);
0131                               }
0132                           }, cm.message);
0133                   })
0134                 | sink([] (auto&& value) { qDebug() << "Generated:" << value; })
0135                 ;
0136                 // | qt::slot(&backend, &UiBackend::searchFinished);
0137 
0138         voy::event_loop::run();
0139     });
0140 
0141     return app.exec();
0142 }
0143