use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, thiserror::Error)]
pub enum ParameterError {
#[error("模板解析失败: {0}")]
TemplateParseFailed(String),
#[error("参数数量不足: 需要 {required} 个,实际提供 {actual} 个")]
InsufficientArguments { required: usize, actual: usize },
#[error("无效的占位符: {0}")]
InvalidPlaceholder(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ParameterSnapshot {
inner: HashMap<String, String>,
}
impl ParameterSnapshot {
pub fn empty() -> Self {
Self {
inner: HashMap::new(),
}
}
pub fn get(&self, key: &str) -> String {
self.inner.get(key).cloned().unwrap_or_else(|| {
tracing::warn!("系统参数 {} 未捕获,使用空字符串", key);
String::new()
})
}
pub fn insert(&mut self, key: String, value: String) {
self.inner.insert(key, value);
}
}
#[derive(Debug, Clone, Copy, Hash, Eq, PartialEq)]
pub enum SystemParameter {
Clipboard,
WindowHandle,
Selection,
}
impl SystemParameter {
pub fn as_key(&self) -> &'static str {
match self {
SystemParameter::Clipboard => "clipboard",
SystemParameter::WindowHandle => "hwnd",
SystemParameter::Selection => "selection",
}
}
pub fn from_name(name: &str) -> Option<Self> {
match name {
"clip" => Some(SystemParameter::Clipboard),
"hwnd" => Some(SystemParameter::WindowHandle),
"selection" => Some(SystemParameter::Selection),
_ => None,
}
}
}