use ic_host_artifacts::wasm::{ExportKind, WasmFacts};
#[cfg(test)]
mod tests;
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
pub enum MethodMode {
Update,
Query,
CompositeQuery,
Oneway,
}
impl MethodMode {
#[must_use]
pub const fn export_mode(self) -> Self {
match self {
Self::Oneway => Self::Update,
mode => mode,
}
}
}
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
pub struct ExportedMethod<'a> {
pub name: &'a str,
pub mode: MethodMode,
}
pub fn exported_methods<'a>(
facts: &'a WasmFacts<'_>,
) -> impl Iterator<Item = ExportedMethod<'a>> + 'a {
facts.exports.iter().filter_map(|(name, export)| {
if export.kind != ExportKind::Function {
return None;
}
[
("canister_update ", MethodMode::Update),
("canister_query ", MethodMode::Query),
("canister_composite_query ", MethodMode::CompositeQuery),
]
.into_iter()
.find_map(|(prefix, mode)| {
name.strip_prefix(prefix)
.map(|name| ExportedMethod { name, mode })
})
})
}