summaryrefslogtreecommitdiffstats
path: root/src/bin/server/args.rs
diff options
context:
space:
mode:
authorsalmonik <salmonik@tuta.io>2026-10-28 22:55:51 +0100
committersalmonik <salmonik@tuta.io>2026-10-28 22:55:51 +0100
commit87440d5a23f0fd894d949295a7c1ff85043550fc (patch)
tree53b2bada6872b6e565bb79982213616a50419b1c /src/bin/server/args.rs
parentv0.3.1: clean up dependencies, stale tests and document verification (diff)
downloadzagan-bet-87440d5a23f0fd894d949295a7c1ff85043550fc.tar.gz
zagan-bet-87440d5a23f0fd894d949295a7c1ff85043550fc.zip
v0.4.0: add first-time TLS setup and server help
Diffstat (limited to '')
-rw-r--r--src/bin/server/args.rs85
1 files changed, 62 insertions, 23 deletions
diff --git a/src/bin/server/args.rs b/src/bin/server/args.rs
index fc844ea..1babd1d 100644
--- a/src/bin/server/args.rs
+++ b/src/bin/server/args.rs
@@ -2,6 +2,7 @@ pub struct Args {
2 pub ip: String, 2 pub ip: String,
3 pub port: u16, 3 pub port: u16,
4 pub unsafe_mode: bool, 4 pub unsafe_mode: bool,
5 pub init: bool,
5} 6}
6 7
7pub fn parse_args() -> Args { 8pub fn parse_args() -> Args {
@@ -9,42 +10,80 @@ pub fn parse_args() -> Args {
9 let mut ip = "127.0.0.1".to_string(); 10 let mut ip = "127.0.0.1".to_string();
10 let mut port = 11525; 11 let mut port = 11525;
11 let mut unsafe_mode = false; 12 let mut unsafe_mode = false;
13 let mut init = false;
12 let mut i = 1; 14 let mut i = 1;
15
13 while i < args.len() { 16 while i < args.len() {
14 if args[i] == "-p" { 17 match args[i].as_str() {
15 if i + 1 < args.len() { 18 "-p" => {
16 port = args[i + 1].parse::<u16>().unwrap_or_else(|_| { 19 if i + 1 < args.len() {
17 eprintln!("Invalid port number: {}", args[i + 1]); 20 port = args[i + 1].parse::<u16>().unwrap_or_else(|_| {
21 eprintln!("Invalid port number: {}", args[i + 1]);
22 std::process::exit(1);
23 });
24 i += 2;
25 } else {
26 eprintln!("-p requires a port number");
18 std::process::exit(1); 27 std::process::exit(1);
19 }); 28 }
20 i += 2;
21 } else {
22 eprintln!("-p requires a port number");
23 std::process::exit(1);
24 } 29 }
25 } else if args[i] == "-i" { 30 "-i" => {
26 if i + 1 < args.len() { 31 if i + 1 < args.len() {
27 ip = args[i + 1].clone(); 32 ip = args[i + 1].clone();
28 if ip != "127.0.0.1" && ip != "0.0.0.0" { 33 if ip != "127.0.0.1" && ip != "0.0.0.0" {
29 eprintln!("Invalid IP address: {}. Must be 127.0.0.1 or 0.0.0.0", ip); 34 eprintln!(
35 "Invalid IP address: {}. Must be 127.0.0.1 or 0.0.0.0",
36 ip
37 );
38 std::process::exit(1);
39 }
40 i += 2;
41 } else {
42 eprintln!("-i requires an IP address");
30 std::process::exit(1); 43 std::process::exit(1);
31 } 44 }
32 i += 2; 45 }
33 } else { 46 "--unsafe" => {
34 eprintln!("-i requires an IP address"); 47 unsafe_mode = true;
48 i += 1;
49 }
50 "--init" => {
51 init = true;
52 i += 1;
53 }
54 "-h" | "--help" => {
55 print_usage();
56 std::process::exit(0);
57 }
58 other => {
59 eprintln!("Unknown argument: {other}");
60 print_usage();
35 std::process::exit(1); 61 std::process::exit(1);
36 } 62 }
37 } else if args[i] == "--unsafe" {
38 unsafe_mode = true;
39 i += 1;
40 } else {
41 eprintln!("Unknown argument: {}", args[i]);
42 std::process::exit(1);
43 } 63 }
44 } 64 }
65
45 Args { 66 Args {
46 ip, 67 ip,
47 port, 68 port,
48 unsafe_mode, 69 unsafe_mode,
70 init,
49 } 71 }
50} 72}
73
74fn print_usage() {
75 println!(
76 "Usage: server [OPTIONS]\n\
77 \n\
78 Options:\n\
79 \x20 -i <ip> Bind address (127.0.0.1 or 0.0.0.0)\n\
80 \x20 -p <port> Bind port (default 11525)\n\
81 \x20 --init Generate identity.p12, key.pem and cert.pem, then exit\n\
82 \x20 --unsafe Run in unsafe mode (warning only)\n\
83 \x20 -h, --help Show this help\n\
84 \n\
85 First run:\n\
86 \x20 cargo run --bin server -- --init\n\
87 \x20 cargo run --bin server"
88 );
89}