use std::sync::Mutex;
static CLIPBOARD: Mutex<String> = Mutex::new(String::new());
pub fn set_clipboard(text: &str) {
if let Ok(mut clipboard) = CLIPBOARD.lock() {
*clipboard = text.to_string();
}
#[cfg(not(target_os = "unknown"))]
{
let _ = set_os_clipboard(text);
}
}
pub fn get_clipboard() -> String {
#[cfg(not(target_os = "unknown"))]
{
if let Ok(text) = get_os_clipboard() {
if !text.is_empty() {
return text;
}
}
}
CLIPBOARD.lock()
.map(|clipboard| clipboard.clone())
.unwrap_or_default()
}
pub fn has_clipboard_content() -> bool {
#[cfg(not(target_os = "unknown"))]
{
if let Ok(text) = get_os_clipboard() {
if !text.is_empty() {
return true;
}
}
}
CLIPBOARD.lock()
.map(|clipboard| !clipboard.is_empty())
.unwrap_or(false)
}
pub fn clear_clipboard() {
if let Ok(mut clipboard) = CLIPBOARD.lock() {
clipboard.clear();
}
#[cfg(not(target_os = "unknown"))]
{
let _ = set_os_clipboard("");
}
}
#[cfg(not(target_os = "unknown"))]
fn set_os_clipboard(text: &str) -> Result<(), Box<dyn std::error::Error>> {
use arboard::Clipboard;
let mut clipboard = Clipboard::new()?;
clipboard.set_text(text)?;
Ok(())
}
#[cfg(not(target_os = "unknown"))]
fn get_os_clipboard() -> Result<String, Box<dyn std::error::Error>> {
use arboard::Clipboard;
let mut clipboard = Clipboard::new()?;
Ok(clipboard.get_text()?)
}
#[cfg(target_os = "unknown")]
fn get_os_clipboard() -> Result<String, Box<dyn std::error::Error>> {
Ok(String::new())
}
#[cfg(target_os = "unknown")]
fn set_os_clipboard(_text: &str) -> Result<(), Box<dyn std::error::Error>> {
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_clipboard_operations() {
set_clipboard("Hello, World!");
assert!(has_clipboard_content());
let content = get_clipboard();
assert!(!content.is_empty());
set_clipboard("New content");
let content2 = get_clipboard();
assert!(!content2.is_empty());
if let Ok(mut clipboard) = CLIPBOARD.lock() {
*clipboard = "In-memory test".to_string();
}
let in_mem = CLIPBOARD.lock().unwrap().clone();
assert_eq!(in_mem, "In-memory test");
}
#[test]
fn test_in_memory_clipboard() {
if let Ok(mut clipboard) = CLIPBOARD.lock() {
clipboard.clear();
*clipboard = "Test content".to_string();
}
let in_mem = CLIPBOARD.lock().unwrap().clone();
assert_eq!(in_mem, "Test content");
}
}