summaryrefslogtreecommitdiff
path: root/platforms/tortuise-script-wasm/src/script.rs
diff options
context:
space:
mode:
Diffstat (limited to 'platforms/tortuise-script-wasm/src/script.rs')
-rw-r--r--platforms/tortuise-script-wasm/src/script.rs48
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(())
+ }
+}