use indexmap::IndexMap;
use crate::admin::helper::resource_entry::ResourceEntry;
use crate::admin::resource::DisplayConfig;
#[derive(Default)]
pub struct AdminRegistry {
pub resources: IndexMap<String, ResourceEntry>,
}
impl AdminRegistry {
pub fn new() -> Self {
Self {
resources: IndexMap::new(),
}
}
pub fn register(&mut self, entry: ResourceEntry) {
self.resources.insert(entry.meta.key.to_string(), entry);
}
pub fn get(&self, key: &str) -> Option<&ResourceEntry> {
self.resources.get(key)
}
pub fn all(&self) -> impl Iterator<Item = &ResourceEntry> {
self.resources.values()
}
pub fn is_empty(&self) -> bool {
self.resources.is_empty()
}
pub fn len(&self) -> usize {
self.resources.len()
}
pub fn contains(&self, key: &str) -> bool {
self.resources.contains_key(key)
}
pub fn keys(&self) -> Vec<&str> {
self.resources.keys().map(|k| k.as_str()).collect()
}
pub fn configure(&mut self, key: &str, display: DisplayConfig) {
if let Some(entry) = self.resources.get_mut(key) {
entry.meta.display = display;
}
}
pub fn reorder(&mut self, order: &[String]) {
let mut reordered = indexmap::IndexMap::new();
for key in order {
if let Some(entry) = self.resources.shift_remove(key.as_str()) {
reordered.insert(key.clone(), entry);
}
}
for (key, entry) in std::mem::take(&mut self.resources) {
reordered.insert(key, entry);
}
self.resources = reordered;
}
}