use {
reovim_driver_clipboard::{ClipboardKey, ClipboardProviderRegistry},
reovim_kernel::api::v1::{HistoryRing, KernelContext, Register, RegisterBank, RegisterContent},
};
#[must_use]
pub const fn char_to_register(c: char) -> Option<Register> {
match c {
'"' => Some(Register::Default),
'a'..='z' => Some(Register::Slot(c)),
'A'..='Z' => Some(Register::Session(c)),
'+' | '*' => Some(Register::System),
'0'..='9' => Some(Register::History((c as u8) - b'0')),
_ => None,
}
}
#[must_use]
pub fn option_char_to_register(register: Option<char>) -> Register {
register
.and_then(char_to_register)
.unwrap_or(Register::Default)
}
pub fn store_and_sync(
kernel: &KernelContext,
registers: &mut RegisterBank,
register: Register,
content: &RegisterContent,
) -> bool {
match register {
Register::History(_) | Register::PeerHistory { .. } | Register::Session(_) => false,
Register::System => {
sync_to_clipboard(kernel, &content.text);
true
}
_ => registers.set_register(®ister, content.clone()),
}
}
#[cfg_attr(coverage_nightly, coverage(off))]
fn sync_to_clipboard(kernel: &KernelContext, text: &str) {
if let Some(registry) = kernel.services.get::<ClipboardProviderRegistry>()
&& let Some(provider) = registry.get(&ClipboardKey::Default)
{
let _ = provider.copy_to_clipboard(text);
}
}
pub fn push_to_history(clipboard_history: &mut HistoryRing, content: &RegisterContent) {
clipboard_history.push(content.clone());
}
#[cfg(test)]
#[allow(clippy::significant_drop_tightening)]
#[path = "tests/registers.rs"]
mod tests;