diff options
author | Kunal Mohan <kunalmohan99@gmail.com> | 2021-05-29 00:32:06 +0530 |
---|---|---|
committer | Kunal Mohan <kunalmohan99@gmail.com> | 2021-05-29 00:32:06 +0530 |
commit | 0bd05cbcb46d607079608bb83bdefba97bf7a764 (patch) | |
tree | d4abb52e544ec5afb8bc23c3ee770492d942ba72 /src | |
parent | 6017305bb0f198372ccaf12b18099340337c89b2 (diff) |
Make session-name option in attach command
If only one session is running, attach to it.
Otherwise list the active sessions (if any)
Diffstat (limited to 'src')
-rw-r--r-- | src/main.rs | 12 | ||||
-rw-r--r-- | src/sessions.rs | 97 |
2 files changed, 63 insertions, 46 deletions
diff --git a/src/main.rs b/src/main.rs index efb991567..b9147fab2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,7 +4,7 @@ mod sessions; mod tests; use crate::install::populate_data_dir; -use sessions::{assert_session, assert_session_ne, list_sessions}; +use sessions::{assert_session, assert_session_ne, get_active_session, list_sessions}; use std::convert::TryFrom; use std::process; use zellij_client::{os_input_output::get_client_os_input, start_client, ClientInfo}; @@ -54,16 +54,20 @@ pub fn main() { } }; if let Some(Command::Sessions(Sessions::Attach { - session_name, + mut session_name, force, })) = opts.command.clone() { - assert_session(&session_name); + if let Some(session) = session_name.as_ref() { + assert_session(session); + } else { + session_name = Some(get_active_session()); + } start_client( Box::new(os_input), opts, config, - ClientInfo::Attach(session_name, force), + ClientInfo::Attach(session_name.unwrap(), force), ); } else { let session_name = opts diff --git a/src/sessions.rs b/src/sessions.rs index fd834e408..fb1a96352 100644 --- a/src/sessions.rs +++ b/src/sessions.rs @@ -29,22 +29,61 @@ fn get_sessions() -> Result<Vec<String>, io::ErrorKind> { } } +fn assert_socket(name: &str) -> bool { + let path = &*ZELLIJ_SOCK_DIR.join(name); + match LocalSocketStream::connect(path) { + Ok(stream) => { + IpcSenderWithContext::new(stream).send(ClientToServerMsg::ClientExited); + true + } + Err(e) => { + if e.kind() == io::ErrorKind::ConnectionRefused { + drop(fs::remove_file(path)); + false + } else { + true + } + } + } +} + +fn print_sessions(sessions: Vec<String>) { + let curr_session = std::env::var("ZELLIJ_SESSION_NAME").unwrap_or_else(|_| "".into()); + sessions.iter().for_each(|session| { + let suffix = if curr_session == *session { + " (current)" + } else { + "" + }; + println!("{}{}", session, suffix); + }) +} + +pub(crate) fn get_active_session() -> String { + match get_sessions() { + Ok(mut sessions) => { + if sessions.len() == 1 { + return sessions.pop().unwrap(); + } + if sessions.is_empty() { + println!("No active zellij sessions found."); + } else { + println!("Please specify the session name to attach to. The following sessions are active:"); + print_sessions(sessions); + } + } + Err(e) => eprintln!("Error occured: {:?}", e), + } + process::exit(1); +} + pub(crate) fn list_sessions() { let exit_code = match get_sessions() { Ok(sessions) => { if sessions.is_empty() { println!("No active zellij sessions found."); } else { - let curr_session = - std::env::var("ZELLIJ_SESSION_NAME").unwrap_or_else(|_| "".into()); - sessions.iter().for_each(|session| { - let suffix = if curr_session == *session { - " (current)" - } else { - "" - }; - println!("{}{}", session, suffix); - }) + print_sessions(sessions); } 0 } @@ -57,53 +96,27 @@ pub(crate) fn list_sessions() { } pub(crate) fn assert_session(name: &str) { - let exit_code = match get_sessions() { + match get_sessions() { Ok(sessions) => { if sessions.iter().any(|s| s == name) { return; } println!("No session named {:?} found.", name); - 0 - } - Err(e) => { - eprintln!("Error occured: {:?}", e); - 1 } + Err(e) => eprintln!("Error occured: {:?}", e), }; - process::exit(exit_code); + process::exit(1); } pub(crate) fn assert_session_ne(name: &str) { - let exit_code = match get_sessions() { + match get_sessions() { Ok(sessions) => { if sessions.iter().all(|s| s != name) { return; } println!("Session with name {:?} aleady exists. Use attach command to connect to it or specify a different name.", name); - 0 - } - Err(e) => { - eprintln!("Error occured: {:?}", e); - 1 } + Err(e) => eprintln!("Error occured: {:?}", e), }; - process::exit(exit_code); -} - -fn assert_socket(name: &str) -> bool { - let path = &*ZELLIJ_SOCK_DIR.join(name); - match LocalSocketStream::connect(path) { - Ok(stream) => { - IpcSenderWithContext::new(stream).send(ClientToServerMsg::ClientExited); - true - } - Err(e) => { - if e.kind() == io::ErrorKind::ConnectionRefused { - drop(fs::remove_file(path)); - false - } else { - true - } - } - } + process::exit(1); } |