From 175f5459a892cc3fa9946252aec51feee69b028a Mon Sep 17 00:00:00 2001 From: KeksNino Date: Sun, 3 May 2026 16:55:23 +0200 Subject: [PATCH] feat: create struct from json response and create a table view --- Cargo.lock | 25 +++++++++++++------------ Cargo.toml | 3 ++- src/main.rs | 2 +- src/rutracker.rs | 16 ++++++++++++++++ ui/app-window.slint | 30 +++++++++++++++++++++++++++++- 5 files changed, 61 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5619a69..299944e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,19 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "SoftwareManager-rs" +version = "0.1.0" +dependencies = [ + "reqwest", + "serde", + "serde_derive", + "serde_json", + "slint", + "slint-build", + "tokio", +] + [[package]] name = "ab_glyph" version = "0.2.32" @@ -4669,18 +4682,6 @@ dependencies = [ "spin_on", ] -[[package]] -name = "slint-rust-template" -version = "0.1.0" -dependencies = [ - "reqwest", - "serde", - "serde_json", - "slint", - "slint-build", - "tokio", -] - [[package]] name = "slotmap" version = "1.1.1" diff --git a/Cargo.toml b/Cargo.toml index b8eb19d..ec0c0ca 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,11 +1,12 @@ [package] -name = "slint-rust-template" +name = "SoftwareManager-rs" version = "0.1.0" edition = "2021" [dependencies] reqwest = "0.13.3" serde = "1.0.228" +serde_derive = "1.0.228" serde_json = "1.0.145" slint = "1.14.1" tokio = { version = "1.52.1", features = ["full"] } diff --git a/src/main.rs b/src/main.rs index d26b744..0e0069a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,7 +10,7 @@ fn main() -> Result<(), Box> { ui.on_request_text_input(|text| { println!("User input: {}", text); - let response = rutracker::search(&text); + let _response = rutracker::search(&text); }); ui.run()?; diff --git a/src/rutracker.rs b/src/rutracker.rs index 471320d..993da85 100644 --- a/src/rutracker.rs +++ b/src/rutracker.rs @@ -1,5 +1,16 @@ +use serde_derive::Deserialize; +use serde_derive::Serialize; use serde_json::Value; +#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Software { + pub author: String, + pub leechers: String, + pub seeders: String, + pub title: String, + pub url: String, +} + #[tokio::main] pub async fn search(value: &str) -> Result { let api_url = "https://api.michijackson.xyz/search?q=".to_owned(); @@ -7,6 +18,11 @@ pub async fn search(value: &str) -> Result { let text = results.text().await?; let v: Value = serde_json::from_str(&text).expect("Failed to parse JSON"); let data = &v["data"]; + for item in data.as_array().unwrap() { + let software: Software = + serde_json::from_value(item.clone()).expect("Failed to deserialize"); + println!("{:?}", software); + } println!("{:?}", data); Ok(v) } diff --git a/ui/app-window.slint b/ui/app-window.slint index b5585c5..87a2e34 100644 --- a/ui/app-window.slint +++ b/ui/app-window.slint @@ -1,4 +1,4 @@ -import { Button, LineEdit, VerticalBox } from "std-widgets.slint"; +import { Button, LineEdit, VerticalBox, HorizontalBox, StandardTableView } from "std-widgets.slint"; export component AppWindow inherits Window { width: 200px; @@ -7,13 +7,41 @@ export component AppWindow inherits Window { in-out property search-text: ""; callback request-text-input(string); VerticalBox { + alignment: stretch; + // width: 50%; + // height: 50%; LineEdit { + width: 500px; placeholder-text: "Search for Software"; accepted(text) => { root.request-text-input(self.text); } } + HorizontalBox { + StandardTableView { + // width: 230px; + // height: 200px; + + columns: [ + { title: "Post Title" }, + { title: "Author" }, + { title: "Seeders" }, + { title: "Leechers" }, + ]; + rows: [ + [ + { text: "Item 1" }, { text: "Item 2" }, + ], + [ + { text: "Item 1" }, { text: "Item 2" }, + ], + [ + { text: "Item 1" }, { text: "Item 2" }, + ] + ]; + } } + } }