use crate::core::tmux::TmuxTarget;
use crate::daemon::tmux::TmuxDriver;
use super::manager::{ManagedError, ManagedTmuxDriver};
pub struct RealTmuxDriver {
driver: TmuxDriver,
}
impl RealTmuxDriver {
pub fn discover() -> Result<Self, ManagedError> {
let driver =
TmuxDriver::discover().map_err(|e| ManagedError::TmuxUnavailable(e.to_string()))?;
Ok(Self { driver })
}
}
impl ManagedTmuxDriver for RealTmuxDriver {
fn create_session(&self, name: &str, workdir: &str) -> Result<(), ManagedError> {
self.driver
.create_session(name, Some(workdir))
.map_err(|e| ManagedError::TmuxUnavailable(e.to_string()))
}
fn kill_session(&self, name: &str) -> Result<(), ManagedError> {
self.driver
.kill_session(name)
.map_err(|e| ManagedError::TmuxUnavailable(e.to_string()))
}
fn send_line(&self, name: &str, text: &str) -> Result<(), ManagedError> {
self.driver
.send_line(&TmuxTarget::session(name), text)
.map_err(|e| ManagedError::TmuxUnavailable(e.to_string()))
}
fn capture(&self, name: &str, lines: u32) -> Result<String, ManagedError> {
self.driver
.capture(&TmuxTarget::session(name), Some(lines))
.map_err(|e| ManagedError::TmuxUnavailable(e.to_string()))
}
fn list_sessions(&self) -> Result<Vec<String>, ManagedError> {
self.driver
.list_sessions()
.map(|sessions| sessions.into_iter().map(|s| s.name).collect())
.map_err(|e| ManagedError::TmuxUnavailable(e.to_string()))
}
}
pub struct NoopTmuxDriver;
impl ManagedTmuxDriver for NoopTmuxDriver {
fn create_session(&self, _name: &str, _workdir: &str) -> Result<(), ManagedError> {
Err(ManagedError::TmuxUnavailable("tmux not installed".into()))
}
fn kill_session(&self, _name: &str) -> Result<(), ManagedError> {
Ok(())
}
fn send_line(&self, _name: &str, _text: &str) -> Result<(), ManagedError> {
Err(ManagedError::TmuxUnavailable("tmux not installed".into()))
}
fn capture(&self, _name: &str, _lines: u32) -> Result<String, ManagedError> {
Ok(String::new())
}
fn list_sessions(&self) -> Result<Vec<String>, ManagedError> {
Ok(Vec::new())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn real_tmux_constructs() {
let _ = RealTmuxDriver::discover();
}
}