diff options
| author | Gustav Sörnäs <gustav@sornas.net> | 2020-10-16 01:35:59 +0200 |
|---|---|---|
| committer | Gustav Sörnäs <gustav@sornas.net> | 2020-10-16 01:35:59 +0200 |
| commit | 18a3c0b3cf8254b70857e31ddd2b6213b10db156 (patch) | |
| tree | 07f7020aaf096b0ed58792ad78527d34f94e4f96 /mumctl | |
| parent | 8e4eb0afcd0541c6732ebec71af76f3962f590cc (diff) | |
| parent | d35c9171271110339504abd96065dc25e1290500 (diff) | |
| download | mum-18a3c0b3cf8254b70857e31ddd2b6213b10db156.tar.gz | |
Merge branch 'cli' into 'main'
mumctl
See merge request gustav/mum!2
Diffstat (limited to 'mumctl')
| -rw-r--r-- | mumctl/Cargo.toml | 9 | ||||
| -rw-r--r-- | mumctl/src/main.rs | 103 |
2 files changed, 108 insertions, 4 deletions
diff --git a/mumctl/Cargo.toml b/mumctl/Cargo.toml index fca5037..1f2f727 100644 --- a/mumctl/Cargo.toml +++ b/mumctl/Cargo.toml @@ -9,7 +9,10 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -#clap = "2.33" +mumlib = { path = "../mumlib" } + +clap = { version = "2.33", features = ["yaml"] } +log = "0.4" +ipc-channel = "0.14" + #cursive = "0.15" -#ipc-channel = "0.14" -#serde = { version = "1.0", features = ["derive"] } diff --git a/mumctl/src/main.rs b/mumctl/src/main.rs index e7a11a9..124cc8c 100644 --- a/mumctl/src/main.rs +++ b/mumctl/src/main.rs @@ -1,3 +1,104 @@ +use clap::{App, AppSettings, Arg, Shell, SubCommand}; +use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; +use log::*; +use mumlib::command::{Command, CommandResponse}; +use mumlib::setup_logger; +use std::{fs, io}; + fn main() { - println!("Hello, world!"); + setup_logger(); + debug!("Logger up!"); + + 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("status")) + .subcommand(SubCommand::with_name("completions") + .arg(Arg::with_name("zsh") + .long("zsh")) + .arg(Arg::with_name("bash") + .long("bash")) + .arg(Arg::with_name("fish") + .long("fish"))); + + let matches = app.clone().get_matches(); + + debug!("Matching clap"); + if let Some(matches) = matches.subcommand_matches("server") { + if let Some(matches) = matches.subcommand_matches("connect") { + let host = matches.value_of("host").unwrap(); + let username = matches.value_of("username").unwrap(); + send_command(Command::ServerConnect { + host: host.to_string(), + port: 64738u16, //TODO + username: username.to_string(), + accept_invalid_cert: true, //TODO + }).unwrap(); + } else if let Some(_) = matches.subcommand_matches("disconnect") { + send_command(Command::ServerDisconnect).unwrap(); + } + } else if let Some(matches) = matches.subcommand_matches("channel") { + if let Some(_matches) = matches.subcommand_matches("list") { + let res = send_command(Command::ChannelList).unwrap().unwrap(); + println!("{:#?}", res); + /*if matches.is_present("short") { + None //TODO + } else { + None //TODO + };*/ + } else if let Some(matches) = matches.subcommand_matches("connect") { + send_command(Command::ChannelJoin { + channel_id: matches.value_of("channel").unwrap().parse::<u32>().unwrap() + }).unwrap(); + } + } else if let Some(_matches) = matches.subcommand_matches("status") { + let res = send_command(Command::Status).unwrap().unwrap(); + println!("{:#?}", res); + } 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; + }; +} + +fn send_command(command: Command) -> Result<Option<CommandResponse>, ()> { + let (tx_client, rx_client): (IpcSender<Result<Option<CommandResponse>, ()>>, + IpcReceiver<Result<Option<CommandResponse>, ()>>) = ipc::channel().unwrap(); + + let server_name = fs::read_to_string("/var/tmp/mumd-oneshot").unwrap(); //TODO don't panic + + let tx0 = IpcSender::connect(server_name).unwrap(); + tx0.send((command, tx_client)).unwrap(); + + rx_client.recv().unwrap() } |
