Files
tauri/examples/commands/main.rs
Lucas Fernandes Nogueira 8f71640250 fix: CEF CI (#14953)
* fix: CEF CI

* fmt

* update to rust 1.88, edition 2024

* install x86_64-apple-darwin

* linux clippy

* fix --all-features

* more all-features fixes

* install x86 apple

* fix windows

* fix doc tests

* skip --all-featuress test for android and ios

* more clippy fixes

* install target

* fix build, clippy

* export cef for tests

* pin version

* fix arg
2026-02-18 11:24:11 -03:00

276 lines
7.0 KiB
Rust

// Copyright 2019-2024 Tauri Programme within The Commons Conservancy
// SPDX-License-Identifier: Apache-2.0
// SPDX-License-Identifier: MIT
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
// we move some basic commands to a separate module just to show it works
mod commands;
use commands::{cmd, invoke, message, resolver};
use serde::Deserialize;
use tauri::{
Runtime, State, Window, command,
ipc::{Request, Response},
};
#[derive(Debug)]
pub struct MyState {
#[allow(dead_code)]
value: u64,
#[allow(dead_code)]
label: String,
}
#[derive(Debug, serde::Serialize)]
enum MyError {
FooError,
}
// ------------------------ Commands using Window ------------------------
#[command]
fn window_label<R: Runtime>(window: Window<R>) {
println!("window label: {}", window.label());
}
// Async commands
#[command]
async fn async_simple_command(the_argument: String) {
println!("{the_argument}");
}
#[command(rename_all = "snake_case")]
async fn async_simple_command_snake(the_argument: String) {
println!("{the_argument}");
}
#[command]
async fn async_stateful_command(
the_argument: Option<String>,
state: State<'_, MyState>,
) -> Result<(), ()> {
println!("{:?} {:?}", the_argument, state.inner());
Ok(())
}
// ------------------------ Raw future commands ------------------------
#[command(async)]
fn future_simple_command(the_argument: String) -> impl std::future::Future<Output = ()> {
println!("{the_argument}");
std::future::ready(())
}
#[command(async)]
fn future_simple_command_with_return(
the_argument: String,
) -> impl std::future::Future<Output = String> {
println!("{the_argument}");
std::future::ready(the_argument)
}
#[command(async)]
fn future_simple_command_with_result(
the_argument: String,
) -> impl std::future::Future<Output = Result<String, ()>> {
println!("{the_argument}");
std::future::ready(Ok(the_argument))
}
#[command(async)]
fn force_async(the_argument: String) -> String {
the_argument
}
#[command(async)]
fn force_async_with_result(the_argument: &str) -> Result<&str, MyError> {
(!the_argument.is_empty())
.then_some(the_argument)
.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 = ()> {
println!("{the_argument}");
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> {
println!("{the_argument}");
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, ()>> {
println!("{the_argument}");
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())
.then_some(the_argument)
.ok_or(MyError::FooError)
}
// ------------------------ Commands returning Result ------------------------
#[command]
fn simple_command_with_result(the_argument: String) -> Result<String, MyError> {
println!("{the_argument}");
(!the_argument.is_empty())
.then_some(the_argument)
.ok_or(MyError::FooError)
}
#[command]
fn stateful_command_with_result(
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> {
println!("{the_argument}");
(!the_argument.is_empty())
.then_some(the_argument)
.ok_or(MyError::FooError)
}
#[command(rename_all = "snake_case")]
fn stateful_command_with_result_snake(
the_argument: Option<String>,
state: State<'_, MyState>,
) -> Result<String, MyError> {
println!("{:?} {:?}", the_argument, state.inner());
dbg!(the_argument.ok_or(MyError::FooError))
}
// Async commands
#[command]
async fn async_simple_command_with_result(the_argument: String) -> Result<String, MyError> {
println!("{the_argument}");
Ok(the_argument)
}
#[command]
async fn async_stateful_command_with_result(
the_argument: Option<String>,
state: State<'_, MyState>,
) -> Result<String, MyError> {
println!("{:?} {:?}", the_argument, state.inner());
Ok(the_argument.unwrap_or_default())
}
// Non-Ident command function arguments
#[command]
fn command_arguments_wild<R: Runtime>(_: Window<R>) {
println!("we saw the wildcard!")
}
#[derive(Deserialize)]
struct Person<'a> {
name: &'a str,
age: u8,
}
#[command]
fn command_arguments_struct(Person { name, age }: Person<'_>) {
println!("received person struct with name: {name} | age: {age}")
}
#[derive(Deserialize)]
struct InlinePerson<'a>(&'a str, u8);
#[command]
fn command_arguments_tuple_struct(InlinePerson(name, age): InlinePerson<'_>) {
println!("received person tuple with name: {name} | age: {age}")
}
#[command]
fn borrow_cmd(the_argument: &str) -> &str {
the_argument
}
#[command]
fn borrow_cmd_async(the_argument: &str) -> &str {
the_argument
}
#[command]
fn raw_request(request: Request<'_>) -> Response {
println!("{request:?}");
Response::new(include_bytes!("./README.md").to_vec())
}
#[cfg_attr(feature = "cef", tauri::cef_entry_point)]
fn main() {
#[cfg(feature = "cef")]
let builder = tauri::Builder::<tauri::Cef>::default();
#[cfg(not(feature = "cef"))]
let builder = tauri::Builder::<tauri::Wry>::new();
builder
.manage(MyState {
value: 0,
label: "Tauri!".into(),
})
.invoke_handler(tauri::generate_handler![
borrow_cmd,
borrow_cmd_async,
raw_request,
window_label,
force_async,
force_async_with_result,
commands::simple_command,
commands::stateful_command,
cmd,
invoke,
message,
resolver,
async_simple_command,
future_simple_command,
async_stateful_command,
command_arguments_wild,
command_arguments_struct,
simple_command_with_result,
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,
stateful_command_with_result,
command_arguments_tuple_struct,
async_simple_command_with_result,
future_simple_command_with_return,
future_simple_command_with_result,
async_stateful_command_with_result,
])
.run(tauri::generate_context!(
"../../examples/commands/tauri.conf.json"
))
.expect("error while running tauri application");
}