1use anyhow::Result;
4use crate::version::Version;
5use std::str::FromStr;
6
7pub fn declare_tool_version(tool_name: &str, version: &str) -> Result<()> {
16 let _parsed = Version::from_str(version)
17 .map_err(|e| anyhow::anyhow!("Invalid version '{}' for tool '{}': {}", version, tool_name, e))?;
18
19 tracing::info!("📌 Tool '{}' declares version: {}", tool_name, version);
20 Ok(())
21}
22
23pub fn enforce_exact_version(tool_name: &str, expected: &str, actual: &str) {
36 if expected != actual {
37 panic!(
38 "❌ VERSION MISMATCH for '{}': expected '{}', found '{}'. Zero tolerance policy enforced.",
39 tool_name, expected, actual
40 );
41 }
42 tracing::debug!("✅ Version verified for '{}': {}", tool_name, expected);
43}
44
45pub fn require_forge_minimum(min_version: &str) -> Result<String> {
56 let _min = Version::from_str(min_version)?;
57
58 let code = format!(
59 r#"
60fn main() {{
61 let forge_version = env!("CARGO_PKG_VERSION");
62 let min_required = "{}";
63
64 // In build.rs, you'd parse and compare versions
65 println!("cargo:warning=Requiring forge >= {{}}", min_required);
66
67 // Add this to Cargo.toml build-dependencies to actually enforce:
68 // dx-forge = {{ version = ">={}" }}
69}}
70"#,
71 min_version, min_version
72 );
73
74 Ok(code)
75}
76
77pub fn current_forge_version() -> Version {
82 Version::from_str(crate::VERSION)
83 .expect("Forge VERSION constant must be valid semver")
84}
85
86pub fn query_active_package_variant() -> Result<String> {
93 Ok("default".to_string())
96}
97
98pub fn activate_package_variant(variant_id: &str, preview_only: bool) -> Result<Vec<std::path::PathBuf>> {
110 tracing::info!("🔄 Activating package variant: {} (preview: {})", variant_id, preview_only);
111
112 if preview_only {
120 tracing::info!("👁️ Preview mode - no changes applied");
121 } else {
122 tracing::info!("✅ Variant '{}' activated", variant_id);
123 }
124
125 Ok(Vec::new())
126}
127
128#[cfg(test)]
129mod tests {
130 use super::*;
131
132 #[test]
133 fn test_declare_tool_version() {
134 assert!(declare_tool_version("my-tool", "1.0.0").is_ok());
135 assert!(declare_tool_version("bad-tool", "not-a-version").is_err());
136 }
137
138 #[test]
139 fn test_current_forge_version() {
140 let version = current_forge_version();
141 assert!(version.major >= 0);
142 }
143
144 #[test]
145 fn test_query_active_variant() {
146 let variant = query_active_package_variant().unwrap();
147 assert_eq!(variant, "default");
148 }
149
150 #[test]
151 #[should_panic(expected = "VERSION MISMATCH")]
152 fn test_enforce_exact_version_panic() {
153 enforce_exact_version("tool", "1.0.0", "2.0.0");
154 }
155}