Crates.io | tauri-types |
lib.rs | tauri-types |
version | 0.0.2 |
source | src |
created_at | 2023-08-09 05:45:08.487353 |
updated_at | 2023-08-15 02:31:47.252676 |
description | Type generating macros for Tauri apps |
homepage | https://github.com/Maki325/tauri-types |
repository | https://github.com/Maki325/tauri-types |
max_upload_size | |
id | 939818 |
size | 21,214 |
A small library that translates the types from Rust
to TypeScript
for better integration for the invoke
function from Tauri
.
Tauri Types
to your project.cargo add tauri-types
use tauri_types::TauriType;
#[derive(TauriType)]
struct User {
name: String,
username: String,
password: String,
age: u32,
}
That's going to generate this in your tauri-types.ts
file.
export type User = {
name: string;
username: string;
password: string;
age: number;
};
You can use the type by importing it from the tauri-types.ts
file.
import { type User } from './tauri-types';
tauri_types::command
macro above any function you want to export.#[tauri_types::command]
fn get_user() -> User {
return User {
name: "Marko".to_string(),
username: "Maki325".to_string(),
password: "YoullNeverGuessIt".to_string(),
age: 20,
}
}
(You can export it with use tauri_types::command;
, but it's better to use it this way, so it doesn't collide with the command
macro from tauri
.)
tauri::generate_handler
macro with tauri_types::generate_invoke
....
// .invoke_handler(tauri::generate_handler![
.invoke_handler(tauri_types::generate_invoke![
get_user,
])
.run(tauri::generate_context!())
.expect("error while running tauri application");
...
invoke
from the tauri-types.ts
, instead of directly from tauri
.// import { invoke } from '@tauri-apps/api/tauri';
import { invoke } from './tauri-types';
invoke
.You will need to always use the second argument, even if it's undefined
. I'm still trying to figure out a way to disable that, but for now just set it to undefined
.
Example:
import { invoke } from './tauri-types';
async function main() {
// This **WILL** give a typescript error, for now
// const user = await invoke('get_user');
// This **WILL** work fine
const user = await invoke('get_user', undefined);
console.log('User:', user);
}
namespaces
:#[derive(TauriType)]
#[namespace = "db"]
struct User {
name: String,
username: String,
password: String,
age: u32,
}
That's going to generate this in your tauri-types.ts
file.
export namespace db {
export type User = {
name: string;
username: string;
password: string;
age: number;
};
}
If the type you want is in another namespace
or you want to explicitly type it to something else, you can use this feature.
#[tauri_types::command]
fn get_username(
#[path = "db.User"]
user: User
) -> String {
return user.username;
}
If the type you want is in another namespace
or you want to explicitly type it to something else, you can use this feature.
#[tauri_types::command]
#[return_path = "db.User"]
fn get_user() -> User {
return User {
name: "Marko".to_string(),
username: "Maki325".to_string(),
password: "YoullNeverGuessIt".to_string(),
age: 20,
}
}
If there are any issues, open one in the Issues
tab on GitHub.
Just be sure that there isn't one like yours already opened!
This is a very side project for me, but I'll try to keep it working.