diff options
| author | Mica White <botahamec@outlook.com> | 2026-10-26 10:52:04 -0400 |
|---|---|---|
| committer | Mica White <botahamec@outlook.com> | 2026-10-26 10:58:46 -0400 |
| commit | ec40f6e3acc7874b82709ab81b254c741529fdff (patch) | |
| tree | e3dfdc315bd0c6f1d2efcf442c2cfb3317d6810f /platforms/tortuise-script-wasm/src/script.rs | |
| parent | e3c5839159903658a667f789963f20a31567b25c (diff) | |
Diffstat (limited to 'platforms/tortuise-script-wasm/src/script.rs')
| -rw-r--r-- | platforms/tortuise-script-wasm/src/script.rs | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/platforms/tortuise-script-wasm/src/script.rs b/platforms/tortuise-script-wasm/src/script.rs new file mode 100644 index 0000000..ee4d91d --- /dev/null +++ b/platforms/tortuise-script-wasm/src/script.rs @@ -0,0 +1,48 @@ +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::<u8>(len).unwrap()); + tortuise::load_script_name(self.0, offset); + String::from_raw_parts(offset, len, len) + } + } + + pub fn script_id(&self, name: &str) -> Option<usize> { + 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(()) + } +} |
