diff options
Diffstat (limited to 'core/ops_builtin.rs')
-rw-r--r-- | core/ops_builtin.rs | 45 |
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(()) +} |