#[macro_export]
macro_rules! deprecated_since {
($version:expr, $note:expr) => {
#[deprecated(since = $version, note = $note)]
};
}
#[macro_export]
macro_rules! experimental {
($since:expr, $note:expr) => {
#[doc = concat!("⚠️ **Experimental** (since ", $since, "): ", $note)]
};
}
#[macro_export]
macro_rules! breaking_change {
($version:expr, $change:expr) => {
#[doc = concat!("⚠️ **Breaking Change in ", $version, "**: ", $change)]
};
}
pub struct VersionChecker;
impl VersionChecker {
pub fn is_compatible(requested: &str, current: &str) -> Result<bool, String> {
let req_parts = parse_version(requested)?;
let cur_parts = parse_version(current)?;
Ok(req_parts.0 == cur_parts.0
&& (cur_parts.1 > req_parts.1
|| (cur_parts.1 == req_parts.1 && cur_parts.2 >= req_parts.2)))
}
}
fn parse_version(version: &str) -> Result<(u32, u32, u32), String> {
let parts: Vec<&str> = version.split('.').collect();
if parts.len() != 3 {
return Err(format!("Invalid version format: {}", version));
}
let major = parts[0]
.parse::<u32>()
.map_err(|_| format!("Invalid major version: {}", parts[0]))?;
let minor = parts[1]
.parse::<u32>()
.map_err(|_| format!("Invalid minor version: {}", parts[1]))?;
let patch = parts[2]
.parse::<u32>()
.map_err(|_| format!("Invalid patch version: {}", parts[2]))?;
Ok((major, minor, patch))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_version_compatibility_same_version() {
let requested = "1.0.0";
let current = "1.0.0";
let result = VersionChecker::is_compatible(requested, current);
assert!(result.unwrap());
}
#[test]
fn test_version_compatibility_minor_upgrade() {
let requested = "1.0.0";
let current = "1.2.0";
let result = VersionChecker::is_compatible(requested, current);
assert!(result.unwrap());
}
#[test]
fn test_version_compatibility_major_incompatible() {
let requested = "1.0.0";
let current = "2.0.0";
let result = VersionChecker::is_compatible(requested, current);
assert!(!result.unwrap());
}
#[test]
fn test_version_parsing_invalid_format() {
let invalid = "1.0";
let result = parse_version(invalid);
assert!(result.is_err());
assert!(result.unwrap_err().contains("Invalid version format"));
}
}