Skip to main content

rmux_client/commands/
buffer.rs

1use rmux_proto::{
2    CapturePaneRequest, ClearHistoryRequest, DeleteBufferRequest, ListBuffersRequest,
3    LoadBufferRequest, PaneTarget, PasteBufferRequest, Request, Response, SaveBufferRequest,
4    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.roundtrip(&Request::SetBuffer(SetBufferRequest {
21            name,
22            content,
23            append,
24            new_name,
25            set_clipboard,
26        }))
27    }
28
29    /// Sends a `show-buffer` request over the detached RPC channel.
30    pub fn show_buffer(&mut self, name: Option<String>) -> Result<Response, ClientError> {
31        self.roundtrip(&Request::ShowBuffer(ShowBufferRequest { name }))
32    }
33
34    /// Sends a `paste-buffer` request over the detached RPC channel.
35    #[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(PasteBufferRequest {
47            name,
48            target,
49            delete_after,
50            separator,
51            linefeed,
52            raw,
53            bracketed,
54        }))
55    }
56
57    /// Sends a `list-buffers` request over the detached RPC channel.
58    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    /// Sends a `delete-buffer` request over the detached RPC channel.
74    pub fn delete_buffer(&mut self, name: Option<String>) -> Result<Response, ClientError> {
75        self.roundtrip(&Request::DeleteBuffer(DeleteBufferRequest { name }))
76    }
77
78    /// Sends a `load-buffer` request over the detached RPC channel.
79    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    /// Sends a `save-buffer` request over the detached RPC channel.
95    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    /// Sends a `capture-pane` request over the detached RPC channel.
111    pub fn capture_pane(&mut self, request: CapturePaneRequest) -> Result<Response, ClientError> {
112        self.roundtrip(&Request::CapturePane(request))
113    }
114
115    /// Sends a `clear-history` request over the detached RPC channel.
116    pub fn clear_history(
117        &mut self,
118        target: PaneTarget,
119        reset_hyperlinks: bool,
120    ) -> Result<Response, ClientError> {
121        self.roundtrip(&Request::ClearHistory(ClearHistoryRequest {
122            target,
123            reset_hyperlinks,
124        }))
125    }
126}
127
128fn caller_cwd_for_path(path: &str) -> Result<Option<PathBuf>, ClientError> {
129    if Path::new(path).is_absolute() {
130        Ok(None)
131    } else {
132        std::env::current_dir().map(Some).map_err(Into::into)
133    }
134}