use crate::{key::StableKey, slot::MemoryManagerSlot};
use serde::Serialize;
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize)]
#[serde(transparent)]
pub struct PolicyIdentity([u8; 32]);
impl PolicyIdentity {
#[must_use]
pub const fn new(bytes: [u8; 32]) -> Self {
Self(bytes)
}
#[must_use]
pub const fn as_bytes(&self) -> &[u8; 32] {
&self.0
}
}
pub trait RuntimeBootstrapPolicy {
type Error;
fn validate_allocation(
&self,
key: &StableKey,
slot: &MemoryManagerSlot,
) -> Result<(), Self::Error>;
fn prepare_bootstrap(
&self,
_admission: &mut crate::BootstrapAdmission<'_>,
) -> Result<(), Self::Error> {
Ok(())
}
fn runtime_bootstrap_identity(&self) -> PolicyIdentity;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn policy_token_preserves_all_bytes_in_equality_and_diagnostics() {
let bytes = std::array::from_fn(|i| u8::try_from(i).unwrap());
let identity = PolicyIdentity::new(bytes);
assert_eq!(identity.as_bytes(), &bytes);
assert_eq!(
serde_json::to_value(identity).unwrap(),
serde_json::json!(bytes)
);
for index in 0..32 {
let mut changed = bytes;
changed[index] ^= 1;
assert_ne!(identity, PolicyIdentity::new(changed));
}
}
}