use anyhow::Result;
use crate::version::Version;
use std::str::FromStr;
pub fn declare_tool_version(tool_name: &str, version: &str) -> Result<()> {
let _parsed = Version::from_str(version)
.map_err(|e| anyhow::anyhow!("Invalid version '{}' for tool '{}': {}", version, tool_name, e))?;
tracing::info!("📌 Tool '{}' declares version: {}", tool_name, version);
Ok(())
}
pub fn enforce_exact_version(tool_name: &str, expected: &str, actual: &str) {
if expected != actual {
panic!(
"❌ VERSION MISMATCH for '{}': expected '{}', found '{}'. Zero tolerance policy enforced.",
tool_name, expected, actual
);
}
tracing::debug!("✅ Version verified for '{}': {}", tool_name, expected);
}
pub fn require_forge_minimum(min_version: &str) -> Result<String> {
let _min = Version::from_str(min_version)?;
let code = format!(
r#"
fn main() {{
let forge_version = env!("CARGO_PKG_VERSION");
let min_required = "{}";
// In build.rs, you'd parse and compare versions
println!("cargo:warning=Requiring forge >= {{}}", min_required);
// Add this to Cargo.toml build-dependencies to actually enforce:
// dx-forge = {{ version = ">={}" }}
}}
"#,
min_version, min_version
);
Ok(code)
}
pub fn current_forge_version() -> Version {
Version::from_str(crate::VERSION)
.expect("Forge VERSION constant must be valid semver")
}
pub fn query_active_package_variant() -> Result<String> {
Ok("default".to_string())
}
pub fn activate_package_variant(variant_id: &str, preview_only: bool) -> Result<Vec<std::path::PathBuf>> {
tracing::info!("🔄 Activating package variant: {} (preview: {})", variant_id, preview_only);
if preview_only {
tracing::info!("👁️ Preview mode - no changes applied");
} else {
tracing::info!("✅ Variant '{}' activated", variant_id);
}
Ok(Vec::new())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_declare_tool_version() {
assert!(declare_tool_version("my-tool", "1.0.0").is_ok());
assert!(declare_tool_version("bad-tool", "not-a-version").is_err());
}
#[test]
fn test_current_forge_version() {
let version = current_forge_version();
assert!(version.major >= 0);
}
#[test]
fn test_query_active_variant() {
let variant = query_active_package_variant().unwrap();
assert_eq!(variant, "default");
}
#[test]
#[should_panic(expected = "VERSION MISMATCH")]
fn test_enforce_exact_version_panic() {
enforce_exact_version("tool", "1.0.0", "2.0.0");
}
}