diff options
author | Tom Smeding <tom.smeding@gmail.com> | 2020-10-13 21:46:42 +0200 |
---|---|---|
committer | Tom Smeding <tom.smeding@gmail.com> | 2021-01-28 22:20:13 +0100 |
commit | 9d5bd561419e1145aea81ee820bc3e8405c4fd57 (patch) | |
tree | c49a8311ee45feb55d4534152f71928a713329c3 /rust/src/main.rs | |
parent | 5c762eaf2310d72b7c5c7d2ba497d94c6441126a (diff) |
rust: Server and account command-line arguments
Diffstat (limited to 'rust/src/main.rs')
-rw-r--r-- | rust/src/main.rs | 54 |
1 files changed, 50 insertions, 4 deletions
diff --git a/rust/src/main.rs b/rust/src/main.rs index f7a2660..8c7e617 100644 --- a/rust/src/main.rs +++ b/rust/src/main.rs @@ -3,6 +3,7 @@ use std::collections::{HashMap, HashSet}; use std::io::{self, Write}; use std::sync::{Arc, Mutex}; use std::convert::TryFrom; +use argparse::{ArgumentParser, Store, StoreOption}; use futures::channel::mpsc; use futures::stream::StreamExt; use once_cell::sync::Lazy; @@ -22,6 +23,7 @@ mod auth; mod bel; mod editor; mod error; +mod getpass; static DEBUG_FILE: Lazy<Mutex<Option<File>>> = Lazy::new(|| { Mutex::new( @@ -624,14 +626,58 @@ async fn pushchan_thread(mut chan: mpsc::Receiver<PushMessage>, app: Arc<App>) { } } +struct Options { + server: String, + username: Option<String>, +} + +impl Default for Options { + fn default() -> Self { + Self { server: String::from("127.0.0.1:29538"), username: None } + } +} + +fn parse_options() -> Options { + let mut options = Options::default(); + let defserver = options.server.clone(); + let server_descr = format!("Address (host:port) of tomsg server (default: {})", defserver); + + { + let mut ap = ArgumentParser::new(); + ap.set_description("Simple client for tomsg with auto-generated credentials."); + + ap.refer(&mut options.server) + .add_option(&["-s", "--server"], Store, &server_descr) + .metavar("ADDR"); + ap.refer(&mut options.username) + .add_option(&["-u", "--user"], StoreOption, + "Username to connect as (if given, will prompt for password on stdin) (default: current system username)") + .metavar("USER"); + + ap.parse_args_or_exit(); + } + options +} + async fn async_main() -> io::Result<()> { - let addr = ("127.0.0.1", 29538); - let (conn, pushchan) = Connection::connect(connection::Type::Plain, addr).await?; + let options = parse_options(); + + let (conn, pushchan) = Connection::connect(connection::Type::Plain, options.server).await?; let (user, pass) = auth::get_auth_info()?; - let user = Word::try_from(user.to_string()).unwrap(); - let pass = Line::try_from(pass.to_string()).unwrap(); + let (user, pass) = match options.username { + None => (Word::try_from(user.to_string()).unwrap() + ,Line::try_from(pass.to_string()).unwrap()), + Some(user) => { + let pass = getpass::get_pass(&format!("Password for user '{}': ", user))?; + if pass.len() == 0 { + println!("Cancelled."); + std::process::exit(1); + } + (Word::try_from(user).unwrap(), Line::try_from(pass).unwrap()) + } + }; send_command(&conn, Command::Register { username: user.clone(), password: pass.clone() }).await?; |