ic_memory/slot/
memory_manager.rs1use super::id_range::MemoryManagerIdRange;
2use serde::{Deserialize, Serialize};
3
4#[derive(Clone, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
18#[serde(try_from = "u8", into = "u8")]
19pub struct MemoryManagerSlot(u8);
20
21impl MemoryManagerSlot {
22 pub const fn new(id: u8) -> Result<Self, MemoryManagerSlotError> {
24 match validate_memory_manager_id(id) {
25 Ok(()) => Ok(Self(id)),
26 Err(error) => Err(error),
27 }
28 }
29
30 #[must_use]
32 pub const fn id(&self) -> u8 {
33 self.0
34 }
35}
36
37impl From<MemoryManagerSlot> for u8 {
38 fn from(slot: MemoryManagerSlot) -> Self {
39 slot.id()
40 }
41}
42
43impl TryFrom<u8> for MemoryManagerSlot {
44 type Error = MemoryManagerSlotError;
45
46 fn try_from(id: u8) -> Result<Self, Self::Error> {
47 Self::new(id)
48 }
49}
50
51pub const LEDGER_SLOT: MemoryManagerSlot = match MemoryManagerSlot::new(MEMORY_MANAGER_LEDGER_ID) {
52 Ok(slot) => slot,
53 Err(_) => panic!("the ledger ID must be usable"),
54};
55
56pub const MEMORY_MANAGER_MIN_ID: u8 = 0;
58
59pub const MEMORY_MANAGER_MAX_ID: u8 = 254;
61
62pub const MEMORY_MANAGER_INVALID_ID: u8 = u8::MAX;
64
65pub const IC_MEMORY_STABLE_KEY_PREFIX: &str = "ic_memory.";
67
68pub const IC_MEMORY_AUTHORITY_OWNER: &str = "ic-memory";
70
71pub const IC_MEMORY_LEDGER_STABLE_KEY: &str = "ic_memory.ledger.v1";
73
74pub const MEMORY_MANAGER_LEDGER_ID: u8 = MEMORY_MANAGER_MIN_ID;
76
77pub const MEMORY_MANAGER_GOVERNANCE_MAX_ID: u8 = 9;
79
80#[must_use]
82pub fn is_ic_memory_stable_key(stable_key: &str) -> bool {
83 stable_key.starts_with(IC_MEMORY_STABLE_KEY_PREFIX)
84}
85
86#[must_use]
88pub const fn memory_manager_governance_range() -> MemoryManagerIdRange {
89 const RANGE: MemoryManagerIdRange =
90 match MemoryManagerIdRange::new(MEMORY_MANAGER_MIN_ID, MEMORY_MANAGER_GOVERNANCE_MAX_ID) {
91 Ok(range) => range,
92 Err(_) => panic!("the governance range must be usable"),
93 };
94 RANGE
95}
96
97#[non_exhaustive]
104#[derive(Clone, Debug, Eq, thiserror::Error, PartialEq)]
105pub enum MemoryManagerSlotError {
106 #[error("MemoryManager ID {id} is not a usable allocation slot")]
108 InvalidMemoryManagerId {
109 id: u8,
111 },
112}
113
114pub const fn validate_memory_manager_id(id: u8) -> Result<(), MemoryManagerSlotError> {
116 if id == MEMORY_MANAGER_INVALID_ID {
117 return Err(MemoryManagerSlotError::InvalidMemoryManagerId { id });
118 }
119 Ok(())
120}