use std::collections::HashMap;
use live_data::{FeedDescriptor, FeedManifest};
use crate::validate::{ValidationError, validate_descriptor};
#[derive(Debug, Clone)]
pub struct ManifestRegistry {
server_version: String,
feeds: HashMap<String, FeedDescriptor>,
order: Vec<String>,
}
impl ManifestRegistry {
pub fn new(server_version: impl Into<String>) -> Self {
Self {
server_version: server_version.into(),
feeds: HashMap::new(),
order: Vec::new(),
}
}
pub fn server_version(&self) -> &str {
&self.server_version
}
pub fn register(&mut self, d: FeedDescriptor) -> Result<(), ValidationError> {
validate_descriptor(&d)?;
if self.feeds.contains_key(&d.name) {
return Err(ValidationError::DuplicateFeedName(d.name));
}
self.order.push(d.name.clone());
self.feeds.insert(d.name.clone(), d);
Ok(())
}
pub fn unregister(&mut self, name: &str) -> Option<FeedDescriptor> {
let descriptor = self.feeds.remove(name)?;
self.order.retain(|n| n != name);
Some(descriptor)
}
pub fn get(&self, name: &str) -> Option<&FeedDescriptor> {
self.feeds.get(name)
}
pub fn feed_names(&self) -> impl Iterator<Item = &str> {
self.order.iter().map(String::as_str)
}
pub fn len(&self) -> usize {
self.order.len()
}
pub fn is_empty(&self) -> bool {
self.order.is_empty()
}
pub fn manifest(&self) -> FeedManifest {
let feeds = self
.order
.iter()
.filter_map(|n| self.feeds.get(n).cloned())
.collect();
FeedManifest::new(self.server_version.clone(), feeds)
}
pub fn manifest_json(&self) -> serde_json::Result<String> {
serde_json::to_string(&self.manifest())
}
pub fn manifest_json_pretty(&self) -> serde_json::Result<String> {
serde_json::to_string_pretty(&self.manifest())
}
}