2023-02-19 16:17:49 +03:00
|
|
|
// Copyright 2019-2023 Tauri Programme within The Commons Conservancy
|
2021-05-02 21:34:15 +03:00
|
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
|
2023-02-18 22:23:09 +03:00
|
|
|
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
|
2021-05-02 21:34:15 +03:00
|
|
|
|
2021-05-05 20:32:13 +03:00
|
|
|
// we move some basic commands to a separate module just to show it works
|
|
|
|
mod commands;
|
2021-05-12 18:56:16 +03:00
|
|
|
use commands::{cmd, invoke, message, resolver};
|
2021-05-05 20:32:13 +03:00
|
|
|
|
|
|
|
use serde::Deserialize;
|
2023-08-10 16:12:38 +03:00
|
|
|
use tauri::{
|
|
|
|
command,
|
|
|
|
ipc::{Request, Response},
|
|
|
|
State, Window,
|
|
|
|
};
|
2021-05-05 20:32:13 +03:00
|
|
|
|
2021-05-02 21:34:15 +03:00
|
|
|
#[derive(Debug)]
|
2021-05-05 20:32:13 +03:00
|
|
|
pub struct MyState {
|
2021-09-21 16:24:48 +03:00
|
|
|
#[allow(dead_code)]
|
2021-05-02 21:34:15 +03:00
|
|
|
value: u64,
|
2021-09-21 16:24:48 +03:00
|
|
|
#[allow(dead_code)]
|
2021-05-02 21:34:15 +03:00
|
|
|
label: String,
|
|
|
|
}
|
|
|
|
|
2021-05-09 14:52:20 +03:00
|
|
|
#[derive(Debug, serde::Serialize)]
|
|
|
|
enum MyError {
|
|
|
|
FooError,
|
|
|
|
}
|
|
|
|
|
2021-05-05 20:32:13 +03:00
|
|
|
// ------------------------ Commands using Window ------------------------
|
|
|
|
#[command]
|
2021-05-11 20:32:11 +03:00
|
|
|
fn window_label(window: Window) {
|
2021-05-05 20:32:13 +03:00
|
|
|
println!("window label: {}", window.label());
|
2021-05-02 21:34:15 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// Async commands
|
|
|
|
|
2021-05-05 20:32:13 +03:00
|
|
|
#[command]
|
2022-09-28 19:52:18 +03:00
|
|
|
async fn async_simple_command(the_argument: String) {
|
2022-12-15 23:56:23 +03:00
|
|
|
println!("{the_argument}");
|
2022-09-28 19:52:18 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
#[command(rename_all = "snake_case")]
|
|
|
|
async fn async_simple_command_snake(the_argument: String) {
|
2022-12-15 23:56:23 +03:00
|
|
|
println!("{the_argument}");
|
2021-05-02 21:34:15 +03:00
|
|
|
}
|
|
|
|
|
2021-05-05 20:32:13 +03:00
|
|
|
#[command]
|
2021-05-09 14:52:20 +03:00
|
|
|
async fn async_stateful_command(
|
2022-09-28 19:52:18 +03:00
|
|
|
the_argument: Option<String>,
|
2021-05-09 14:52:20 +03:00
|
|
|
state: State<'_, MyState>,
|
|
|
|
) -> Result<(), ()> {
|
2022-09-28 19:52:18 +03:00
|
|
|
println!("{:?} {:?}", the_argument, state.inner());
|
2021-05-09 14:52:20 +03:00
|
|
|
Ok(())
|
2021-05-02 21:34:15 +03:00
|
|
|
}
|
2022-09-28 19:52:18 +03:00
|
|
|
// ------------------------ Raw future commands ------------------------
|
2021-05-02 21:34:15 +03:00
|
|
|
|
2021-05-09 14:52:20 +03:00
|
|
|
#[command(async)]
|
2022-09-28 19:52:18 +03:00
|
|
|
fn future_simple_command(the_argument: String) -> impl std::future::Future<Output = ()> {
|
2022-12-15 23:56:23 +03:00
|
|
|
println!("{the_argument}");
|
2021-05-09 14:52:20 +03:00
|
|
|
std::future::ready(())
|
|
|
|
}
|
|
|
|
|
|
|
|
#[command(async)]
|
|
|
|
fn future_simple_command_with_return(
|
2022-09-28 19:52:18 +03:00
|
|
|
the_argument: String,
|
2021-05-09 14:52:20 +03:00
|
|
|
) -> impl std::future::Future<Output = String> {
|
2022-12-15 23:56:23 +03:00
|
|
|
println!("{the_argument}");
|
2022-09-28 19:52:18 +03:00
|
|
|
std::future::ready(the_argument)
|
2021-05-09 14:52:20 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
#[command(async)]
|
|
|
|
fn future_simple_command_with_result(
|
2022-09-28 19:52:18 +03:00
|
|
|
the_argument: String,
|
2021-05-09 14:52:20 +03:00
|
|
|
) -> impl std::future::Future<Output = Result<String, ()>> {
|
2022-12-15 23:56:23 +03:00
|
|
|
println!("{the_argument}");
|
2022-09-28 19:52:18 +03:00
|
|
|
std::future::ready(Ok(the_argument))
|
2021-05-09 14:52:20 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
#[command(async)]
|
2022-09-28 19:52:18 +03:00
|
|
|
fn force_async(the_argument: String) -> String {
|
|
|
|
the_argument
|
2021-05-09 14:52:20 +03:00
|
|
|
}
|
2021-05-02 21:34:15 +03:00
|
|
|
|
2021-05-09 14:52:20 +03:00
|
|
|
#[command(async)]
|
2022-09-28 19:52:18 +03:00
|
|
|
fn force_async_with_result(the_argument: &str) -> Result<&str, MyError> {
|
|
|
|
(!the_argument.is_empty())
|
2023-01-29 21:08:27 +03:00
|
|
|
.then_some(the_argument)
|
2022-09-28 19:52:18 +03:00
|
|
|
.ok_or(MyError::FooError)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ------------------------ Raw future commands - snake_case ------------------------
|
|
|
|
|
|
|
|
#[command(async, rename_all = "snake_case")]
|
|
|
|
fn future_simple_command_snake(the_argument: String) -> impl std::future::Future<Output = ()> {
|
2022-12-15 23:56:23 +03:00
|
|
|
println!("{the_argument}");
|
2022-09-28 19:52:18 +03:00
|
|
|
std::future::ready(())
|
|
|
|
}
|
|
|
|
|
|
|
|
#[command(async, rename_all = "snake_case")]
|
|
|
|
fn future_simple_command_with_return_snake(
|
|
|
|
the_argument: String,
|
|
|
|
) -> impl std::future::Future<Output = String> {
|
2022-12-15 23:56:23 +03:00
|
|
|
println!("{the_argument}");
|
2022-09-28 19:52:18 +03:00
|
|
|
std::future::ready(the_argument)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[command(async, rename_all = "snake_case")]
|
|
|
|
fn future_simple_command_with_result_snake(
|
|
|
|
the_argument: String,
|
|
|
|
) -> impl std::future::Future<Output = Result<String, ()>> {
|
2022-12-15 23:56:23 +03:00
|
|
|
println!("{the_argument}");
|
2022-09-28 19:52:18 +03:00
|
|
|
std::future::ready(Ok(the_argument))
|
|
|
|
}
|
|
|
|
|
|
|
|
#[command(async, rename_all = "snake_case")]
|
|
|
|
fn force_async_snake(the_argument: String) -> String {
|
|
|
|
the_argument
|
|
|
|
}
|
|
|
|
|
|
|
|
#[command(rename_all = "snake_case", async)]
|
|
|
|
fn force_async_with_result_snake(the_argument: &str) -> Result<&str, MyError> {
|
|
|
|
(!the_argument.is_empty())
|
2023-01-29 21:08:27 +03:00
|
|
|
.then_some(the_argument)
|
2021-05-09 14:52:20 +03:00
|
|
|
.ok_or(MyError::FooError)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ------------------------ Commands returning Result ------------------------
|
2021-05-02 21:34:15 +03:00
|
|
|
|
2021-05-05 20:32:13 +03:00
|
|
|
#[command]
|
2022-09-28 19:52:18 +03:00
|
|
|
fn simple_command_with_result(the_argument: String) -> Result<String, MyError> {
|
2022-12-15 23:56:23 +03:00
|
|
|
println!("{the_argument}");
|
2022-09-28 19:52:18 +03:00
|
|
|
(!the_argument.is_empty())
|
2023-01-29 21:08:27 +03:00
|
|
|
.then_some(the_argument)
|
2021-05-09 14:52:20 +03:00
|
|
|
.ok_or(MyError::FooError)
|
2021-05-02 21:34:15 +03:00
|
|
|
}
|
|
|
|
|
2021-05-05 20:32:13 +03:00
|
|
|
#[command]
|
2021-05-02 21:34:15 +03:00
|
|
|
fn stateful_command_with_result(
|
2022-09-28 19:52:18 +03:00
|
|
|
the_argument: Option<String>,
|
|
|
|
state: State<'_, MyState>,
|
|
|
|
) -> Result<String, MyError> {
|
|
|
|
println!("{:?} {:?}", the_argument, state.inner());
|
|
|
|
dbg!(the_argument.ok_or(MyError::FooError))
|
|
|
|
}
|
|
|
|
|
|
|
|
// ------------------------ Commands returning Result - snake_case ------------------------
|
|
|
|
|
|
|
|
#[command(rename_all = "snake_case")]
|
|
|
|
fn simple_command_with_result_snake(the_argument: String) -> Result<String, MyError> {
|
2022-12-15 23:56:23 +03:00
|
|
|
println!("{the_argument}");
|
2022-09-28 19:52:18 +03:00
|
|
|
(!the_argument.is_empty())
|
2023-01-29 21:08:27 +03:00
|
|
|
.then_some(the_argument)
|
2022-09-28 19:52:18 +03:00
|
|
|
.ok_or(MyError::FooError)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[command(rename_all = "snake_case")]
|
|
|
|
fn stateful_command_with_result_snake(
|
|
|
|
the_argument: Option<String>,
|
2021-05-05 20:32:13 +03:00
|
|
|
state: State<'_, MyState>,
|
2021-05-09 14:52:20 +03:00
|
|
|
) -> Result<String, MyError> {
|
2022-09-28 19:52:18 +03:00
|
|
|
println!("{:?} {:?}", the_argument, state.inner());
|
|
|
|
dbg!(the_argument.ok_or(MyError::FooError))
|
2021-05-02 21:34:15 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// Async commands
|
|
|
|
|
2021-05-05 20:32:13 +03:00
|
|
|
#[command]
|
2022-09-28 19:52:18 +03:00
|
|
|
async fn async_simple_command_with_result(the_argument: String) -> Result<String, MyError> {
|
2022-12-15 23:56:23 +03:00
|
|
|
println!("{the_argument}");
|
2022-09-28 19:52:18 +03:00
|
|
|
Ok(the_argument)
|
2021-05-02 21:34:15 +03:00
|
|
|
}
|
|
|
|
|
2021-05-05 20:32:13 +03:00
|
|
|
#[command]
|
2021-05-02 21:34:15 +03:00
|
|
|
async fn async_stateful_command_with_result(
|
2022-09-28 19:52:18 +03:00
|
|
|
the_argument: Option<String>,
|
2021-05-05 20:32:13 +03:00
|
|
|
state: State<'_, MyState>,
|
2021-05-09 14:52:20 +03:00
|
|
|
) -> Result<String, MyError> {
|
2022-09-28 19:52:18 +03:00
|
|
|
println!("{:?} {:?}", the_argument, state.inner());
|
2022-11-04 00:01:47 +03:00
|
|
|
Ok(the_argument.unwrap_or_default())
|
2021-05-02 21:34:15 +03:00
|
|
|
}
|
|
|
|
|
2021-05-05 20:32:13 +03:00
|
|
|
// Non-Ident command function arguments
|
|
|
|
|
|
|
|
#[command]
|
2021-07-15 13:05:29 +03:00
|
|
|
fn command_arguments_wild(_: Window) {
|
2021-05-05 20:32:13 +03:00
|
|
|
println!("we saw the wildcard!")
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Deserialize)]
|
|
|
|
struct Person<'a> {
|
|
|
|
name: &'a str,
|
|
|
|
age: u8,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[command]
|
2021-10-22 16:04:42 +03:00
|
|
|
fn command_arguments_struct(Person { name, age }: Person<'_>) {
|
2022-12-15 23:56:23 +03:00
|
|
|
println!("received person struct with name: {name} | age: {age}")
|
2021-05-05 20:32:13 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Deserialize)]
|
|
|
|
struct InlinePerson<'a>(&'a str, u8);
|
|
|
|
|
|
|
|
#[command]
|
2021-10-22 16:04:42 +03:00
|
|
|
fn command_arguments_tuple_struct(InlinePerson(name, age): InlinePerson<'_>) {
|
2022-12-15 23:56:23 +03:00
|
|
|
println!("received person tuple with name: {name} | age: {age}")
|
2021-05-05 20:32:13 +03:00
|
|
|
}
|
|
|
|
|
2021-05-09 14:52:20 +03:00
|
|
|
#[command]
|
2022-09-28 19:52:18 +03:00
|
|
|
fn borrow_cmd(the_argument: &str) -> &str {
|
|
|
|
the_argument
|
2021-05-09 14:52:20 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
#[command]
|
2022-09-28 19:52:18 +03:00
|
|
|
fn borrow_cmd_async(the_argument: &str) -> &str {
|
|
|
|
the_argument
|
2021-05-09 14:52:20 +03:00
|
|
|
}
|
|
|
|
|
2023-08-10 16:12:38 +03:00
|
|
|
#[command]
|
|
|
|
fn raw_request(request: Request<'_>) -> Response {
|
|
|
|
println!("{:?}", request);
|
|
|
|
Response::new(include_bytes!("./README.md").to_vec())
|
|
|
|
}
|
|
|
|
|
2021-05-02 21:34:15 +03:00
|
|
|
fn main() {
|
|
|
|
tauri::Builder::default()
|
|
|
|
.manage(MyState {
|
|
|
|
value: 0,
|
|
|
|
label: "Tauri!".into(),
|
|
|
|
})
|
|
|
|
.invoke_handler(tauri::generate_handler![
|
2021-05-09 14:52:20 +03:00
|
|
|
borrow_cmd,
|
|
|
|
borrow_cmd_async,
|
2023-08-10 16:12:38 +03:00
|
|
|
raw_request,
|
2021-05-05 20:32:13 +03:00
|
|
|
window_label,
|
2021-05-09 14:52:20 +03:00
|
|
|
force_async,
|
|
|
|
force_async_with_result,
|
2021-05-05 20:32:13 +03:00
|
|
|
commands::simple_command,
|
|
|
|
commands::stateful_command,
|
2021-05-12 17:17:33 +03:00
|
|
|
cmd,
|
2021-05-12 18:22:05 +03:00
|
|
|
invoke,
|
2021-05-12 18:56:16 +03:00
|
|
|
message,
|
|
|
|
resolver,
|
2021-05-02 21:34:15 +03:00
|
|
|
async_simple_command,
|
2021-05-09 14:52:20 +03:00
|
|
|
future_simple_command,
|
2021-05-02 21:34:15 +03:00
|
|
|
async_stateful_command,
|
2021-05-05 20:32:13 +03:00
|
|
|
command_arguments_wild,
|
|
|
|
command_arguments_struct,
|
2021-05-02 21:34:15 +03:00
|
|
|
simple_command_with_result,
|
2022-09-28 19:52:18 +03:00
|
|
|
async_simple_command_snake,
|
|
|
|
future_simple_command_snake,
|
|
|
|
future_simple_command_with_return_snake,
|
|
|
|
future_simple_command_with_result_snake,
|
|
|
|
force_async_snake,
|
|
|
|
force_async_with_result_snake,
|
|
|
|
simple_command_with_result_snake,
|
|
|
|
stateful_command_with_result_snake,
|
2021-05-02 21:34:15 +03:00
|
|
|
stateful_command_with_result,
|
2021-05-05 20:32:13 +03:00
|
|
|
command_arguments_tuple_struct,
|
2021-05-02 21:34:15 +03:00
|
|
|
async_simple_command_with_result,
|
2021-05-09 14:52:20 +03:00
|
|
|
future_simple_command_with_return,
|
|
|
|
future_simple_command_with_result,
|
2021-05-05 20:32:13 +03:00
|
|
|
async_stateful_command_with_result,
|
2021-05-02 21:34:15 +03:00
|
|
|
])
|
2022-07-04 02:26:32 +03:00
|
|
|
.run(tauri::generate_context!(
|
|
|
|
"../../examples/commands/tauri.conf.json"
|
|
|
|
))
|
2021-05-02 21:34:15 +03:00
|
|
|
.expect("error while running tauri application");
|
|
|
|
}
|