use std::env;
use std::time::Duration;
use rmux_sdk::{
command_feature_id, Diagnostic, EnsureSession, InfoSnapshot, PaneProcessState, Result, Rmux,
RmuxError,
};
fn detect_nested_parent() -> Option<&'static str> {
if env::var_os("RMUX").is_some() {
Some("rmux")
} else if env::var_os("TMUX").is_some() {
Some("tmux")
} else {
None
}
}
fn nested_unsupported_strings(parent: &str) -> (String, String) {
let feature = command_feature_id("new-session.nested");
let hint = format!(
"refusing to create a nested rmux client inside an existing {parent} client; \
detach the parent client first or run this binary outside its pane"
);
(feature, hint)
}
fn report_diagnostic(diagnostic: &Diagnostic) {
eprintln!("nested-detection: {}", diagnostic.message());
if let Some(feature) = diagnostic.feature() {
eprintln!("feature: {feature}");
}
if let Some(hint) = diagnostic.hint() {
eprintln!("hint: {hint}");
}
}
fn describe_identity(snapshot: &InfoSnapshot) {
for session in &snapshot.sessions {
println!("session {} name={}", session.id, session.name);
}
for window in &snapshot.windows {
println!(
" window {} index={} size={}x{}",
window.id, window.index, window.size.cols, window.size.rows,
);
}
for pane in &snapshot.panes {
let process = match &pane.process {
PaneProcessState::Running { pid } => format!("running pid={pid:?}"),
PaneProcessState::Exited => "exited".to_owned(),
PaneProcessState::Unknown => "unknown".to_owned(),
_ => "other".to_owned(),
};
println!(
" pane {} index={} size={}x{} gen={} rev={} process={}",
pane.id,
pane.index,
pane.size.cols,
pane.size.rows,
pane.generation,
pane.revision,
process,
);
}
}
#[tokio::main]
async fn main() -> Result<()> {
if let Some(parent) = detect_nested_parent() {
let (feature, hint) = nested_unsupported_strings(parent);
let diagnostic = Diagnostic::unsupported(&feature, &hint);
report_diagnostic(&diagnostic);
return Err(RmuxError::unsupported(feature, hint));
}
let rmux = Rmux::builder()
.default_endpoint()
.default_timeout(Duration::from_secs(5))
.build();
let ensure = EnsureSession::try_named("rmux-sdk-nested-detection")?.reuse_only();
match rmux.ensure_session(ensure).await {
Ok(session) => {
let info = session.pane(0, 0).info().await?;
describe_identity(&info);
}
Err(error) => {
if let Some(feature) = error.feature() {
eprintln!("rmux feature: {feature}");
}
if let Some(hint) = error.hint() {
eprintln!("rmux hint: {hint}");
}
}
}
Ok(())
}