use crate::converter::clean_path_input;
use anyhow::{Context, Result};
pub fn read_clipboard() -> Result<String> {
let mut ctx = arboard::Clipboard::new().context("无法访问系统剪贴板")?;
let text = ctx.get_text().context("无法读取剪贴板文本")?;
Ok(text)
}
pub fn read_clipboard_path() -> Result<String> {
let raw = read_clipboard()?;
let cleaned = clean_path_input(&raw);
if cleaned.is_empty() {
anyhow::bail!("剪贴板内容为空");
}
let looks_like_path = cleaned.contains('\\')
|| cleaned.contains('/')
|| (cleaned.len() >= 2 && cleaned.as_bytes()[1] == b':');
if !looks_like_path {
anyhow::bail!("剪贴板内容不像路径: {}", truncate(&cleaned, 60));
}
Ok(cleaned)
}
fn truncate(s: &str, max_len: usize) -> String {
if s.len() <= max_len {
s.to_string()
} else {
format!("{}...", &s[..max_len])
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_truncate_short() {
assert_eq!(truncate("abc", 10), "abc");
}
#[test]
fn test_truncate_long() {
let s = "a".repeat(100);
assert_eq!(truncate(&s, 10).len(), 13); }
}