Skip to main content

kitty_rc/
command.rs

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}