diff options
| author | Eskil Queseth <eskilq@kth.se> | 2020-10-17 21:28:40 +0200 |
|---|---|---|
| committer | Eskil Queseth <eskilq@kth.se> | 2020-10-17 21:28:40 +0200 |
| commit | ccc5f76133460d055a5d90ae9cd0a7bc2a83551d (patch) | |
| tree | 43d27a68fe15ef5f28bd08161bd03d1a39a00186 /mumctl | |
| parent | 7675171e2c307c91a81b0daee915c2a114ae4612 (diff) | |
| parent | f1df606dfeafbfe93066d23f378d7fdbd1b4e9e1 (diff) | |
| download | mum-ccc5f76133460d055a5d90ae9cd0a7bc2a83551d.tar.gz | |
Merge remote-tracking branch 'origin/pretty-print' into main
Diffstat (limited to 'mumctl')
| -rw-r--r-- | mumctl/src/main.rs | 143 |
1 files changed, 98 insertions, 45 deletions
diff --git a/mumctl/src/main.rs b/mumctl/src/main.rs index 82fcab6..2473195 100644 --- a/mumctl/src/main.rs +++ b/mumctl/src/main.rs @@ -3,7 +3,10 @@ use colored::Colorize; use ipc_channel::ipc::{self, IpcSender}; use mumlib::command::{Command, CommandResponse}; use mumlib::setup_logger; -use std::{fs, io}; +use mumlib::state::Channel; +use std::{fs, io, iter}; + +const INDENTATION: &str = " "; macro_rules! err_print { ($func:expr) => { @@ -18,26 +21,28 @@ fn main() { let mut app = App::new("mumctl") .setting(AppSettings::ArgRequiredElseHelp) - .subcommand(SubCommand::with_name("server") - .setting(AppSettings::ArgRequiredElseHelp) - .subcommand(SubCommand::with_name("connect") - .setting(AppSettings::ArgRequiredElseHelp) - .arg(Arg::with_name("host") - .required(true) - .index(1)) - .arg(Arg::with_name("username") - .required(true) - .index(2))) - .subcommand(SubCommand::with_name("disconnect"))) - .subcommand(SubCommand::with_name("channel") - .setting(AppSettings::ArgRequiredElseHelp) - .subcommand(SubCommand::with_name("list") - .arg(Arg::with_name("short") - .short("s") - .long("short"))) - .subcommand(SubCommand::with_name("connect") - .arg(Arg::with_name("channel") - .required(true)))) + .subcommand( + SubCommand::with_name("server") + .setting(AppSettings::ArgRequiredElseHelp) + .subcommand( + SubCommand::with_name("connect") + .setting(AppSettings::ArgRequiredElseHelp) + .arg(Arg::with_name("host").required(true).index(1)) + .arg(Arg::with_name("username").required(true).index(2)), + ) + .subcommand(SubCommand::with_name("disconnect")), + ) + .subcommand( + SubCommand::with_name("channel") + .setting(AppSettings::ArgRequiredElseHelp) + .subcommand( + SubCommand::with_name("list") + .arg(Arg::with_name("short").short("s").long("short")), + ) + .subcommand( + SubCommand::with_name("connect").arg(Arg::with_name("channel").required(true)), + ), + ) .subcommand(SubCommand::with_name("status")) .subcommand(SubCommand::with_name("config") .arg(Arg::with_name("name") @@ -53,7 +58,7 @@ fn main() { .long("fish"))); let matches = app.clone().get_matches(); - + if let Some(matches) = matches.subcommand_matches("server") { if let Some(matches) = matches.subcommand_matches("connect") { let host = matches.value_of("host").unwrap(); @@ -70,9 +75,12 @@ fn main() { } else if let Some(matches) = matches.subcommand_matches("channel") { if let Some(_matches) = matches.subcommand_matches("list") { match send_command(Command::ChannelList) { - Ok(res) => { - println!("{:#?}", res.unwrap()); - } + Ok(res) => match res { + Some(CommandResponse::ChannelList { channels }) => { + print_channel(&channels, 0); + } + _ => unreachable!(), + }, Err(e) => println!("{} {}", "error:".red(), e), } } else if let Some(matches) = matches.subcommand_matches("connect") { @@ -82,13 +90,36 @@ fn main() { } } else if let Some(_matches) = matches.subcommand_matches("status") { match send_command(Command::Status) { - Ok(res) => { - println!("{:#?}", res.unwrap()); - } + Ok(res) => match res { + Some(CommandResponse::Status { server_state }) => { + println!( + "Connected to {} as {}", + server_state.host, server_state.username + ); + let own_channel = server_state + .channels + .iter() + .find(|e| e.users.iter().any(|e| e.name == server_state.username)) + .unwrap(); + println!( + "Currently in {} with {} other client{}:", + own_channel.name, + own_channel.users.len() - 1, + if own_channel.users.len() == 2 { + "" + } else { + "s" + } + ); + println!("{}{}", INDENTATION, own_channel.name); + for user in &own_channel.users { + println!("{}{}{}", INDENTATION, INDENTATION, user); + } + } + _ => unreachable!(), + }, Err(e) => println!("{} {}", "error:".red(), e), } - let res = send_command(Command::Status).unwrap().unwrap(); - println!("{:#?}", res); } else if let Some(matches) = matches.subcommand_matches("config") { let name = matches.value_of("name").unwrap(); let value = matches.value_of("value").unwrap(); @@ -103,25 +134,22 @@ fn main() { } } } else if let Some(matches) = matches.subcommand_matches("completions") { - app.gen_completions_to("mumctl", - match matches.value_of("shell").unwrap_or("zsh") { - "bash" => { - Shell::Bash - }, - "fish" => { - Shell::Fish - }, - _ => { - Shell::Zsh - }, - }, - &mut io::stdout()); - return; + app.gen_completions_to( + "mumctl", + match matches.value_of("shell").unwrap_or("zsh") { + "bash" => Shell::Bash, + "fish" => Shell::Fish, + _ => Shell::Zsh, + }, + &mut io::stdout(), + ); + return; }; } fn send_command(command: Command) -> mumlib::error::Result<Option<CommandResponse>> { - let (tx_client, rx_client) = ipc::channel::<mumlib::error::Result<Option<CommandResponse>>>().unwrap(); + let (tx_client, rx_client) = + ipc::channel::<mumlib::error::Result<Option<CommandResponse>>>().unwrap(); let server_name = fs::read_to_string("/var/tmp/mumd-oneshot").unwrap(); //TODO don't panic @@ -131,3 +159,28 @@ fn send_command(command: Command) -> mumlib::error::Result<Option<CommandRespons rx_client.recv().unwrap() } + +fn print_channel(channel: &Channel, depth: usize) { + println!( + "{}{}{}", + iter::repeat(INDENTATION).take(depth).collect::<String>(), + channel.name.bold(), + if channel.max_users != 0 { + format!(" {}/{}", channel.users.len(), channel.max_users) + } else { + "".to_string() + } + ); + for user in &channel.users { + println!( + "{}-{}", + iter::repeat(INDENTATION) + .take(depth + 1) + .collect::<String>(), + user + ); + } + for child in &channel.children { + print_channel(child, depth + 1); + } +} |
