clipboard.rs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // Copyright 2019-2021 Tauri Programme within The Commons Conservancy
  2. // SPDX-License-Identifier: Apache-2.0
  3. // SPDX-License-Identifier: MIT
  4. #![allow(unused_imports)]
  5. use super::InvokeContext;
  6. #[cfg(any(clipboard_write_text, clipboard_read_text))]
  7. use crate::runtime::ClipboardManager;
  8. use crate::Runtime;
  9. use serde::Deserialize;
  10. use tauri_macros::{command_enum, module_command_handler, CommandModule};
  11. /// The API descriptor.
  12. #[command_enum]
  13. #[derive(Deserialize, CommandModule)]
  14. #[serde(tag = "cmd", content = "data", rename_all = "camelCase")]
  15. pub enum Cmd {
  16. /// Write a text string to the clipboard.
  17. #[cmd(clipboard_write_text, "clipboard > writeText")]
  18. WriteText(String),
  19. /// Read clipboard content as text.
  20. ReadText,
  21. }
  22. impl Cmd {
  23. #[module_command_handler(clipboard_write_text)]
  24. fn write_text<R: Runtime>(context: InvokeContext<R>, text: String) -> super::Result<()> {
  25. context
  26. .window
  27. .app_handle
  28. .clipboard_manager()
  29. .write_text(text)
  30. .map_err(crate::error::into_anyhow)
  31. }
  32. #[module_command_handler(clipboard_read_text)]
  33. fn read_text<R: Runtime>(context: InvokeContext<R>) -> super::Result<Option<String>> {
  34. context
  35. .window
  36. .app_handle
  37. .clipboard_manager()
  38. .read_text()
  39. .map_err(crate::error::into_anyhow)
  40. }
  41. #[cfg(not(clipboard_read_text))]
  42. fn read_text<R: Runtime>(_: InvokeContext<R>) -> super::Result<()> {
  43. Err(crate::Error::ApiNotAllowlisted("clipboard > readText".into()).into_anyhow())
  44. }
  45. }
  46. #[cfg(test)]
  47. mod tests {
  48. #[tauri_macros::module_command_test(clipboard_write_text, "clipboard > writeText")]
  49. #[quickcheck_macros::quickcheck]
  50. fn write_text(text: String) {
  51. let ctx = crate::test::mock_invoke_context();
  52. super::Cmd::write_text(ctx.clone(), text.clone()).unwrap();
  53. #[cfg(clipboard_read_text)]
  54. assert_eq!(super::Cmd::read_text(ctx).unwrap(), Some(text));
  55. }
  56. #[tauri_macros::module_command_test(clipboard_read_text, "clipboard > readText", runtime)]
  57. #[quickcheck_macros::quickcheck]
  58. fn read_text() {
  59. let ctx = crate::test::mock_invoke_context();
  60. assert_eq!(super::Cmd::read_text(ctx.clone()).unwrap(), None);
  61. #[cfg(clipboard_write_text)]
  62. {
  63. let text = "Tauri!".to_string();
  64. super::Cmd::write_text(ctx.clone(), text.clone()).unwrap();
  65. assert_eq!(super::Cmd::read_text(ctx).unwrap(), Some(text));
  66. }
  67. }
  68. }