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