freya_clipboard/
clipboard.rs

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