mod clipboard;
mod errors;
mod local;
pub use {
clipboard::Clipboard,
errors::ClipboardError,
local::LocalClipboard,
};
#[cfg(target_os = "windows")]
mod win;
#[cfg(target_os = "windows")]
pub use win::WinClipboard;
#[cfg(target_os = "android")]
mod termux;
#[cfg(target_os = "android")]
pub use termux::TermuxClipboard;
#[cfg(not(any(target_os="windows",target_os="android")))]
mod x11;
#[cfg(not(any(target_os="windows",target_os="android")))]
pub use x11::X11Clipboard;
use {
once_cell::sync::Lazy,
std::sync::Mutex,
};
static CLIPBOARD: Lazy<Mutex<Box<dyn Clipboard + Send>>> = Lazy::new(|| Mutex::new(new_clipboard()));
pub fn new_clipboard() -> Box<dyn Clipboard + Send> {
#[cfg(target_os = "windows")]
{
return Box::new(WinClipboard::new());
}
#[cfg(target_os = "android")]
{
if let Ok(clipboard) =TermuxClipboard::verified() {
return Box::new(clipboard);
}
}
#[cfg(not(any(target_os="windows",target_os="android")))]
{
if let Ok(clipboard) = X11Clipboard::verified() {
return Box::new(clipboard);
}
}
#[allow(unreachable_code)]
Box::new(LocalClipboard::new())
}
pub fn get_type() -> &'static str {
CLIPBOARD.lock().unwrap().get_type()
}
pub fn get_string() -> Result<String, ClipboardError> {
CLIPBOARD.lock().unwrap().get_string()
}
pub fn set_string<S: AsRef<str>>(s: S) -> Result<(), ClipboardError> {
CLIPBOARD.lock().unwrap().set_string(s.as_ref())
}
#[cfg(test)]
mod clipboard_tests {
use super::*;
#[test]
fn write_read() {
let test = "TEST";
set_string(test).unwrap();
assert_eq!(test, get_string().unwrap());
}
}