use serde::Deserialize;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub(crate) enum SubprocessHarness {
#[default]
Codex,
Pi,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Deserialize)]
#[serde(rename_all = "kebab-case", default)]
pub(crate) struct DispatchConfig {
#[serde(default)]
pub(crate) preferred_subprocess_harness: SubprocessHarness,
#[serde(default)]
pub(crate) claude_force_subprocess_dispatch: bool,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn empty_config_defaults_to_codex() {
assert_eq!(
DispatchConfig::default().preferred_subprocess_harness,
SubprocessHarness::Codex
);
let doc: DispatchConfig = toml::from_str("").unwrap();
assert_eq!(doc.preferred_subprocess_harness, SubprocessHarness::Codex);
}
#[test]
fn parse_prefers_pi() {
let doc: DispatchConfig =
toml::from_str("preferred-subprocess-harness = \"pi\"\n").unwrap();
assert_eq!(doc.preferred_subprocess_harness, SubprocessHarness::Pi);
}
#[test]
fn unknown_harness_is_error() {
let err = toml::from_str::<DispatchConfig>("preferred-subprocess-harness = \"cursor\"\n")
.unwrap_err();
assert!(
err.to_string().contains("preferred-subprocess-harness"),
"expected error to mention the key: {err}"
);
}
#[test]
fn claude_force_defaults_false() {
assert!(!DispatchConfig::default().claude_force_subprocess_dispatch);
let doc: DispatchConfig = toml::from_str("").unwrap();
assert!(!doc.claude_force_subprocess_dispatch);
let doc: DispatchConfig =
toml::from_str("preferred-subprocess-harness = \"pi\"\n").unwrap();
assert!(!doc.claude_force_subprocess_dispatch);
}
#[test]
fn parse_claude_force_true() {
let doc: DispatchConfig =
toml::from_str("claude-force-subprocess-dispatch = true\n").unwrap();
assert!(doc.claude_force_subprocess_dispatch);
}
#[test]
fn parse_claude_force_false() {
let doc: DispatchConfig =
toml::from_str("claude-force-subprocess-dispatch = false\n").unwrap();
assert!(!doc.claude_force_subprocess_dispatch);
}
#[test]
fn parse_combined_keys() {
let doc: DispatchConfig = toml::from_str(
"preferred-subprocess-harness = \"pi\"\nclaude-force-subprocess-dispatch = true\n",
)
.unwrap();
assert_eq!(doc.preferred_subprocess_harness, SubprocessHarness::Pi);
assert!(doc.claude_force_subprocess_dispatch);
}
}