summaryrefslogtreecommitdiff
path: root/core/ops_builtin.rs
diff options
context:
space:
mode:
Diffstat (limited to 'core/ops_builtin.rs')
-rw-r--r--core/ops_builtin.rs45
1 files changed, 45 insertions, 0 deletions
diff --git a/core/ops_builtin.rs b/core/ops_builtin.rs
new file mode 100644
index 000000000..5c74c7330
--- /dev/null
+++ b/core/ops_builtin.rs
@@ -0,0 +1,45 @@
+use crate::error::bad_resource_id;
+use crate::error::type_error;
+use crate::error::AnyError;
+use crate::resources::ResourceId;
+use crate::OpState;
+use crate::ZeroCopyBuf;
+
+// TODO(@AaronO): provide these ops grouped as a runtime extension
+// e.g:
+// pub fn init_builtins() -> Extension { ... }
+
+/// Return map of resources with id as key
+/// and string representation as value.
+///
+/// This op must be wrapped in `op_sync`.
+pub fn op_resources(
+ state: &mut OpState,
+ _args: (),
+ _zero_copy: Option<ZeroCopyBuf>,
+) -> Result<Vec<(ResourceId, String)>, AnyError> {
+ let serialized_resources = state
+ .resource_table
+ .names()
+ .map(|(rid, name)| (rid, name.to_string()))
+ .collect();
+ Ok(serialized_resources)
+}
+
+/// Remove a resource from the resource table.
+///
+/// This op must be wrapped in `op_sync`.
+pub fn op_close(
+ state: &mut OpState,
+ rid: Option<ResourceId>,
+ _zero_copy: Option<ZeroCopyBuf>,
+) -> Result<(), AnyError> {
+ // TODO(@AaronO): drop Option after improving type-strictness balance in serde_v8
+ let rid = rid.ok_or_else(|| type_error("missing or invalid `rid`"))?;
+ state
+ .resource_table
+ .close(rid)
+ .ok_or_else(bad_resource_id)?;
+
+ Ok(())
+}