| 1 | //! Shared helpers for core slash commands. |
| 2 | |
| 3 | pub(super) fn parse_depth_prefixed_arg( |
| 4 | arg: Option<&str>, |
| 5 | default_depth: u32, |
| 6 | ) -> Result<(u32, Option<&str>), String> { |
| 7 | let Some(raw) = arg.map(str::trim).filter(|raw| !raw.is_empty()) else { |
| 8 | return Ok((default_depth, None)); |
| 9 | }; |
| 10 | let mut parts = raw.splitn(2, char::is_whitespace); |
| 11 | let first = parts.next().unwrap_or_default(); |
| 12 | if first.chars().all(|ch| ch.is_ascii_digit()) { |
| 13 | let depth: u32 = first |
| 14 | .parse() |
| 15 | .map_err(|_| "Depth must be an integer from 0 to 3".to_string())?; |
| 16 | if depth > 3 { |
| 17 | return Err("Depth must be between 0 and 3".to_string()); |
| 18 | } |
| 19 | Ok((depth, parts.next().map(str::trim))) |
| 20 | } else { |
| 21 | Ok((default_depth, Some(raw))) |
| 22 | } |
| 23 | } |
| 24 |