diff --git a/.cargo/config.toml b/.cargo/config.toml deleted file mode 100644 index c971371..0000000 --- a/.cargo/config.toml +++ /dev/null @@ -1,12 +0,0 @@ -[target.x86_64-pc-windows-msvc] -# Increase default stack size to avoid running out of stack -# space in debug builds. The size matches Linux's default. -rustflags = [ - "-C", "link-arg=/STACK:8000000" -] -[target.aarch64-pc-windows-msvc] -# Increase default stack size to avoid running out of stack -# space in debug builds. The size matches Linux's default. -rustflags = [ - "-C", "link-arg=/STACK:8000000" -] diff --git a/src/main.rs b/src/main.rs index adcc551..fb78110 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,7 @@ #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] mod rutracker; -use slint::{ModelRc, StandardListViewItem, VecModel}; -use std::cell::RefCell; +use slint::{Model, ModelRc, StandardListViewItem, VecModel}; use std::error::Error; use std::rc::Rc; @@ -10,54 +9,37 @@ slint::include_modules!(); fn main() -> Result<(), Box> { let ui = AppWindow::new()?; - let response = Rc::new(RefCell::new(None)); - let items = Rc::new(RefCell::new(Vec::::new())); + let items = Rc::new(VecModel::::from(Vec::new())); - let value = items.clone(); + let items_clone = items.clone(); ui.on_request_text_input(move |text| { println!("User input: {}", text); - *response.borrow_mut() = Some(rutracker::search(&text)); - //let response = rutracker::search(&text); - let response = response.borrow(); + let response = rutracker::search(&text); - let new_items: Vec = response - .iter() - .map(|r| { - let text = match r { - Ok(value) => value.to_string(), - Err(err) => format!("Error: {}", err), - }; - StandardListViewItem::from(text.as_str()) - }) - .collect(); + let new_items: Vec = match response { + Ok(softwares) => softwares + .into_iter() + .map(|s| StandardListViewItem::from(s.title.as_str())) + .collect(), - *value.borrow_mut() = new_items; + Err(e) => vec![StandardListViewItem::from(format!("Error: {}", e).as_str())], + }; + + items_clone.set_vec(new_items); }); - let table_vec: Vec> = vec![]; - let table_model = Rc::new(VecModel::from(table_vec)); + let table_model = Rc::new(VecModel::from(Vec::>::new())); + let items_clone = items.clone(); - ui.set_table_data(table_model.to_owned().into()); + ui.set_table_data(table_model.clone().into()); ui.on_add_row({ - //let response = response.clone(); - //move || { - // if let Some(_resp) = items.borrow().as_ref() { - // table_model.push(VecModel::from_slice(&[StandardListViewItem::from( - // //slint::SharedString::from(_resp), - // StandardListViewItem::from(_resp), - // )])); - // } - let items = items.clone(); move || { - let items = items.borrow(); - for item in items.iter() { - table_model.push(VecModel::from_slice(&[item.clone()])); + for item in items_clone.iter() { + table_model.push(ModelRc::new(VecModel::from_slice(&[item.clone()]))); } } }); - ui.run().unwrap(); - ui.run()?; Ok(()) diff --git a/src/rutracker.rs b/src/rutracker.rs index d41ee22..2e940f3 100644 --- a/src/rutracker.rs +++ b/src/rutracker.rs @@ -12,17 +12,25 @@ pub struct Software { } #[tokio::main] -pub async fn search(value: &str) -> Result { +//pub async fn search(value: &str) -> Result { +pub async fn search(value: &str) -> Result, reqwest::Error> { let api_url = "https://api.michijackson.xyz/search?q=".to_owned(); let results = reqwest::get(api_url + value).await?; let text = results.text().await?; + let v: Value = serde_json::from_str(&text).expect("Failed to parse JSON"); let data = &v["data"]; + + let mut software_list: Vec = Vec::new(); + for item in data.as_array().unwrap() { let software: Software = serde_json::from_value(item.clone()).expect("Failed to deserialize"); println!("{:?}", software); + + software_list.push(software); } //println!("{:?}", data); - Ok(v) + //Ok(v) + Ok(software_list) }