workspacer_cli/
bump_release_arg.rs

1// ---------------- [ File: workspacer-cli/src/bump_release_arg.rs ]
2crate::ix!();
3
4/// A helper struct for specifying how to bump version (major, minor, patch, alphaN).
5/// Example CLI usage: `--release patch` or `--release alpha=3`
6#[derive(Debug,Clone)]
7pub struct ReleaseArg(pub ReleaseType);
8
9impl FromStr for ReleaseArg {
10    type Err = String;
11
12    /// Parses something like "major", "minor", "patch", or "alpha[=N]"
13    /// Example valid inputs:
14    ///   - "major"
15    ///   - "minor"
16    ///   - "patch"
17    ///   - "alpha"
18    ///   - "alpha=1", "alpha=7", ...
19    fn from_str(s: &str) -> Result<Self, Self::Err> {
20        let lower = s.to_lowercase();
21        if lower == "major" {
22            Ok(ReleaseArg(ReleaseType::Major))
23        } else if lower == "minor" {
24            Ok(ReleaseArg(ReleaseType::Minor))
25        } else if lower == "patch" {
26            Ok(ReleaseArg(ReleaseType::Patch))
27        } else if lower.starts_with("alpha") {
28            // might be just "alpha" or "alpha=NUM"
29            let parts: Vec<_> = lower.splitn(2, '=').collect();
30            if parts.len() == 1 {
31                // just "alpha"
32                Ok(ReleaseArg(ReleaseType::Alpha(None)))
33            } else {
34                // alpha=NUM
35                let maybe_num = parts[1].parse::<u64>().map_err(|e| format!("Invalid number in alpha=NN: {e}"))?;
36                Ok(ReleaseArg(ReleaseType::Alpha(Some(maybe_num))))
37            }
38        } else {
39            Err(format!("Unsupported release type: '{s}' (valid: major|minor|patch|alpha[=N])"))
40        }
41    }
42}