use core::alloc::Layout; use alloc::string::String; use crate::ScriptContext; mod tortuise { #[link(wasm_import_module = "tortuise")] unsafe extern "C" { pub safe fn script_name_size(context: u64) -> usize; pub unsafe fn load_script_name(context: u64, offset: *const u8); pub unsafe fn script_id_by_name(context: u64, name: *const u8, length: usize) -> usize; pub safe fn activate_script(context: u64, id: usize); pub safe fn deactivate_script(context: u64, id: usize); } } impl ScriptContext<'_> { pub fn current_script_name(&self) -> String { // safety: the length is correct and the string will fit into offset unsafe { let len = tortuise::script_name_size(self.0); if len == 0 { return String::new(); } let offset = alloc::alloc::alloc(Layout::array::(len).unwrap()); tortuise::load_script_name(self.0, offset); String::from_raw_parts(offset, len, len) } } pub fn script_id(&self, name: &str) -> Option { let id = unsafe { tortuise::script_id_by_name(self.0, name.as_ptr(), name.len()) }; (id < usize::MAX).then_some(id) } pub fn activate_script(&mut self, name: &str) -> Option<()> { let id = self.script_id(name)?; tortuise::activate_script(self.0, id); Some(()) } pub fn deactivate_script(&mut self, name: &str) -> Option<()> { let id = self.script_id(name)?; tortuise::deactivate_script(self.0, id); Some(()) } }