From 2c158d9bf1c84b68dbebf5e610cc5efde88a5c87 Mon Sep 17 00:00:00 2001 From: uncor3 Date: Mon, 8 Jun 2026 20:48:18 +0000 Subject: [PATCH] feat(apps): impl search --- src/apps.rs | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/src/apps.rs b/src/apps.rs index 0385fbd..c91ef59 100644 --- a/src/apps.rs +++ b/src/apps.rs @@ -5,15 +5,18 @@ use macros::QtThreading; use qmetaobject::prelude::*; use qttypes::{QStringList, QVariantMap}; use std::pin::Pin; +use std::sync::Arc; #[derive(QObject, Default, QtThreading)] pub struct Apps { base: qt_base_class!(trait QObject), state: qt_property!(QVariantMap; NOTIFY state_changed), state_changed: qt_signal!(), - + ipa_tool: Option>, init: qt_method!(fn(&mut self)), sign_in: qt_method!(fn(&mut self, email: QString, password: QString)), + search: qt_method!(fn(&mut self, term: QString)), + search_ready: qt_signal!(search_term : QString, success: bool, res: QString), } impl Apps { @@ -31,14 +34,14 @@ impl Apps { fn init(&mut self) { let q_thread = self.qt_thread(); RUNTIME.spawn(async move { - let res: anyhow::Result> = async { + let res: anyhow::Result<(Option, IpaTool)> = async { let tool = IpaTool::new_default().await?; - Ok(tool.account_info().await?) + Ok((tool.account_info().await?, tool)) } .await; match res { - Ok(maybe_acc) => { + Ok((maybe_acc, tool)) => { let acc = maybe_acc.unwrap_or_default(); println!("email :{}", acc.email); @@ -49,6 +52,7 @@ impl Apps { q_thread.queue(|t| { t.state = state; + t.ipa_tool = Some(Arc::new(tool)); t.state_changed(); }) } @@ -91,4 +95,37 @@ impl Apps { // Ok(()) // }); } + + // DOES NOTHING IF CALLED BEFORE CALLING `init` + fn search(&mut self, term: QString) { + let Some(tool) = &self.ipa_tool else { + eprintln!("IpaTool not initialized"); + return; + }; + let tool = tool.clone(); + let q_thread = self.qt_thread(); + + RUNTIME.spawn(async move { + let serialized: anyhow::Result = async { + let apps = tool.search(&term.to_string(), 20).await?; + Ok(serde_json::to_string(&apps)?) + } + .await; + + match serialized { + Ok(serialized) => { + println!( + "Search successful for term '{}', result: {}", + term, serialized + ); + q_thread.queue(|s| s.search_ready(term, true, QString::from(serialized))); + } + // FIXME: also return the error + Err(err) => { + println!("Error in ipatool search {}", err.to_string()); + q_thread.queue(|s| s.search_ready(term, false, QString::default())); + } + }; + }); + } }