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