use ic_host_artifacts::wasm::WasmFacts;
#[cfg(test)]
mod tests;
pub const REFERENCE_REVISION: &str = "9499f64bda8bcf087188dd8a1bb594115640ba9e";
pub const REFERENCE_LIMITS: InstallLimits = InstallLimits {
code_body_bytes: 12 * 1024 * 1024,
defined_functions: 50_000,
globals: 1_000,
};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct InstallLimits {
pub code_body_bytes: u64,
pub defined_functions: u64,
pub globals: u64,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct LimitUsage {
pub observed: u64,
pub limit: u64,
}
impl LimitUsage {
#[must_use]
pub const fn exceeded(self) -> bool {
self.observed > self.limit
}
#[must_use]
pub fn headroom(self) -> i128 {
i128::from(self.limit) - i128::from(self.observed)
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct InstallReport {
pub code_body_bytes: LimitUsage,
pub defined_functions: LimitUsage,
pub globals: LimitUsage,
}
impl InstallLimits {
#[must_use]
pub fn report(self, facts: &WasmFacts<'_>) -> InstallReport {
InstallReport {
code_body_bytes: LimitUsage {
observed: facts.code_body_bytes as u64,
limit: self.code_body_bytes,
},
defined_functions: LimitUsage {
observed: u64::from(facts.defined_functions),
limit: self.defined_functions,
},
globals: LimitUsage {
observed: u64::from(facts.defined_globals) + u64::from(facts.imported_globals),
limit: self.globals,
},
}
}
}