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 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");
}
}