freya_clipboard/
clipboard.rs

1//! Provides a clipboard abstraction to access the target system's clipboard.
2
3use copypasta::ClipboardProvider;
4use freya_core::prelude::*;
5
6#[derive(Debug, PartialEq, Clone)]
7pub enum ClipboardError {
8    FailedToRead,
9    FailedToSet,
10    NotAvailable,
11}
12
13/// Access the clipboard.
14///
15/// # Examples
16///
17/// ```rust,no_run
18/// use freya_clipboard::prelude::Clipboard;
19///
20/// // Read the clipboard content
21/// if let Ok(content) = Clipboard::get() {
22///     println!("{}", content);
23/// }
24///
25/// // Write to the clipboard
26/// Clipboard::set("Hello, Dioxus!".to_string());
27/// ```
28#[derive(Clone, Copy, PartialEq)]
29pub struct Clipboard;
30
31impl Clipboard {
32    pub(crate) fn create_or_create() -> State<Option<Box<dyn ClipboardProvider>>> {
33        consume_root_context()
34    }
35
36    // Read from the clipboard
37    pub fn get() -> Result<String, ClipboardError> {
38        Self::create_or_create()
39            .write()
40            .as_mut()
41            .ok_or(ClipboardError::NotAvailable)?
42            .get_contents()
43            .map_err(|_| ClipboardError::FailedToRead)
44    }
45
46    // Write to the clipboard
47    pub fn set(contents: String) -> Result<(), ClipboardError> {
48        Self::create_or_create()
49            .write()
50            .as_mut()
51            .ok_or(ClipboardError::NotAvailable)?
52            .set_contents(contents)
53            .map_err(|_| ClipboardError::FailedToSet)
54    }
55}