use std::cell::RefCell;
use anyhow::{Context, Result};
thread_local! {
static CLIPBOARD: RefCell<Option<arboard::Clipboard>> = const { RefCell::new(None) };
}
fn with_clipboard<T>(f: impl FnOnce(&mut arboard::Clipboard) -> Result<T>) -> Result<T> {
CLIPBOARD.with_borrow_mut(|slot| {
if slot.is_none() {
*slot = Some(arboard::Clipboard::new().context("open the system clipboard")?);
}
f(slot.as_mut().expect("clipboard opened above"))
})
}
pub fn read_text() -> Result<String> {
with_clipboard(|c| c.get_text().context("read text from the clipboard"))
}
pub fn write_text(text: &str) -> Result<()> {
with_clipboard(|c| {
c.set_text(text.to_owned())
.context("write text to the clipboard")
})
}