use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use super::types::ModelEntry;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct RegistryManifest {
pub models: Vec<ModelEntry>,
pub last_sync: Option<DateTime<Utc>>,
pub version: String,
}
impl RegistryManifest {
pub fn new() -> Self {
Self { models: Vec::new(), last_sync: None, version: "1.0".to_string() }
}
pub fn add(&mut self, entry: ModelEntry) {
if let Some(existing) = self.models.iter_mut().find(|m| m.name == entry.name) {
*existing = entry;
} else {
self.models.push(entry);
}
}
pub fn find(&self, name: &str) -> Option<&ModelEntry> {
self.models.iter().find(|m| m.name == name)
}
pub fn find_mut(&mut self, name: &str) -> Option<&mut ModelEntry> {
self.models.iter_mut().find(|m| m.name == name)
}
pub fn available(&self) -> Vec<&ModelEntry> {
self.models.iter().filter(|m| m.is_local()).collect()
}
pub fn mark_synced(&mut self) {
self.last_sync = Some(Utc::now());
}
pub fn total_size_bytes(&self) -> u64 {
self.models.iter().map(|m| m.size_bytes).sum()
}
pub fn len(&self) -> usize {
self.models.len()
}
pub fn is_empty(&self) -> bool {
self.models.is_empty()
}
}