pub struct Clipboard {
system: Option<arboard::Clipboard>,
register: String,
line_wise: bool,
}
impl std::fmt::Debug for Clipboard {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Clipboard")
.field("system", &self.system.is_some())
.field("register", &self.register.len())
.field("line_wise", &self.line_wise)
.finish()
}
}
impl Clipboard {
#[must_use]
pub fn new(use_system: bool) -> Self {
Self {
system: use_system.then(|| arboard::Clipboard::new().ok()).flatten(),
register: String::new(),
line_wise: false,
}
}
pub fn set(&mut self, text: String, line_wise: bool) {
if let Some(system) = self.system.as_mut() {
let _ = system.set_text(text.clone());
}
self.register = text;
self.line_wise = line_wise;
}
pub fn get(&mut self) -> String {
if let Some(system) = self.system.as_mut()
&& let Ok(text) = system.get_text()
&& !text.is_empty()
{
if text != self.register {
self.line_wise = text.ends_with('\n');
}
return text;
}
self.register.clone()
}
#[must_use]
pub const fn is_line_wise(&self) -> bool {
self.line_wise
}
}