143 lines
3.9 KiB
Rust
143 lines
3.9 KiB
Rust
//! 宪法版本管理模块
|
|
|
|
use crate::{ConstitutionVersion, Result, Error};
|
|
|
|
/// 版本管理器
|
|
pub struct VersionManager {
|
|
versions: Vec<ConstitutionVersion>,
|
|
}
|
|
|
|
impl VersionManager {
|
|
/// 创建新的版本管理器
|
|
pub fn new() -> Self {
|
|
Self {
|
|
versions: Vec::new(),
|
|
}
|
|
}
|
|
|
|
/// 添加版本
|
|
pub fn add_version(&mut self, version: ConstitutionVersion) -> Result<()> {
|
|
version.validate()?;
|
|
|
|
// 检查版本号是否已存在
|
|
if self.versions.iter().any(|v| v.version == version.version) {
|
|
return Err(Error::VersionExists(version.version));
|
|
}
|
|
|
|
self.versions.push(version);
|
|
self.versions.sort_by(|a, b| a.version.cmp(&b.version));
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// 获取版本
|
|
pub fn get_version(&self, version: u64) -> Option<&ConstitutionVersion> {
|
|
self.versions.iter().find(|v| v.version == version)
|
|
}
|
|
|
|
/// 获取最新版本
|
|
pub fn get_latest_version(&self) -> Option<&ConstitutionVersion> {
|
|
self.versions.last()
|
|
}
|
|
|
|
/// 获取所有版本
|
|
pub fn get_all_versions(&self) -> &[ConstitutionVersion] {
|
|
&self.versions
|
|
}
|
|
|
|
/// 获取版本范围
|
|
pub fn get_version_range(&self, from: u64, to: u64) -> Vec<&ConstitutionVersion> {
|
|
self.versions
|
|
.iter()
|
|
.filter(|v| v.version >= from && v.version <= to)
|
|
.collect()
|
|
}
|
|
|
|
/// 检查版本是否存在
|
|
pub fn version_exists(&self, version: u64) -> bool {
|
|
self.versions.iter().any(|v| v.version == version)
|
|
}
|
|
|
|
/// 获取版本数量
|
|
pub fn version_count(&self) -> usize {
|
|
self.versions.len()
|
|
}
|
|
}
|
|
|
|
impl Default for VersionManager {
|
|
fn default() -> Self {
|
|
Self::new()
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
use nac_udm::primitives::{Hash, Address};
|
|
|
|
fn create_test_version(version: u64) -> ConstitutionVersion {
|
|
ConstitutionVersion::new(
|
|
version,
|
|
Hash::zero(),
|
|
version * 1000,
|
|
10,
|
|
version * 100,
|
|
Address::zero(),
|
|
format!("Version {}", version),
|
|
)
|
|
}
|
|
|
|
#[test]
|
|
fn test_add_version() {
|
|
let mut manager = VersionManager::new();
|
|
let version = create_test_version(1);
|
|
assert!(manager.add_version(version).is_ok());
|
|
assert_eq!(manager.version_count(), 1);
|
|
}
|
|
|
|
#[test]
|
|
fn test_duplicate_version() {
|
|
let mut manager = VersionManager::new();
|
|
let version = create_test_version(1);
|
|
assert!(manager.add_version(version.clone()).is_ok());
|
|
assert!(manager.add_version(version).is_err());
|
|
}
|
|
|
|
#[test]
|
|
fn test_get_version() {
|
|
let mut manager = VersionManager::new();
|
|
let version = create_test_version(1);
|
|
manager.add_version(version.clone()).unwrap();
|
|
|
|
let retrieved = manager.get_version(1);
|
|
assert!(retrieved.is_some());
|
|
assert_eq!(retrieved.unwrap().version, 1);
|
|
}
|
|
|
|
#[test]
|
|
fn test_get_latest_version() {
|
|
let mut manager = VersionManager::new();
|
|
manager.add_version(create_test_version(1)).unwrap();
|
|
manager.add_version(create_test_version(3)).unwrap();
|
|
manager.add_version(create_test_version(2)).unwrap();
|
|
|
|
let latest = manager.get_latest_version();
|
|
assert!(latest.is_some());
|
|
assert_eq!(latest.unwrap().version, 3);
|
|
}
|
|
|
|
#[test]
|
|
fn test_version_range() {
|
|
let mut manager = VersionManager::new();
|
|
manager.add_version(create_test_version(1)).unwrap();
|
|
manager.add_version(create_test_version(2)).unwrap();
|
|
manager.add_version(create_test_version(3)).unwrap();
|
|
manager.add_version(create_test_version(4)).unwrap();
|
|
|
|
let range = manager.get_version_range(2, 3);
|
|
assert_eq!(range.len(), 2);
|
|
assert_eq!(range[0].version, 2);
|
|
assert_eq!(range[1].version, 3);
|
|
}
|
|
}
|