Skip to main content

rmux_client/commands/
buffer.rs

1use rmux_proto::{
2    CapturePaneRequest, CapturePaneTargetActionRequest, ClearHistoryRequest, DeleteBufferRequest,
3    ListBuffersRequest, LoadBufferRequest, PaneTarget, PasteBufferRequest, Request, Response,
4    SaveBufferRequest, SetBufferRequest, ShowBufferRequest,
5};
6use std::path::{Path, PathBuf};
7
8use crate::{connection::Connection, ClientError};
9
10impl Connection {
11    /// Sends a `set-buffer` request over the detached RPC channel.
12    pub fn set_buffer(
13        &mut self,
14        name: Option<String>,
15        content: Vec<u8>,
16        append: bool,
17        new_name: Option<String>,
18        set_clipboard: bool,
19    ) -> Result<Response, ClientError> {
20        self.set_buffer_target_client(name, content, append, new_name, set_clipboard, None)
21    }
22
23    /// Sends a target-client-aware `set-buffer` request.
24    #[allow(clippy::too_many_arguments)]
25    pub fn set_buffer_target_client(
26        &mut self,
27        name: Option<String>,
28        content: Vec<u8>,
29        append: bool,
30        new_name: Option<String>,
31        set_clipboard: bool,
32        target_client: Option<String>,
33    ) -> Result<Response, ClientError> {
34        self.roundtrip(&Request::SetBuffer(Box::new(SetBufferRequest {
35            name,
36            content,
37            append,
38            new_name,
39            set_clipboard,
40            target_client,
41        })))
42    }
43
44    /// Sends a `show-buffer` request over the detached RPC channel.
45    pub fn show_buffer(&mut self, name: Option<String>) -> Result<Response, ClientError> {
46        self.roundtrip(&Request::ShowBuffer(ShowBufferRequest { name }))
47    }
48
49    /// Sends a `paste-buffer` request over the detached RPC channel.
50    #[allow(clippy::too_many_arguments)]
51    pub fn paste_buffer(
52        &mut self,
53        name: Option<String>,
54        target: PaneTarget,
55        delete_after: bool,
56        separator: Option<String>,
57        linefeed: bool,
58        raw: bool,
59        bracketed: bool,
60    ) -> Result<Response, ClientError> {
61        self.roundtrip(&Request::PasteBuffer(Box::new(PasteBufferRequest {
62            name,
63            target,
64            delete_after,
65            separator,
66            linefeed,
67            raw,
68            bracketed,
69        })))
70    }
71
72    /// Sends a `list-buffers` request over the detached RPC channel.
73    pub fn list_buffers(
74        &mut self,
75        format: Option<String>,
76        filter: Option<String>,
77        sort_order: Option<String>,
78        reversed: bool,
79    ) -> Result<Response, ClientError> {
80        self.roundtrip(&Request::ListBuffers(ListBuffersRequest {
81            format,
82            filter,
83            sort_order,
84            reversed,
85        }))
86    }
87
88    /// Sends a `delete-buffer` request over the detached RPC channel.
89    pub fn delete_buffer(&mut self, name: Option<String>) -> Result<Response, ClientError> {
90        self.roundtrip(&Request::DeleteBuffer(DeleteBufferRequest { name }))
91    }
92
93    /// Sends a `load-buffer` request over the detached RPC channel.
94    pub fn load_buffer(
95        &mut self,
96        path: String,
97        name: Option<String>,
98        set_clipboard: bool,
99    ) -> Result<Response, ClientError> {
100        self.load_buffer_target_client(path, name, set_clipboard, None)
101    }
102
103    /// Sends a target-client-aware `load-buffer` request.
104    pub fn load_buffer_target_client(
105        &mut self,
106        path: String,
107        name: Option<String>,
108        set_clipboard: bool,
109        target_client: Option<String>,
110    ) -> Result<Response, ClientError> {
111        let cwd = caller_cwd_for_path(&path)?;
112        self.roundtrip(&Request::LoadBuffer(Box::new(LoadBufferRequest {
113            path,
114            cwd,
115            name,
116            set_clipboard,
117            target_client,
118        })))
119    }
120
121    /// Sends a `save-buffer` request over the detached RPC channel.
122    pub fn save_buffer(
123        &mut self,
124        path: String,
125        name: Option<String>,
126        append: bool,
127    ) -> Result<Response, ClientError> {
128        let cwd = caller_cwd_for_path(&path)?;
129        self.roundtrip(&Request::SaveBuffer(SaveBufferRequest {
130            path,
131            cwd,
132            name,
133            append,
134        }))
135    }
136
137    /// Sends a `capture-pane` request over the detached RPC channel.
138    pub fn capture_pane(&mut self, request: CapturePaneRequest) -> Result<Response, ClientError> {
139        self.roundtrip(&Request::CapturePane(Box::new(request)))
140    }
141
142    /// Sends a `capture-pane` request with server-side target resolution.
143    pub fn capture_pane_target_action(
144        &mut self,
145        request: CapturePaneTargetActionRequest,
146    ) -> Result<Response, ClientError> {
147        self.roundtrip(&Request::CapturePaneTargetAction(Box::new(request)))
148    }
149
150    /// Sends a `clear-history` request over the detached RPC channel.
151    pub fn clear_history(
152        &mut self,
153        target: PaneTarget,
154        reset_hyperlinks: bool,
155    ) -> Result<Response, ClientError> {
156        self.roundtrip(&Request::ClearHistory(ClearHistoryRequest {
157            target,
158            reset_hyperlinks,
159        }))
160    }
161}
162
163fn caller_cwd_for_path(path: &str) -> Result<Option<PathBuf>, ClientError> {
164    if Path::new(path).is_absolute() {
165        Ok(None)
166    } else {
167        std::env::current_dir().map(Some).map_err(Into::into)
168    }
169}