use std::io::{self, Write, stdout};
use crossterm::{clipboard::CopyToClipboard, execute};
pub const MAX_YANK: usize = 64 * 1024;
#[derive(Debug, thiserror::Error)]
pub enum YankError {
#[error("{0} bytes is too large to yank (limit {MAX_YANK})")]
TooLarge(usize),
#[error("terminal write failed: {0}")]
Io(#[from] io::Error),
}
pub fn yank(text: &str) -> Result<(), YankError> {
if text.len() > MAX_YANK {
return Err(YankError::TooLarge(text.len()));
}
let mut out = stdout();
execute!(out, CopyToClipboard::to_clipboard_from(text))?;
out.flush()?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn oversized_yanks_are_refused_rather_than_truncated() {
let big = "x".repeat(MAX_YANK + 1);
assert!(matches!(yank(&big), Err(YankError::TooLarge(_))));
}
}