use crate::TextError;
use dyn_clone::DynClone;
use std::error::Error;
use std::fmt::{Debug, Display, Formatter};
use std::sync::{Arc, Mutex};
#[derive(Debug)]
pub struct ClipboardError;
impl Display for ClipboardError {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self)
}
}
impl Error for ClipboardError {}
impl From<ClipboardError> for TextError {
fn from(_value: ClipboardError) -> Self {
TextError::Clipboard
}
}
pub trait Clipboard: DynClone + Debug {
fn get_string(&self) -> Result<String, ClipboardError>;
fn set_string(&self, s: &str) -> Result<(), ClipboardError>;
}
#[derive(Debug, Default, Clone)]
pub struct LocalClipboard {
text: Arc<Mutex<String>>,
}
impl LocalClipboard {
pub fn new() -> Self {
Self::default()
}
}
impl Clipboard for LocalClipboard {
fn get_string(&self) -> Result<String, ClipboardError> {
match self.text.lock() {
Ok(v) => Ok(v.clone()),
Err(_) => Err(ClipboardError),
}
}
fn set_string(&self, s: &str) -> Result<(), ClipboardError> {
match self.text.lock() {
Ok(mut v) => {
*v = s.to_string();
Ok(())
}
Err(_) => Err(ClipboardError),
}
}
}