rmux_client/commands/
server.rs1use std::fmt;
2use std::path::Path;
3
4use rmux_proto::{
5 DaemonStatusRequest, KillServerRequest, LockClientRequest, LockServerRequest,
6 LockSessionRequest, Request, Response, ServerAccessRequest, SessionName, ShutdownIfIdleRequest,
7};
8
9use crate::{
10 auto_start::{ensure_server_running_with_config, AutoStartConfig, AutoStartError},
11 connection::{connect, Connection},
12 ClientError,
13};
14
15impl Connection {
16 pub fn start_server(
18 socket_path: &Path,
19 no_start_server: bool,
20 config: AutoStartConfig,
21 ) -> Result<Self, StartServerError> {
22 if no_start_server {
23 return connect(socket_path).map_err(StartServerError::Client);
24 }
25
26 ensure_server_running_with_config(socket_path, config).map_err(StartServerError::AutoStart)
27 }
28
29 pub fn kill_server(&mut self) -> Result<Response, ClientError> {
31 self.roundtrip(&Request::KillServer(KillServerRequest))
32 }
33
34 pub fn kill_server_after_write(&mut self) -> Result<(), ClientError> {
41 self.write_request(&Request::KillServer(KillServerRequest))
42 }
43
44 pub fn kill_server_legacy_wire_v1(&mut self) -> Result<(), ClientError> {
46 self.write_legacy_wire_v1_request(&Request::KillServer(KillServerRequest))
47 }
48
49 pub fn daemon_status(&mut self) -> Result<Response, ClientError> {
51 self.roundtrip(&Request::DaemonStatus(DaemonStatusRequest))
52 }
53
54 pub fn shutdown_if_idle(&mut self) -> Result<Response, ClientError> {
56 self.roundtrip(&Request::ShutdownIfIdle(ShutdownIfIdleRequest))
57 }
58
59 pub fn lock_server(&mut self) -> Result<Response, ClientError> {
61 self.roundtrip(&Request::LockServer(LockServerRequest))
62 }
63
64 pub fn lock_session(&mut self, target: SessionName) -> Result<Response, ClientError> {
66 self.roundtrip(&Request::LockSession(LockSessionRequest { target }))
67 }
68
69 pub fn lock_client(&mut self, target_client: String) -> Result<Response, ClientError> {
71 self.roundtrip(&Request::LockClient(LockClientRequest { target_client }))
72 }
73
74 pub fn server_access(&mut self, request: ServerAccessRequest) -> Result<Response, ClientError> {
76 self.roundtrip(&Request::ServerAccess(request))
77 }
78}
79
80#[derive(Debug)]
82pub enum StartServerError {
83 Client(ClientError),
85 AutoStart(AutoStartError),
87}
88
89impl fmt::Display for StartServerError {
90 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
91 match self {
92 Self::Client(error) => fmt::Display::fmt(error, formatter),
93 Self::AutoStart(error) => fmt::Display::fmt(error, formatter),
94 }
95 }
96}
97
98impl std::error::Error for StartServerError {
99 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
100 match self {
101 Self::Client(error) => Some(error),
102 Self::AutoStart(error) => Some(error),
103 }
104 }
105}