use crate::{
cdk::structures::{DefaultMemoryImpl, cell::Cell, memory::VirtualMemory},
role_contract::allocation::memory::env::SUBNET_STATE_ID,
storage::prelude::*,
};
use std::cell::RefCell;
eager_static! {
static SUBNET_STATE: RefCell<Cell<SubnetStateRecord, VirtualMemory<DefaultMemoryImpl>>> =
RefCell::new(Cell::init(
crate::ic_memory_key!(authority = CANIC_CORE_MEMORY_AUTHORITY, key = "canic.core.subnet_state.v1", ty = SubnetState, id = SUBNET_STATE_ID),
SubnetStateRecord::default(),
));
}
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct SubnetAuthStateRecord {}
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct SubnetStateRecord {
pub auth: SubnetAuthStateRecord,
}
impl_storable_bounded!(SubnetStateRecord, 1024, true);
impl SubnetStateRecord {
pub const STATE_CONTRACT_NAME: &'static str = "SubnetStateRecord";
}
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct SubnetStateData {
pub record: SubnetStateRecord,
}
impl SubnetStateData {
pub const STATE_CONTRACT_NAME: &'static str = "SubnetStateData";
}
pub struct SubnetState;
impl SubnetState {
pub(crate) fn import(data: SubnetStateData) {
SUBNET_STATE.with_borrow_mut(|cell| cell.set(data.record));
}
#[must_use]
pub(crate) fn export() -> SubnetStateData {
SubnetStateData {
record: SUBNET_STATE.with_borrow(|cell| cell.get().clone()),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn subnet_state_round_trip() {
let record = SubnetStateRecord {
auth: SubnetAuthStateRecord {},
};
SubnetState::import(SubnetStateData {
record: record.clone(),
});
assert_eq!(SubnetState::export(), SubnetStateData { record });
}
}