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.roundtrip(&Request::SetBuffer(SetBufferRequest {
21 name,
22 content,
23 append,
24 new_name,
25 set_clipboard,
26 }))
27 }
28
29 pub fn show_buffer(&mut self, name: Option<String>) -> Result<Response, ClientError> {
31 self.roundtrip(&Request::ShowBuffer(ShowBufferRequest { name }))
32 }
33
34 #[allow(clippy::too_many_arguments)]
36 pub fn paste_buffer(
37 &mut self,
38 name: Option<String>,
39 target: PaneTarget,
40 delete_after: bool,
41 separator: Option<String>,
42 linefeed: bool,
43 raw: bool,
44 bracketed: bool,
45 ) -> Result<Response, ClientError> {
46 self.roundtrip(&Request::PasteBuffer(Box::new(PasteBufferRequest {
47 name,
48 target,
49 delete_after,
50 separator,
51 linefeed,
52 raw,
53 bracketed,
54 })))
55 }
56
57 pub fn list_buffers(
59 &mut self,
60 format: Option<String>,
61 filter: Option<String>,
62 sort_order: Option<String>,
63 reversed: bool,
64 ) -> Result<Response, ClientError> {
65 self.roundtrip(&Request::ListBuffers(ListBuffersRequest {
66 format,
67 filter,
68 sort_order,
69 reversed,
70 }))
71 }
72
73 pub fn delete_buffer(&mut self, name: Option<String>) -> Result<Response, ClientError> {
75 self.roundtrip(&Request::DeleteBuffer(DeleteBufferRequest { name }))
76 }
77
78 pub fn load_buffer(
80 &mut self,
81 path: String,
82 name: Option<String>,
83 set_clipboard: bool,
84 ) -> Result<Response, ClientError> {
85 let cwd = caller_cwd_for_path(&path)?;
86 self.roundtrip(&Request::LoadBuffer(LoadBufferRequest {
87 path,
88 cwd,
89 name,
90 set_clipboard,
91 }))
92 }
93
94 pub fn save_buffer(
96 &mut self,
97 path: String,
98 name: Option<String>,
99 append: bool,
100 ) -> Result<Response, ClientError> {
101 let cwd = caller_cwd_for_path(&path)?;
102 self.roundtrip(&Request::SaveBuffer(SaveBufferRequest {
103 path,
104 cwd,
105 name,
106 append,
107 }))
108 }
109
110 pub fn capture_pane(&mut self, request: CapturePaneRequest) -> Result<Response, ClientError> {
112 self.roundtrip(&Request::CapturePane(Box::new(request)))
113 }
114
115 pub fn capture_pane_target_action(
117 &mut self,
118 request: CapturePaneTargetActionRequest,
119 ) -> Result<Response, ClientError> {
120 self.roundtrip(&Request::CapturePaneTargetAction(Box::new(request)))
121 }
122
123 pub fn clear_history(
125 &mut self,
126 target: PaneTarget,
127 reset_hyperlinks: bool,
128 ) -> Result<Response, ClientError> {
129 self.roundtrip(&Request::ClearHistory(ClearHistoryRequest {
130 target,
131 reset_hyperlinks,
132 }))
133 }
134}
135
136fn caller_cwd_for_path(path: &str) -> Result<Option<PathBuf>, ClientError> {
137 if Path::new(path).is_absolute() {
138 Ok(None)
139 } else {
140 std::env::current_dir().map(Some).map_err(Into::into)
141 }
142}