main.rs 6.6 KB

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