agent_engine/sidecar/
spawn.rs1use serde::{Deserialize, Serialize};
23
24#[derive(Debug, Clone, Default, PartialEq, Eq, Deserialize, Serialize)]
26pub struct SidecarSpawnArgs {
27 #[serde(default)]
33 pub args: Vec<String>,
34 #[serde(default, skip_serializing_if = "Option::is_none")]
38 pub language: Option<String>,
39}
40
41#[cfg(test)]
42mod tests {
43 use super::*;
44
45 #[test]
46 fn deserializes_full_payload() {
47 let payload = r#"{
48 "args": ["--model-path", "/m.bin", "--language", "en"],
49 "language": "en"
50 }"#;
51 let parsed: SidecarSpawnArgs = serde_json::from_str(payload).unwrap();
52 assert_eq!(
53 parsed.args,
54 vec!["--model-path", "/m.bin", "--language", "en"]
55 );
56 assert_eq!(parsed.language.as_deref(), Some("en"));
57 }
58
59 #[test]
60 fn deserializes_empty_object_as_defaults() {
61 let parsed: SidecarSpawnArgs = serde_json::from_str("{}").unwrap();
62 assert!(parsed.args.is_empty());
63 assert_eq!(parsed.language, None);
64 }
65
66 #[test]
67 fn deserializes_args_only() {
68 let parsed: SidecarSpawnArgs = serde_json::from_str(r#"{"args":["--mute"]}"#).unwrap();
69 assert_eq!(parsed.args, vec!["--mute"]);
70 assert_eq!(parsed.language, None);
71 }
72
73 #[test]
74 fn round_trips_through_serde() {
75 let original = SidecarSpawnArgs {
76 args: vec!["--foo".into(), "bar".into()],
77 language: Some("fr".into()),
78 };
79 let json = serde_json::to_string(&original).unwrap();
80 let parsed: SidecarSpawnArgs = serde_json::from_str(&json).unwrap();
81 assert_eq!(parsed, original);
82 }
83
84 #[test]
85 fn skip_serializing_none_language() {
86 let original = SidecarSpawnArgs {
87 args: vec![],
88 language: None,
89 };
90 let json = serde_json::to_string(&original).unwrap();
91 assert!(
92 !json.contains("language"),
93 "`language: None` should be omitted, got: {json}"
94 );
95 }
96}