freya_clipboard/
clipboard.rs1use copypasta::ClipboardProvider;
4use freya_core::prelude::*;
5
6#[derive(Debug, PartialEq, Clone)]
7pub enum ClipboardError {
8 FailedToRead,
9 FailedToSet,
10 NotAvailable,
11}
12
13#[derive(Clone, Copy, PartialEq)]
29pub struct Clipboard(State<Option<Box<dyn ClipboardProvider>>>);
30
31impl Clipboard {
32 pub fn create(provider: Option<Box<dyn ClipboardProvider>>) -> Self {
33 Self(State::create_global(provider))
34 }
35
36 #[track_caller]
38 pub fn get() -> Result<String, ClipboardError> {
39 Self::with_provider(|provider| provider.get_contents())?
40 .map_err(|_| ClipboardError::FailedToRead)
41 }
42
43 #[track_caller]
45 pub fn set(contents: String) -> Result<(), ClipboardError> {
46 Self::with_provider(|provider| provider.set_contents(contents))?
47 .map_err(|_| ClipboardError::FailedToSet)
48 }
49
50 fn with_provider<T>(
51 run: impl FnOnce(&mut dyn ClipboardProvider) -> T,
52 ) -> Result<T, ClipboardError> {
53 let mut clipboard = GlobalContexts::get().get_context::<Clipboard>();
54 let mut provider = clipboard.0.write();
55 let provider = provider.as_mut().ok_or(ClipboardError::NotAvailable)?;
56 Ok(run(provider.as_mut()))
57 }
58}