From 05a6d677a4a799768c8b2e3757010b91eebd7381 Mon Sep 17 00:00:00 2001 From: talksik Date: Sat, 22 Feb 2025 08:45:54 -0800 Subject: [PATCH] adding in qt cli project instead of using raw c++ and/or golang FFI --- .DS_Store | Bin 0 -> 6148 bytes cpp-golang-ffi/.DS_Store | Bin 0 -> 6148 bytes .../CMakeLists.txt | 0 README.md => cpp-golang-ffi/README.md | 0 .../compile_commands.json | 0 .../external}/cxxopts/cxxopts.hpp | 0 generate.sh => cpp-golang-ffi/generate.sh | 0 cpp-golang-ffi/go/.DS_Store | Bin 0 -> 6148 bytes {go => cpp-golang-ffi/go}/build.sh | 0 {go => cpp-golang-ffi/go}/cmd/main.go | 0 {go => cpp-golang-ffi/go}/generated.go | 0 {go => cpp-golang-ffi/go}/go.mod | 0 {go => cpp-golang-ffi/go}/go.sum | 0 .../go}/internal/graph/generated.go | 0 .../go}/internal/graph/genqlient.graphql | 0 .../go}/internal/graph/genqlient.yaml | 0 .../go}/internal/graph/schema.graphql | 0 {go => cpp-golang-ffi/go}/libgraphql.dylib | Bin {go => cpp-golang-ffi/go}/libgraphql.h | 0 run.sh => cpp-golang-ffi/run.sh | 0 .../src}/generated/ClientClient.cpp | 0 .../src}/generated/ClientClient.h | 0 {src => cpp-golang-ffi/src}/main.cpp | 0 {src => cpp-golang-ffi/src}/query.graphql | 0 {src => cpp-golang-ffi/src}/schema.graphqls | 0 external/cppgraphqlgen | 1 - .../index/main.cpp.91EA9E614D588597.idx | Bin 0 -> 1796 bytes qt-cli/.clang-format | 4 + qt-cli/.gitignore | 82 ++++++++++++++ qt-cli/CMakeLists.txt | 26 +++++ qt-cli/compile_commands.json | 1 + qt-cli/main.cpp | 100 ++++++++++++++++++ 32 files changed, 213 insertions(+), 1 deletion(-) create mode 100644 .DS_Store create mode 100644 cpp-golang-ffi/.DS_Store rename CMakeLists.txt => cpp-golang-ffi/CMakeLists.txt (100%) rename README.md => cpp-golang-ffi/README.md (100%) rename compile_commands.json => cpp-golang-ffi/compile_commands.json (100%) rename {external => cpp-golang-ffi/external}/cxxopts/cxxopts.hpp (100%) rename generate.sh => cpp-golang-ffi/generate.sh (100%) create mode 100644 cpp-golang-ffi/go/.DS_Store rename {go => cpp-golang-ffi/go}/build.sh (100%) rename {go => cpp-golang-ffi/go}/cmd/main.go (100%) rename {go => cpp-golang-ffi/go}/generated.go (100%) rename {go => cpp-golang-ffi/go}/go.mod (100%) rename {go => cpp-golang-ffi/go}/go.sum (100%) rename {go => cpp-golang-ffi/go}/internal/graph/generated.go (100%) rename {go => cpp-golang-ffi/go}/internal/graph/genqlient.graphql (100%) rename {go => cpp-golang-ffi/go}/internal/graph/genqlient.yaml (100%) rename {go => cpp-golang-ffi/go}/internal/graph/schema.graphql (100%) rename {go => cpp-golang-ffi/go}/libgraphql.dylib (100%) rename {go => cpp-golang-ffi/go}/libgraphql.h (100%) rename run.sh => cpp-golang-ffi/run.sh (100%) rename {src => cpp-golang-ffi/src}/generated/ClientClient.cpp (100%) rename {src => cpp-golang-ffi/src}/generated/ClientClient.h (100%) rename {src => cpp-golang-ffi/src}/main.cpp (100%) rename {src => cpp-golang-ffi/src}/query.graphql (100%) rename {src => cpp-golang-ffi/src}/schema.graphqls (100%) delete mode 160000 external/cppgraphqlgen create mode 100644 qt-cli/.cache/clangd/index/main.cpp.91EA9E614D588597.idx create mode 100644 qt-cli/.clang-format create mode 100644 qt-cli/.gitignore create mode 100644 qt-cli/CMakeLists.txt create mode 120000 qt-cli/compile_commands.json create mode 100644 qt-cli/main.cpp diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7407e1a0401c41a134b36e4653528cba14c03399 GIT binary patch literal 6148 zcmeHKOHKnZ47H()5lE;D7A$jtE_#Dd4JYUYU|KOCP04K7qU^Z>JI=rrI0dKR1U$#) zGh(E|2BFH1lIJ9L;(5{}F%j|Nc0DJW5>bUJ$fAsh43AFjnehb3WsQ~+b#y^D)Q&9l zABQCNBU(|9GDFm#@z3ZI<+^L<%T?O+68ypa-OD!nO{(jrOAYL*^!U&mKRusr_gVki zr@#6V*K5WWF3x~6;0!ne&cKftz@05p9V&Y33^)VMzy||zJ_J<3XqXkt(SfF<06=+0 z7lAIhg!lx*XqXi-17URqsw-QH!Rn6jV0O_kE2=xOB_C`%zb7wTcE|dmm=i}uZ=C^W zV93C}cBgXxpW&AoP4b5>-g5?=fgNLjC-t&k;G^tr{q}is*9O#cR1vYuqClVz9s%gc gIdW1abv}p=yJ(mdWfd7O?m&MC6hgdl2L6D7H`U)cq5uE@ literal 0 HcmV?d00001 diff --git a/cpp-golang-ffi/.DS_Store b/cpp-golang-ffi/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..ef6414ff63e94db91e091f304c1b1f5f1d0fe5a4 GIT binary patch literal 6148 zcmeHKy-ve05I(m>R7HqVF)(IMK;P~Z#L$NW(2)Ipmm0%tv}2+u)+R=8`FZ8C_HZ*;9nVO< z$>{ETJH+xemgDBK2Pbfh_6QDP7j)8V>DU-OG3akGmFbt-qzU|mKHbhep1OtR8g~OD)>VKu7=JCWIXHXw`~ACjYqLz0t?_$~$NWC9wLyJ~&_h~UnNF~MHH!GX zY8MNy_wHS}&hM6wX8OT7^%MCw4B(kfQl4=rRu~WlgnX}7|}#ZL%BUwZm>kAq(HeqNQ?l<#t}-Cc5lHExBypxl7bWQW@nYy za!82~%t*6uJ)hn2v*qy;5l=VeglI%WIaF|Pg5iLOU$iHKWDzIJ8k5-$C9TORSQ?%S)%dxn?kfgWj1xAX+O zp{l#{)%l^Ab`3A%`SwF==&e;Z`)ZEGb?XXJmx(c83>X9dg#q+zk^EHAMq|JjFa~xE z$oIiP1%1Mx7(X2t;t>Ft!5jti_>Tv4VgUMtK@k=RYbsDvIUO-r(_wch&L<3tnob;d z#yV+dPA3$OyTk5cII&l>(HJlWx(p2UawPr#^853DH_5Jy0b}4#F~C_dE2g-m)LVNu uC%x7|=TH%e3yQlGOkyiWthC}YXcX9;On^RNP=p0yKLU{k8;pS;W#9`9bLP(de(v}8{a%$~-n=my zf&{HrY)MVXh@&6~!UsQfMtbrn2|)^}2(qQDAtF}I^R(`mh|~Jb(A0bRpU!O%Xcojg zySMPl@g!YcdUq-3JG(V4tE}!3_&WRHfg#S)3MYFVW4{5H7vOFodM#&pA zW-hs{ve~C^sv!Pu&PvWcey%w7rj>ht`tJ6vcnWcgKf*f3vt`ci0O_I6v|7UdEAK^-Y1BBqJTH0yyTo$c z#f{-Zyv|r_S;9&CmxG=IItS--Nz%XM)4czTSC%w({&QZOW-Qa@g(QdN-fLyFmhb$< zXX8Kz{Z36?5Vyjnu#JMR?75qEwfFc7y4t7l?uN||bq>tn;N@Na26cHK&S&%;d8wmk zXBO2ddS>}o4R4Fk4c#b+uv=RARJ3NKpeeM>Hr&H=R@u((MwAnr6giw>@3Z6UElWZ> zr&T<-n$|8Ib6ni7HQp<5L-Xz(uE%g-F*XA-ZNJE$m?>mmz##ULzJ}s)(T^{#`{-o?lIq2 zz4bapWaYzsgr52$2T^ZLjSm2mP;kSgA=LR`3k#WoAealqh5lgyCm+7d5M%r#UYvj79x(g`w7{ z7)l2OClv=>%K1QvCZI_nW??e2%oe8SSVDDL$$c}OM8TwdsWrsHy4d+$MRu+Li|xfY zv~62Ca%^_D$_=DLC(~&V%O>6_rYzLD157v*9uQydwHnX56zB!8SR$SQ@pi{9!<4K< zIq*$55RMRQOWVQ%b0UHOrd!fch@)1_@%vf+B*N4I51~KAef(>#6VIv307fO~EQt5_ zHRan}icSDdIFmT$#sr6w95xT){GQuI-f! zvc$Q#HPntjsja)#U)&5ZM#dNrZ_X*{>W}HV0Gyz{=zNF|IB+!^O7^yxN(~Y!AciqW z=qHnXH0R8z=E9a1;DkftSVC?1Pewl(bQb1I_T@oWp-$_{4hoIeKqM4J`Oth zHN^lX*>rvIk$|xR*9WB=?-ECgWqa>|rqY>o^F)9wEIAzLDTdg7RJ!@5(E^l07IGm5 zZLr6jKT5bA?gSGqUY)*5 z9b(!Lrse++hZ}^1CEbsbR>q`kqvGJTi4c+b2yythb^N$pmAX2`!aOM8|TgJVbMlK9Af_Lh*r literal 0 HcmV?d00001 diff --git a/qt-cli/.clang-format b/qt-cli/.clang-format new file mode 100644 index 0000000..d40b07c --- /dev/null +++ b/qt-cli/.clang-format @@ -0,0 +1,4 @@ +BasedOnStyle: Microsoft +TabWidth: 2 +IndentWidth: 2 + diff --git a/qt-cli/.gitignore b/qt-cli/.gitignore new file mode 100644 index 0000000..aa3808c --- /dev/null +++ b/qt-cli/.gitignore @@ -0,0 +1,82 @@ +# This file is used to ignore files which are generated +# ---------------------------------------------------------------------------- + +*~ +*.autosave +*.a +*.core +*.moc +*.o +*.obj +*.orig +*.rej +*.so +*.so.* +*_pch.h.cpp +*_resource.rc +*.qm +.#* +*.*# +core +!core/ +tags +.DS_Store +.directory +*.debug +Makefile* +*.prl +*.app +moc_*.cpp +ui_*.h +qrc_*.cpp +Thumbs.db +*.res +*.rc +/.qmake.cache +/.qmake.stash + +# qtcreator generated files +*.pro.user* +*.qbs.user* +CMakeLists.txt.user* + +# xemacs temporary files +*.flc + +# Vim temporary files +.*.swp + +# Visual Studio generated files +*.ib_pdb_index +*.idb +*.ilk +*.pdb +*.sln +*.suo +*.vcproj +*vcproj.*.*.user +*.ncb +*.sdf +*.opensdf +*.vcxproj +*vcxproj.* + +# MinGW generated files +*.Debug +*.Release + +# Python byte code +*.pyc + +# Binaries +# -------- +*.dll +*.exe + +# Directories with generated files +.moc/ +.obj/ +.pch/ +.rcc/ +.uic/ +/build*/ diff --git a/qt-cli/CMakeLists.txt b/qt-cli/CMakeLists.txt new file mode 100644 index 0000000..6521506 --- /dev/null +++ b/qt-cli/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.16) + +project(qt-cli LANGUAGES CXX) + +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Network) +find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Network) + +add_executable(qt-cli + main.cpp +) +target_link_libraries(qt-cli Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Network) + +include(GNUInstallDirs) +install(TARGETS qt-cli + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) diff --git a/qt-cli/compile_commands.json b/qt-cli/compile_commands.json new file mode 120000 index 0000000..8eabf03 --- /dev/null +++ b/qt-cli/compile_commands.json @@ -0,0 +1 @@ +build/Qt_6_8_2_for_macOS-Debug/compile_commands.json \ No newline at end of file diff --git a/qt-cli/main.cpp b/qt-cli/main.cpp new file mode 100644 index 0000000..647770f --- /dev/null +++ b/qt-cli/main.cpp @@ -0,0 +1,100 @@ +#include +#include +#include +#include +#include +#include + +struct WaitlistEntry +{ + QString firstName; + QString lastName; + QString email; +}; + +QVector parseGraphQLResponse(const QByteArray &responseData) +{ + QVector waitlist; + QJsonDocument doc = QJsonDocument::fromJson(responseData); + if (!doc.isObject()) + return waitlist; + + QJsonObject obj = doc.object(); + QJsonArray entries = obj["data"].toObject()["getWaitlist"].toArray(); + + for (const QJsonValue &value : entries) + { + QJsonObject entryObj = value.toObject(); + WaitlistEntry entry{entryObj["firstName"].toString(), entryObj["lastName"].toString(), + entryObj["email"].toString()}; + waitlist.append(entry); + } + return waitlist; +} + +void sendGraphQLQuery(QNetworkAccessManager &manager) +{ + QUrl url("https://helios.dev.flowy.live/query"); + QNetworkRequest request(url); + request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); + request.setRawHeader("Authorization", "talksik"); + + // Define GraphQL query + QJsonObject json; + json["query"] = R"( + query { + getWaitlist { + firstName + lastName + email + } + } + )"; + + // Convert to JSON and send request + QNetworkReply *reply = manager.post(request, QJsonDocument(json).toJson()); + + // Handle response asynchronously + QObject::connect(reply, &QNetworkReply::finished, [reply]() { + if (reply->error() == QNetworkReply::NoError) + { + auto response = reply->readAll(); + + auto parsedEntries = parseGraphQLResponse(response); + + for (const auto &entry : parsedEntries) + { + qDebug() << "Entry: " << entry.email << Qt::endl; + } + } + else + { + qDebug() << "Error:" << reply->errorString(); + } + reply->deleteLater(); + + QCoreApplication::quit(); + }); +} + +int main(int argc, char *argv[]) +{ + QCoreApplication a(argc, argv); + + // Set up code that uses the Qt event loop here. + // Call a.quit() or a.exit() to quit the application. + // A not very useful example would be including + // #include + // near the top of the file and calling + // QTimer::singleShot(5000, &a, &QCoreApplication::quit); + // which quits the application after 5 seconds. + + // If you do not need a running Qt event loop, remove the call + // to a.exec() or use the Non-Qt Plain C++ Application template. + qDebug() << "Sending GraphQL query..."; + QNetworkAccessManager manager; + sendGraphQLQuery(manager); + qDebug() << "Waiting for response..."; + + return a.exec(); +}