main.rs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. // Copyright 2019-2024 Tauri Programme within The Commons Conservancy
  2. // SPDX-License-Identifier: Apache-2.0
  3. // SPDX-License-Identifier: MIT
  4. #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
  5. // we move some basic commands to a separate module just to show it works
  6. mod commands;
  7. use commands::{cmd, invoke, message, resolver};
  8. use serde::Deserialize;
  9. use tauri::{
  10. command,
  11. ipc::{Request, Response},
  12. State, Window,
  13. };
  14. #[derive(Debug)]
  15. pub struct MyState {
  16. #[allow(dead_code)]
  17. value: u64,
  18. #[allow(dead_code)]
  19. label: String,
  20. }
  21. #[derive(Debug, serde::Serialize)]
  22. enum MyError {
  23. FooError,
  24. }
  25. // ------------------------ Commands using Window ------------------------
  26. #[command]
  27. fn window_label(window: Window) {
  28. println!("window label: {}", window.label());
  29. }
  30. // Async commands
  31. #[command]
  32. async fn async_simple_command(the_argument: String) {
  33. println!("{the_argument}");
  34. }
  35. #[command(rename_all = "snake_case")]
  36. async fn async_simple_command_snake(the_argument: String) {
  37. println!("{the_argument}");
  38. }
  39. #[command]
  40. async fn async_stateful_command(
  41. the_argument: Option<String>,
  42. state: State<'_, MyState>,
  43. ) -> Result<(), ()> {
  44. println!("{:?} {:?}", the_argument, state.inner());
  45. Ok(())
  46. }
  47. // ------------------------ Raw future commands ------------------------
  48. #[command(async)]
  49. fn future_simple_command(the_argument: String) -> impl std::future::Future<Output = ()> {
  50. println!("{the_argument}");
  51. std::future::ready(())
  52. }
  53. #[command(async)]
  54. fn future_simple_command_with_return(
  55. the_argument: String,
  56. ) -> impl std::future::Future<Output = String> {
  57. println!("{the_argument}");
  58. std::future::ready(the_argument)
  59. }
  60. #[command(async)]
  61. fn future_simple_command_with_result(
  62. the_argument: String,
  63. ) -> impl std::future::Future<Output = Result<String, ()>> {
  64. println!("{the_argument}");
  65. std::future::ready(Ok(the_argument))
  66. }
  67. #[command(async)]
  68. fn force_async(the_argument: String) -> String {
  69. the_argument
  70. }
  71. #[command(async)]
  72. fn force_async_with_result(the_argument: &str) -> Result<&str, MyError> {
  73. (!the_argument.is_empty())
  74. .then_some(the_argument)
  75. .ok_or(MyError::FooError)
  76. }
  77. // ------------------------ Raw future commands - snake_case ------------------------
  78. #[command(async, rename_all = "snake_case")]
  79. fn future_simple_command_snake(the_argument: String) -> impl std::future::Future<Output = ()> {
  80. println!("{the_argument}");
  81. std::future::ready(())
  82. }
  83. #[command(async, rename_all = "snake_case")]
  84. fn future_simple_command_with_return_snake(
  85. the_argument: String,
  86. ) -> impl std::future::Future<Output = String> {
  87. println!("{the_argument}");
  88. std::future::ready(the_argument)
  89. }
  90. #[command(async, rename_all = "snake_case")]
  91. fn future_simple_command_with_result_snake(
  92. the_argument: String,
  93. ) -> impl std::future::Future<Output = Result<String, ()>> {
  94. println!("{the_argument}");
  95. std::future::ready(Ok(the_argument))
  96. }
  97. #[command(async, rename_all = "snake_case")]
  98. fn force_async_snake(the_argument: String) -> String {
  99. the_argument
  100. }
  101. #[command(rename_all = "snake_case", async)]
  102. fn force_async_with_result_snake(the_argument: &str) -> Result<&str, MyError> {
  103. (!the_argument.is_empty())
  104. .then_some(the_argument)
  105. .ok_or(MyError::FooError)
  106. }
  107. // ------------------------ Commands returning Result ------------------------
  108. #[command]
  109. fn simple_command_with_result(the_argument: String) -> Result<String, MyError> {
  110. println!("{the_argument}");
  111. (!the_argument.is_empty())
  112. .then_some(the_argument)
  113. .ok_or(MyError::FooError)
  114. }
  115. #[command]
  116. fn stateful_command_with_result(
  117. the_argument: Option<String>,
  118. state: State<'_, MyState>,
  119. ) -> Result<String, MyError> {
  120. println!("{:?} {:?}", the_argument, state.inner());
  121. dbg!(the_argument.ok_or(MyError::FooError))
  122. }
  123. // ------------------------ Commands returning Result - snake_case ------------------------
  124. #[command(rename_all = "snake_case")]
  125. fn simple_command_with_result_snake(the_argument: String) -> Result<String, MyError> {
  126. println!("{the_argument}");
  127. (!the_argument.is_empty())
  128. .then_some(the_argument)
  129. .ok_or(MyError::FooError)
  130. }
  131. #[command(rename_all = "snake_case")]
  132. fn stateful_command_with_result_snake(
  133. the_argument: Option<String>,
  134. state: State<'_, MyState>,
  135. ) -> Result<String, MyError> {
  136. println!("{:?} {:?}", the_argument, state.inner());
  137. dbg!(the_argument.ok_or(MyError::FooError))
  138. }
  139. // Async commands
  140. #[command]
  141. async fn async_simple_command_with_result(the_argument: String) -> Result<String, MyError> {
  142. println!("{the_argument}");
  143. Ok(the_argument)
  144. }
  145. #[command]
  146. async fn async_stateful_command_with_result(
  147. the_argument: Option<String>,
  148. state: State<'_, MyState>,
  149. ) -> Result<String, MyError> {
  150. println!("{:?} {:?}", the_argument, state.inner());
  151. Ok(the_argument.unwrap_or_default())
  152. }
  153. // Non-Ident command function arguments
  154. #[command]
  155. fn command_arguments_wild(_: Window) {
  156. println!("we saw the wildcard!")
  157. }
  158. #[derive(Deserialize)]
  159. struct Person<'a> {
  160. name: &'a str,
  161. age: u8,
  162. }
  163. #[command]
  164. fn command_arguments_struct(Person { name, age }: Person<'_>) {
  165. println!("received person struct with name: {name} | age: {age}")
  166. }
  167. #[derive(Deserialize)]
  168. struct InlinePerson<'a>(&'a str, u8);
  169. #[command]
  170. fn command_arguments_tuple_struct(InlinePerson(name, age): InlinePerson<'_>) {
  171. println!("received person tuple with name: {name} | age: {age}")
  172. }
  173. #[command]
  174. fn borrow_cmd(the_argument: &str) -> &str {
  175. the_argument
  176. }
  177. #[command]
  178. fn borrow_cmd_async(the_argument: &str) -> &str {
  179. the_argument
  180. }
  181. #[command]
  182. fn raw_request(request: Request<'_>) -> Response {
  183. println!("{request:?}");
  184. Response::new(include_bytes!("./README.md").to_vec())
  185. }
  186. fn main() {
  187. tauri::Builder::default()
  188. .manage(MyState {
  189. value: 0,
  190. label: "Tauri!".into(),
  191. })
  192. .invoke_handler(tauri::generate_handler![
  193. borrow_cmd,
  194. borrow_cmd_async,
  195. raw_request,
  196. window_label,
  197. force_async,
  198. force_async_with_result,
  199. commands::simple_command,
  200. commands::stateful_command,
  201. cmd,
  202. invoke,
  203. message,
  204. resolver,
  205. async_simple_command,
  206. future_simple_command,
  207. async_stateful_command,
  208. command_arguments_wild,
  209. command_arguments_struct,
  210. simple_command_with_result,
  211. async_simple_command_snake,
  212. future_simple_command_snake,
  213. future_simple_command_with_return_snake,
  214. future_simple_command_with_result_snake,
  215. force_async_snake,
  216. force_async_with_result_snake,
  217. simple_command_with_result_snake,
  218. stateful_command_with_result_snake,
  219. stateful_command_with_result,
  220. command_arguments_tuple_struct,
  221. async_simple_command_with_result,
  222. future_simple_command_with_return,
  223. future_simple_command_with_result,
  224. async_stateful_command_with_result,
  225. ])
  226. .run(tauri::generate_context!(
  227. "../../examples/commands/tauri.conf.json"
  228. ))
  229. .expect("error while running tauri application");
  230. }