use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, PartialEq, Eq, Deserialize, Serialize)]
pub struct SidecarSpawnArgs {
#[serde(default)]
pub args: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub language: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn deserializes_full_payload() {
let payload = r#"{
"args": ["--model-path", "/m.bin", "--language", "en"],
"language": "en"
}"#;
let parsed: SidecarSpawnArgs = serde_json::from_str(payload).unwrap();
assert_eq!(parsed.args, vec!["--model-path", "/m.bin", "--language", "en"]);
assert_eq!(parsed.language.as_deref(), Some("en"));
}
#[test]
fn deserializes_empty_object_as_defaults() {
let parsed: SidecarSpawnArgs = serde_json::from_str("{}").unwrap();
assert!(parsed.args.is_empty());
assert_eq!(parsed.language, None);
}
#[test]
fn deserializes_args_only() {
let parsed: SidecarSpawnArgs =
serde_json::from_str(r#"{"args":["--mute"]}"#).unwrap();
assert_eq!(parsed.args, vec!["--mute"]);
assert_eq!(parsed.language, None);
}
#[test]
fn round_trips_through_serde() {
let original = SidecarSpawnArgs {
args: vec!["--foo".into(), "bar".into()],
language: Some("fr".into()),
};
let json = serde_json::to_string(&original).unwrap();
let parsed: SidecarSpawnArgs = serde_json::from_str(&json).unwrap();
assert_eq!(parsed, original);
}
#[test]
fn skip_serializing_none_language() {
let original = SidecarSpawnArgs {
args: vec![],
language: None,
};
let json = serde_json::to_string(&original).unwrap();
assert!(!json.contains("language"), "`language: None` should be omitted, got: {json}");
}
}