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 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 #[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 pub fn show_buffer(&mut self, name: Option<String>) -> Result<Response, ClientError> {
46 self.roundtrip(&Request::ShowBuffer(ShowBufferRequest { name }))
47 }
48
49 #[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 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 pub fn delete_buffer(&mut self, name: Option<String>) -> Result<Response, ClientError> {
90 self.roundtrip(&Request::DeleteBuffer(DeleteBufferRequest { name }))
91 }
92
93 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 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 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 pub fn capture_pane(&mut self, request: CapturePaneRequest) -> Result<Response, ClientError> {
139 self.roundtrip(&Request::CapturePane(Box::new(request)))
140 }
141
142 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 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}