freya_clipboard/
clipboard.rs1use 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#[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 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 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}