use serde::{Deserialize, Serialize};
pub const PROTOCOL_VERSION: &str = "1.1.0";
pub const PROTOCOL_MAJOR: u32 = 1;
pub const PROTOCOL_MINOR: u32 = 1;
pub const PROTOCOL_PATCH: u32 = 0;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct VersionInfo {
pub version: String,
pub major: u32,
pub minor: u32,
pub patch: u32,
}
pub fn get_version() -> VersionInfo {
VersionInfo {
version: PROTOCOL_VERSION.to_string(),
major: PROTOCOL_MAJOR,
minor: PROTOCOL_MINOR,
patch: PROTOCOL_PATCH,
}
}
pub fn is_compatible(manifest_version: &str) -> bool {
let parts: Vec<&str> = manifest_version.split('.').collect();
if parts.len() != 3 {
return false;
}
let major = parts[0].parse::<u32>().ok();
let minor = parts[1].parse::<u32>().ok();
match (major, minor) {
(Some(major), Some(minor)) => {
if major != PROTOCOL_MAJOR {
return false;
}
minor <= PROTOCOL_MINOR
}
_ => false,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_get_version() {
let version = get_version();
assert_eq!(version.version, "1.1.0");
assert_eq!(version.major, 1);
assert_eq!(version.minor, 1);
assert_eq!(version.patch, 0);
}
#[test]
fn test_is_compatible() {
assert!(is_compatible("1.0.0"));
assert!(is_compatible("1.0.1"));
assert!(is_compatible("1.0.99"));
assert!(!is_compatible("2.0.0"));
assert!(!is_compatible("0.9.0"));
assert!(is_compatible("1.1.0"));
assert!(!is_compatible("1.2.0"));
assert!(!is_compatible("1.0"));
assert!(!is_compatible("1"));
assert!(!is_compatible("invalid"));
assert!(!is_compatible(""));
}
}