rune/modules/
object.rs
1use crate as rune;
4use crate::alloc::clone::TryClone;
5use crate::alloc::fmt::TryWrite;
6use crate::runtime::object::{RuneIter, RuneIterKeys, RuneValues};
7use crate::runtime::{EnvProtocolCaller, Formatter, Object, Protocol, Value, VmResult};
8use crate::{ContextError, Module};
9
10#[rune::module(::std::object)]
37pub fn module() -> Result<Module, ContextError> {
38 let mut m = Module::from_meta(self::module_meta)?;
39
40 m.ty::<Object>()?;
41
42 m.function_meta(Object::new__meta)?;
43 m.function_meta(Object::rune_with_capacity)?;
44 m.function_meta(Object::len__meta)?;
45 m.function_meta(Object::is_empty__meta)?;
46 m.function_meta(Object::rune_insert)?;
47 m.function_meta(remove__meta)?;
48 m.function_meta(Object::clear__meta)?;
49 m.function_meta(contains_key__meta)?;
50 m.function_meta(get__meta)?;
51
52 m.function_meta(partial_eq__meta)?;
53 m.implement_trait::<Object>(rune::item!(::std::cmp::PartialEq))?;
54
55 m.function_meta(eq__meta)?;
56 m.implement_trait::<Object>(rune::item!(::std::cmp::Eq))?;
57
58 m.function_meta(clone__meta)?;
59 m.implement_trait::<Object>(rune::item!(::std::clone::Clone))?;
60
61 m.function_meta(debug_fmt__meta)?;
62
63 m.function_meta(Object::rune_iter__meta)?;
64 m.function_meta(Object::rune_keys__meta)?;
65 m.function_meta(Object::rune_values__meta)?;
66 m.associated_function(&Protocol::INTO_ITER, Object::rune_iter)?;
67
68 m.ty::<RuneIter>()?;
69 m.function_meta(RuneIter::next__meta)?;
70 m.function_meta(RuneIter::size_hint__meta)?;
71 m.implement_trait::<RuneIter>(rune::item!(::std::iter::Iterator))?;
72 m.function_meta(RuneIter::len__meta)?;
73 m.implement_trait::<RuneIter>(rune::item!(::std::iter::ExactSizeIterator))?;
74
75 m.ty::<RuneIterKeys>()?;
76 m.function_meta(RuneIterKeys::next__meta)?;
77 m.function_meta(RuneIterKeys::size_hint__meta)?;
78 m.implement_trait::<RuneIterKeys>(rune::item!(::std::iter::Iterator))?;
79 m.function_meta(RuneIterKeys::len__meta)?;
80 m.implement_trait::<RuneIterKeys>(rune::item!(::std::iter::ExactSizeIterator))?;
81
82 m.ty::<RuneValues>()?;
83 m.function_meta(RuneValues::next__meta)?;
84 m.function_meta(RuneValues::size_hint__meta)?;
85 m.implement_trait::<RuneValues>(rune::item!(::std::iter::Iterator))?;
86 m.function_meta(RuneValues::len__meta)?;
87 m.implement_trait::<RuneValues>(rune::item!(::std::iter::ExactSizeIterator))?;
88 Ok(m)
89}
90
91#[rune::function(keep, instance)]
100#[inline]
101fn contains_key(object: &Object, key: &str) -> bool {
102 object.contains_key(key)
103}
104
105#[rune::function(keep, instance)]
116#[inline]
117fn remove(object: &mut Object, key: &str) -> Option<Value> {
118 object.remove(key)
119}
120
121#[rune::function(keep, instance)]
131#[inline]
132fn get(object: &Object, key: &str) -> Option<Value> {
133 object.get(key).cloned()
134}
135
136#[rune::function(keep, instance, protocol = PARTIAL_EQ)]
149fn partial_eq(this: &Object, other: &Object) -> VmResult<bool> {
150 Object::partial_eq_with(this, other, &mut EnvProtocolCaller)
151}
152
153#[rune::function(keep, instance, protocol = EQ)]
168fn eq(this: &Object, other: &Object) -> VmResult<bool> {
169 Object::eq_with(this, other, Value::eq_with, &mut EnvProtocolCaller)
170}
171
172#[rune::function(keep, instance, protocol = CLONE)]
185fn clone(this: &Object) -> VmResult<Object> {
186 VmResult::Ok(vm_try!(this.try_clone()))
187}
188
189#[rune::function(keep, instance, protocol = DEBUG_FMT)]
199#[inline]
200fn debug_fmt(this: &Object, f: &mut Formatter) -> VmResult<()> {
201 vm_write!(f, "{this:?}")
202}