pub const LATEST_PROTOCOL_VERSION: &str = "2025-11-25";
pub const DEFAULT_PROTOCOL_VERSION: &str = "2025-03-26";
pub const SUPPORTED_PROTOCOL_VERSIONS: &[&str] = &[
LATEST_PROTOCOL_VERSION,
"2025-06-18",
DEFAULT_PROTOCOL_VERSION,
"2024-11-05",
];
pub const PROTOCOL_VERSION_2026_07_28: &str = "2026-07-28";
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Era {
V1,
V2,
}
pub fn protocol_era(version: &str) -> Era {
if version == PROTOCOL_VERSION_2026_07_28 {
Era::V2
} else {
Era::V1
}
}
pub fn negotiate_protocol_version(client_version: &str) -> &str {
if SUPPORTED_PROTOCOL_VERSIONS.contains(&client_version) {
client_version
} else {
LATEST_PROTOCOL_VERSION
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn latest_version_is_2025_11_25() {
assert_eq!(LATEST_PROTOCOL_VERSION, "2025-11-25");
}
#[test]
fn supports_four_versions_including_2024() {
assert_eq!(SUPPORTED_PROTOCOL_VERSIONS.len(), 4);
assert!(SUPPORTED_PROTOCOL_VERSIONS.contains(&"2025-11-25"));
assert!(SUPPORTED_PROTOCOL_VERSIONS.contains(&"2025-06-18"));
assert!(SUPPORTED_PROTOCOL_VERSIONS.contains(&"2025-03-26"));
assert!(SUPPORTED_PROTOCOL_VERSIONS.contains(&"2024-11-05"));
}
#[test]
fn rejects_unknown_2024_versions() {
assert!(!SUPPORTED_PROTOCOL_VERSIONS.contains(&"2024-10-07"));
}
#[test]
fn negotiate_supported_version_echoes_back() {
assert_eq!(negotiate_protocol_version("2025-11-25"), "2025-11-25");
assert_eq!(negotiate_protocol_version("2025-06-18"), "2025-06-18");
assert_eq!(negotiate_protocol_version("2025-03-26"), "2025-03-26");
assert_eq!(negotiate_protocol_version("2024-11-05"), "2024-11-05");
}
#[test]
fn negotiate_unsupported_returns_latest() {
assert_eq!(negotiate_protocol_version("2024-10-07"), "2025-11-25");
assert_eq!(negotiate_protocol_version("unknown"), "2025-11-25");
}
#[test]
fn v2_constant_is_not_in_legacy_supported_set() {
assert_eq!(PROTOCOL_VERSION_2026_07_28, "2026-07-28");
assert!(!SUPPORTED_PROTOCOL_VERSIONS.contains(&PROTOCOL_VERSION_2026_07_28));
}
#[test]
fn negotiate_never_upgrades_legacy_client_to_v2() {
assert_ne!(
negotiate_protocol_version("2026-07-28"),
PROTOCOL_VERSION_2026_07_28
);
assert_eq!(
negotiate_protocol_version("2026-07-28"),
LATEST_PROTOCOL_VERSION
);
}
#[test]
fn protocol_era_classifies_2026_07_28_as_v2() {
assert_eq!(protocol_era("2026-07-28"), Era::V2);
assert_eq!(protocol_era(PROTOCOL_VERSION_2026_07_28), Era::V2);
}
#[test]
fn protocol_era_classifies_known_v1_versions_as_v1() {
assert_eq!(protocol_era("2025-11-25"), Era::V1);
assert_eq!(protocol_era("2025-06-18"), Era::V1);
assert_eq!(protocol_era("2025-03-26"), Era::V1);
assert_eq!(protocol_era("2024-11-05"), Era::V1);
}
#[test]
fn protocol_era_classifies_unknown_as_v1() {
assert_eq!(protocol_era("unknown"), Era::V1);
assert_eq!(protocol_era(""), Era::V1);
assert_eq!(protocol_era("2027-01-01"), Era::V1);
assert_eq!(protocol_era("2026-07-29"), Era::V1);
}
}