tauri_plugin_machine_uid/
lib.rs

1use tauri::{
2    Manager, Runtime,
3    plugin::{Builder, TauriPlugin},
4};
5
6pub use models::*;
7
8#[cfg(desktop)]
9mod desktop;
10#[cfg(mobile)]
11mod mobile;
12
13mod commands;
14mod error;
15mod models;
16
17pub use error::{Error, Result};
18
19#[cfg(desktop)]
20use desktop::MachineUid;
21#[cfg(mobile)]
22use mobile::MachineUid;
23
24const PLUGIN_NAME: &str = "machine-uid";
25
26/// Extensions to [`tauri::App`], [`tauri::AppHandle`] and [`tauri::Window`] to access the machine-uid APIs.
27pub trait MachineUidExt<R: Runtime> {
28    fn machine_uid(&self) -> &MachineUid<R>;
29    fn try_machine_uid(&self) -> Option<&MachineUid<R>>;
30}
31
32impl<R: Runtime, T: Manager<R>> crate::MachineUidExt<R> for T {
33    fn machine_uid(&self) -> &MachineUid<R> {
34        self.state::<MachineUid<R>>().inner()
35    }
36    fn try_machine_uid(&self) -> Option<&MachineUid<R>> {
37        self.try_state::<MachineUid<R>>().map(|s| s.inner())
38    }
39}
40
41
42fn builder<R: Runtime>() -> tauri_specta::Builder<R> {
43    tauri_specta::Builder::new()
44        .plugin_name(PLUGIN_NAME)
45        .commands(tauri_specta::collect_commands![
46            commands::get_machine_uid::<tauri::Wry>,
47        ])
48}
49
50/// Initializes the plugin.
51pub fn init<R: Runtime>() -> TauriPlugin<R> {
52    let builder = builder();
53    Builder::new(PLUGIN_NAME)
54        .invoke_handler(builder.invoke_handler())
55        .setup(|app, api| {
56            #[cfg(mobile)]
57            let machine_uid = mobile::init(app, api)?;
58            #[cfg(desktop)]
59            let machine_uid = desktop::init(app, api)?;
60            app.manage(machine_uid);
61            Ok(())
62        })
63        .build()
64}
65
66#[cfg(test)]
67mod test {
68    use super::*;
69
70    #[test]
71    fn export_types() {
72        builder::<tauri::Wry>()
73            .export(
74                specta_typescript::Typescript::default()
75                    .bigint(specta_typescript::BigIntExportBehavior::BigInt)
76                    .formatter(specta_typescript::formatter::prettier)
77                    .header("// @ts-nocheck"),
78                "./bindings.ts",
79            )
80            .expect("failed to export specta types");
81    }
82}