summaryrefslogtreecommitdiff
path: root/qml_plugin/src/qml_interface/duckduckgo.rs
diff options
context:
space:
mode:
Diffstat (limited to 'qml_plugin/src/qml_interface/duckduckgo.rs')
-rw-r--r--qml_plugin/src/qml_interface/duckduckgo.rs88
1 files changed, 88 insertions, 0 deletions
diff --git a/qml_plugin/src/qml_interface/duckduckgo.rs b/qml_plugin/src/qml_interface/duckduckgo.rs
new file mode 100644
index 0000000..0375cdf
--- /dev/null
+++ b/qml_plugin/src/qml_interface/duckduckgo.rs
@@ -0,0 +1,88 @@
+use cxx_qt::{CxxQtType, Threading};
+use cxx_qt_lib::QString;
+use std::pin::Pin;
+use unwrap_print::PrintableResult;
+
+use crate::{ExclusiveExecutor, web::duckduckgo};
+
+#[cxx_qt::bridge]
+mod qobject {
+ extern "C++" {
+ include!("cxx-qt-lib/qstring.h");
+ type QString = cxx_qt_lib::QString;
+ }
+
+ extern "RustQt" {
+ #[qobject]
+ #[qml_element]
+ #[qml_singleton]
+ #[qproperty(bool, ok)]
+ #[qproperty(QString, title)]
+ #[qproperty(QString, description_html)]
+ #[qproperty(QString, image)]
+ type DuckDuckGo = super::DuckDuckGoRs;
+
+ #[qinvokable]
+ fn query(self: Pin<&mut DuckDuckGo>, input: QString);
+
+ #[qinvokable]
+ fn reset(self: Pin<&mut DuckDuckGo>);
+ }
+
+ impl cxx_qt::Threading for DuckDuckGo {}
+}
+
+#[derive(Default)]
+pub struct QmlDuckDuckGo {
+ pub title: QString,
+ pub description_html: QString,
+ pub image: QString,
+}
+
+#[derive(Default)]
+pub struct DuckDuckGoRs {
+ ok: bool,
+ title: QString,
+ description_html: QString,
+ image: QString,
+
+ executor: ExclusiveExecutor,
+}
+
+impl qobject::DuckDuckGo {
+ fn query(self: Pin<&mut Self>, input: QString) {
+ let qt_thread = self.qt_thread();
+ self.rust_mut().executor.spawn(async move {
+ let qinput = input.to_string();
+ let result: Result<QmlDuckDuckGo, _> =
+ duckduckgo::query(&qinput).await.map(|r| r.into());
+ // consider just unwrapping since this is in a separate thread and
+ // is already end of life anw
+ _ = qt_thread
+ .queue(move |mut qo| match result {
+ Ok(r) => {
+ if (r.title.to_lower() == input.to_lower() || r.title.is_empty())
+ && r.description_html.is_empty()
+ && r.image.is_empty()
+ {
+ qo.as_mut().set_ok(false);
+ } else {
+ qo.as_mut().set_ok(true);
+ qo.as_mut().set_title(r.title);
+ qo.as_mut().set_description_html(r.description_html);
+ qo.as_mut().set_image(r.image);
+ }
+ }
+ Err(_) => qo.set_ok(false),
+ })
+ .unwrap_print();
+ });
+ }
+
+ fn reset(mut self: Pin<&mut Self>) {
+ self.as_mut().set_ok(false);
+ self.as_mut().set_title("".into());
+ self.as_mut().set_description_html("".into());
+ self.as_mut().set_image("".into());
+ }
+}