//! 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 /// callers can pass the result straight into semver 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()) } /// `channel_label` is a pre-formatted suffix such as `" [alpha]"`, or `""` when /// no cached pointer is available. Obtain it from `kigi_update::channel_label()`. pub fn display_version(channel_label: &str) -> String { format!("{}{}", VERSION, channel_label) } 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::*; #[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 reads the compiled VERSION, so only the suffix is assertable. assert_eq!(display_version(""), VERSION); assert!(display_version(" [stable]").ends_with("[stable]")); } }