Skip to main content

rush_sync_server/commands/
parsing.rs

1/// Shared parsing utilities for bulk server operations (start, stop, etc.)
2
3#[derive(Debug)]
4pub enum BulkMode {
5    Single(String),
6    Range(u32, u32),
7    All,
8    Invalid(String),
9}
10
11/// Parse arguments for bulk server operations.
12/// Supports: "all", "1-3" (range), or single identifier.
13pub fn parse_bulk_args(args: &[&str]) -> BulkMode {
14    if args.len() != 1 {
15        return BulkMode::Invalid("Too many arguments".to_string());
16    }
17
18    let arg = args[0];
19
20    if arg.eq_ignore_ascii_case("all") {
21        return BulkMode::All;
22    }
23
24    // Range: "1-3" or "001-005"
25    if let Some((start_str, end_str)) = arg.split_once('-') {
26        match (start_str.parse::<u32>(), end_str.parse::<u32>()) {
27            (Ok(start), Ok(end)) => {
28                if start == 0 || end == 0 {
29                    return BulkMode::Invalid("Range indices must be > 0".to_string());
30                }
31                if start > end {
32                    return BulkMode::Invalid("Start must be <= end in range".to_string());
33                }
34                if end - start > 500 {
35                    return BulkMode::Invalid("Maximum 500 servers in range operation".to_string());
36                }
37                BulkMode::Range(start, end)
38            }
39            _ => BulkMode::Single(arg.to_string()),
40        }
41    } else {
42        BulkMode::Single(arg.to_string())
43    }
44}