summaryrefslogtreecommitdiff
path: root/core/resources.rs
diff options
context:
space:
mode:
Diffstat (limited to 'core/resources.rs')
-rw-r--r--core/resources.rs25
1 files changed, 25 insertions, 0 deletions
diff --git a/core/resources.rs b/core/resources.rs
index ba69e8c98..7a42a68a9 100644
--- a/core/resources.rs
+++ b/core/resources.rs
@@ -72,6 +72,17 @@ impl ResourceTable {
pub fn close(&mut self, rid: ResourceId) -> Option<()> {
self.map.remove(&rid).map(|(_name, _resource)| ())
}
+
+ pub fn remove<T: Resource>(&mut self, rid: ResourceId) -> Option<Box<T>> {
+ if let Some((_name, resource)) = self.map.remove(&rid) {
+ let res = match resource.downcast::<T>() {
+ Ok(res) => Some(res),
+ Err(_e) => None,
+ };
+ return res;
+ }
+ None
+ }
}
/// Abstract type representing resource in Deno.
@@ -138,4 +149,18 @@ mod tests {
table.close(rid2);
assert_eq!(table.map.len(), 0);
}
+
+ #[test]
+ fn test_take_from_resource_table() {
+ let mut table = ResourceTable::default();
+ let rid1 = table.add("fake1", Box::new(FakeResource::new(1)));
+ let rid2 = table.add("fake2", Box::new(FakeResource::new(2)));
+ assert_eq!(table.map.len(), 2);
+ let res1 = table.remove::<FakeResource>(rid1);
+ assert_eq!(table.map.len(), 1);
+ assert!(res1.is_some());
+ let res2 = table.remove::<FakeResource>(rid2);
+ assert_eq!(table.map.len(), 0);
+ assert!(res2.is_some());
+ }
}