main.rs 6.7 KB

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