1use crate::protocol::KittyMessage;
2
3pub struct CommandBuilder {
4 cmd: String,
5 version: Vec<u32>,
6 no_response: Option<bool>,
7 kitty_window_id: Option<String>,
8 payload: Option<serde_json::Value>,
9}
10
11impl CommandBuilder {
12 pub fn new(cmd: impl Into<String>) -> Self {
13 Self {
14 cmd: cmd.into(),
15 version: vec![0, 43, 1],
16 no_response: None,
17 kitty_window_id: None,
18 payload: None,
19 }
20 }
21
22 pub fn version(mut self, version: Vec<u32>) -> Self {
23 self.version = version;
24 self
25 }
26
27 pub fn no_response(mut self, value: bool) -> Self {
28 self.no_response = Some(value);
29 self
30 }
31
32 pub fn kitty_window_id(mut self, id: impl Into<String>) -> Self {
33 self.kitty_window_id = Some(id.into());
34 self
35 }
36
37 pub fn payload(mut self, payload: serde_json::Value) -> Self {
38 self.payload = Some(payload);
39 self
40 }
41
42 pub fn build(self) -> KittyMessage {
43 let mut msg = KittyMessage::new(self.cmd, self.version);
44
45 if let Some(no_response) = self.no_response {
46 msg = msg.no_response(no_response);
47 }
48
49 if let Some(window_id) = self.kitty_window_id {
50 msg = msg.kitty_window_id(window_id);
51 }
52
53 if let Some(payload) = self.payload {
54 msg = msg.payload(payload);
55 }
56
57 msg
58 }
59}
60
61#[cfg(test)]
62mod tests {
63 use super::*;
64 use serde_json::json;
65
66 #[test]
67 fn test_builder_basic() {
68 let cmd = CommandBuilder::new("ls").build();
69 assert_eq!(cmd.cmd, "ls");
70 assert_eq!(cmd.version, vec![0, 43, 1]);
71 }
72
73 #[test]
74 fn test_builder_with_options() {
75 let cmd = CommandBuilder::new("send-text")
76 .version(vec![0, 15, 0])
77 .no_response(true)
78 .payload(json!({"data": "text:hello"}))
79 .build();
80
81 assert_eq!(cmd.cmd, "send-text");
82 assert_eq!(cmd.version, vec![0, 15, 0]);
83 assert_eq!(cmd.no_response, Some(true));
84 assert!(cmd.payload.is_some());
85 }
86
87 #[test]
88 fn test_builder_to_encoded() {
89 let cmd = CommandBuilder::new("ls").build();
90 let encoded = cmd.encode().unwrap();
91 assert!(encoded.starts_with(b"\x1bP@kitty-cmd"));
92 assert!(encoded.ends_with(b"\x1b\\"));
93 }
94}