use crate::{
cdk::structures::{DefaultMemoryImpl, memory::VirtualMemory},
storage::{prelude::*, stable::memory::topology::SUBNET_INDEX_ID},
};
use ic_memory::stable_structures::btreemap::BTreeMap as StableBtreeMap;
use std::cell::RefCell;
eager_static! {
static SUBNET_INDEX: RefCell<StableBtreeMap<CanisterRole, Principal, VirtualMemory<DefaultMemoryImpl>>> =
RefCell::new(StableBtreeMap::init(crate::ic_memory_key!("canic.core.subnet_index.v1", SubnetIndex, SUBNET_INDEX_ID)));
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct SubnetIndexRecord {
pub entries: Vec<(CanisterRole, Principal)>,
}
pub struct SubnetIndex;
impl SubnetIndex {
#[must_use]
pub(crate) fn export() -> SubnetIndexRecord {
SubnetIndexRecord {
entries: SUBNET_INDEX.with_borrow(|map| {
map.iter()
.map(|entry| (entry.key().clone(), entry.value()))
.collect()
}),
}
}
pub(crate) fn import(data: SubnetIndexRecord) {
SUBNET_INDEX.with_borrow_mut(|map| {
map.clear_new();
for (role, pid) in data.entries {
map.insert(role, pid);
}
});
}
}