//! Installed kigi CLI version, lockstepped with shipping binaries. use semver::Version; pub const TEST_VERSION_ENV: &str = "KIGI_TEST_VERSION"; pub const VERSION: &str = match option_env!("KIGI_VERSION") { Some(v) => v, None => env!("CARGO_PKG_VERSION"), }; /// [`TEST_VERSION_ENV`] override first, then [`VERSION`]. Trimmed so /// non-semver-aware callers can pass the result straight into parsing. pub fn installed() -> String { std::env::var(TEST_VERSION_ENV) .map(|v| v.trim().to_string()) .unwrap_or_else(|_| VERSION.to_string()) } pub fn installed_semver() -> Result { Version::parse(&installed()) } /// Format the compiled version with a channel label for user-facing display. /// /// `channel_label` is a pre-formatted suffix such as `" [alpha]"`, `" [stable]"`, /// or `""` (empty when no cached pointer is available). Obtain it from /// `kigi_update::channel_label()`. /// /// Example: `"0.2.5 [stable]"` or `"0.2.5 [alpha]"`. pub fn display_version(channel_label: &str) -> String { format!("{}{}", VERSION, channel_label) } /// Format a version-with-commit string with a channel label. /// /// Same semantics as [`display_version`] but for the full /// `"0.2.5 (abc1234)"` string. pub fn display_version_with_commit(version_with_commit: &str, channel_label: &str) -> String { format!("{}{}", version_with_commit, channel_label) } #[cfg(test)] mod tests { use super::*; /// Display formatting invariant matrix — verifies label appending /// works correctly across all label states (alpha, stable, empty). #[test] fn test_display_version_formatting_matrix() { let cases: &[(&str, &str, &str)] = &[ // (version_with_commit, label, expected_suffix) ("0.2.5 (abc1234)", " [alpha]", "0.2.5 (abc1234) [alpha]"), ("0.2.5 (abc1234)", " [stable]", "0.2.5 (abc1234) [stable]"), ("0.2.5 (abc1234)", "", "0.2.5 (abc1234)"), ( "0.1.220-alpha.2 (def0)", " [alpha]", "0.1.220-alpha.2 (def0) [alpha]", ), ]; for (vwc, label, expected) in cases { assert_eq!( display_version_with_commit(vwc, label), *expected, "display_version_with_commit({:?}, {:?})", vwc, label, ); } // display_version uses compiled VERSION — just verify the label appends assert_eq!(display_version(""), VERSION); assert!(display_version(" [stable]").ends_with("[stable]")); } }