From 2b4b7b68621b78119fe9cc3809e5271866060753 Mon Sep 17 00:00:00 2001 From: lanyeeee Date: Wed, 9 Jul 2025 05:28:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=BC=95=E5=85=A5`tauri-specta`?= =?UTF-8?q?=E6=9D=A5=E4=BF=9D=E8=AF=81=E7=B1=BB=E5=9E=8B=E5=AE=89=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/Cargo.lock | 89 ++++++++++++++++++++++++++++++++++++++++++++ src-tauri/Cargo.toml | 3 ++ src-tauri/src/lib.rs | 20 +++++++++- src/App.vue | 4 +- src/bindings.ts | 83 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 196 insertions(+), 3 deletions(-) create mode 100644 src/bindings.ts diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index a1dab8e..0ebb125 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" + [[package]] name = "addr2line" version = "0.24.2" @@ -263,9 +269,12 @@ version = "0.1.0" dependencies = [ "serde", "serde_json", + "specta", + "specta-typescript", "tauri", "tauri-build", "tauri-plugin-opener", + "tauri-specta", ] [[package]] @@ -2449,6 +2458,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "pathdiff" version = "0.2.3" @@ -3374,6 +3389,51 @@ dependencies = [ "system-deps", ] +[[package]] +name = "specta" +version = "2.0.0-rc.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ccbb212565d2dc177bc15ecb7b039d66c4490da892436a4eee5b394d620c9bc" +dependencies = [ + "paste", + "serde_json", + "specta-macros", + "thiserror 1.0.69", +] + +[[package]] +name = "specta-macros" +version = "2.0.0-rc.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68999d29816965eb9e5201f60aec02a76512139811661a7e8e653abc810b8f72" +dependencies = [ + "Inflector", + "proc-macro2", + "quote", + "syn 2.0.104", +] + +[[package]] +name = "specta-serde" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12260cbb21abb2e83a0375b1521867910e3aed8a7afa782206150ce552cd2e5a" +dependencies = [ + "specta", + "thiserror 1.0.69", +] + +[[package]] +name = "specta-typescript" +version = "0.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4472229365ceb6395487e3a60d921ad8e21f9ad06eaecc396f098902c9adc" +dependencies = [ + "specta", + "specta-serde", + "thiserror 1.0.69", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -3572,6 +3632,7 @@ dependencies = [ "serde_json", "serde_repr", "serialize-to-javascript", + "specta", "swift-rs", "tauri-build", "tauri-macros", @@ -3740,6 +3801,34 @@ dependencies = [ "wry", ] +[[package]] +name = "tauri-specta" +version = "2.0.0-rc.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d06336a2fa3ead0c8d08719e78cbc1fb73650845789605bd2ab908cbde72815" +dependencies = [ + "heck 0.5.0", + "serde", + "serde_json", + "specta", + "specta-typescript", + "tauri", + "tauri-specta-macros", + "thiserror 1.0.69", +] + +[[package]] +name = "tauri-specta-macros" +version = "2.0.0-rc.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a4aa93823e07859546aa796b8a5d608190cd8037a3a5dce3eb63d491c34bda8" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "tauri-utils" version = "2.5.0" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 4af9575..d6f16c4 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -23,3 +23,6 @@ tauri-plugin-opener = "2" serde = { version = "1", features = ["derive"] } serde_json = "1" +specta = { version = "=2.0.0-rc.20", features = ["serde_json"] } +tauri-specta = { version = "=2.0.0-rc.20", features = ["derive", "typescript"] } +specta-typescript = { version = "=0.0.7" } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 4a277ef..82e63a4 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1,14 +1,32 @@ +use tauri::Wry; + // Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ #[tauri::command] +#[specta::specta] fn greet(name: &str) -> String { format!("Hello, {}! You've been greeted from Rust!", name) } #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { + let builder = tauri_specta::Builder::::new() + .commands(tauri_specta::collect_commands![greet]) + .events(tauri_specta::collect_events![]); + + #[cfg(debug_assertions)] + builder + .export( + specta_typescript::Typescript::default() + .bigint(specta_typescript::BigIntExportBehavior::Number) + .formatter(specta_typescript::formatter::prettier) + .header("// @ts-nocheck"), // disable typescript checks + "../src/bindings.ts", + ) + .expect("Failed to export typescript bindings"); + tauri::Builder::default() .plugin(tauri_plugin_opener::init()) - .invoke_handler(tauri::generate_handler![greet]) + .invoke_handler(builder.invoke_handler()) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/src/App.vue b/src/App.vue index ae2a1a8..0d67b22 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,13 +1,13 @@