#!/usr/bin/env rust-script
use regex::Regex;
struct Version {
major: u32,
minor: u32,
patch: u32,
pre_release: Option<String>,
}
impl Version {
fn parse(content: &str) -> Option<Version> {
let re = Regex::new(r#"(?m)^version\s*=\s*"(\d+)\.(\d+)\.(\d+)(?:-([^"]+))?""#).ok()?;
let caps = re.captures(content)?;
Some(Version {
major: caps.get(1)?.as_str().parse().ok()?,
minor: caps.get(2)?.as_str().parse().ok()?,
patch: caps.get(3)?.as_str().parse().ok()?,
pre_release: caps.get(4).map(|m| m.as_str().to_string()),
})
}
fn bump(&self, bump_type: &str) -> String {
match bump_type {
"major" => format!("{}.0.0", self.major + 1),
"minor" => format!("{}.{}.0", self.major, self.minor + 1),
_ => format!("{}.{}.{}", self.major, self.minor, self.patch + 1),
}
}
fn to_string(&self) -> String {
match &self.pre_release {
Some(pre) => format!("{}.{}.{}-{}", self.major, self.minor, self.patch, pre),
None => format!("{}.{}.{}", self.major, self.minor, self.patch),
}
}
}
fn test_case(content: &str, expected_version: &str, expected_minor_bump: &str) {
match Version::parse(content) {
Some(v) => {
let actual = v.to_string();
let bumped = v.bump("minor");
let version_ok = actual == expected_version;
let bump_ok = bumped == expected_minor_bump;
println!(
"{} parse '{}' => '{}' (expected '{}')",
if version_ok { "PASS" } else { "FAIL" },
content.trim(),
actual,
expected_version
);
println!(
"{} minor bump '{}' => '{}' (expected '{}')",
if bump_ok { "PASS" } else { "FAIL" },
actual,
bumped,
expected_minor_bump
);
}
None => {
println!("FAIL parse '{}' => None (expected '{}')", content.trim(), expected_version);
}
}
println!();
}
fn main() {
println!("=== Version Parsing Tests (Issue #10 Fix) ===\n");
test_case(
"version = \"1.2.3\"\n",
"1.2.3",
"1.3.0",
);
test_case(
"version = \"0.1.0-beta.1\"\n",
"0.1.0-beta.1",
"0.2.0",
);
test_case(
"version = \"1.0.0-alpha\"\n",
"1.0.0-alpha",
"1.1.0",
);
test_case(
"version = \"2.0.0-rc.1\"\n",
"2.0.0-rc.1",
"2.1.0",
);
let cargo_toml = r#"[package]
name = "platform-trees"
version = "0.1.0-beta.1"
edition = "2021"
"#;
test_case(cargo_toml, "0.1.0-beta.1", "0.2.0");
println!("=== All tests completed ===");
}