use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct ExternalEngineConfig {
pub command: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub args: Vec<String>,
#[serde(default = "default_timeout")]
pub timeout_ms: u64,
#[serde(default)]
pub on_error: ErrorFallback,
#[serde(default, skip_serializing_if = "std::collections::HashMap::is_empty")]
pub format_map: std::collections::HashMap<String, String>,
}
#[derive(Debug, Clone, Deserialize, Serialize, Default, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum ErrorFallback {
#[default]
Ask,
Allow,
Builtin,
}
impl Default for ExternalEngineConfig {
fn default() -> Self {
Self {
command: String::new(),
args: Vec::new(),
timeout_ms: default_timeout(),
on_error: ErrorFallback::default(),
format_map: std::collections::HashMap::new(),
}
}
}
impl ExternalEngineConfig {
pub fn resolve_format(&self, format: crate::HookFormat) -> String {
let default = format.as_str();
self.format_map
.get(default)
.cloned()
.unwrap_or_else(|| default.to_string())
}
}
pub const fn default_timeout() -> u64 {
5000
}