1use crate::reflection::{FromValue, ReflectValueType, ToValue, UnsafeFromValue};
2use crate::value::{Object, ValuePtr, ValueType, ValueTypeInfo};
3use crate::vm::{RawRefGuard, Ref, StackError, Vm};
4
5impl<T> ReflectValueType for Object<T> {
6 fn value_type() -> ValueType {
7 ValueType::Object
8 }
9
10 fn value_type_info() -> ValueTypeInfo {
11 ValueTypeInfo::Object
12 }
13}
14
15impl<'a, T> ReflectValueType for &'a Object<T> {
16 fn value_type() -> ValueType {
17 ValueType::Object
18 }
19
20 fn value_type_info() -> ValueTypeInfo {
21 ValueTypeInfo::Object
22 }
23}
24
25impl<'a, T> ReflectValueType for &'a mut Object<T> {
26 fn value_type() -> ValueType {
27 ValueType::Object
28 }
29
30 fn value_type_info() -> ValueTypeInfo {
31 ValueTypeInfo::Object
32 }
33}
34
35impl<T> FromValue for Object<T>
36where
37 T: FromValue,
38{
39 fn from_value(value: ValuePtr, vm: &mut Vm) -> Result<Self, StackError> {
40 let slot = value.into_object(vm)?;
41 let value = vm.object_take(slot)?;
42 let mut object = Object::with_capacity(value.len());
43
44 for (key, value) in value {
45 object.insert(key, T::from_value(value, vm)?);
46 }
47
48 Ok(object)
49 }
50}
51
52impl<'a> UnsafeFromValue for &'a Object<ValuePtr> {
53 type Guard = RawRefGuard;
54
55 unsafe fn unsafe_from_value(
56 value: ValuePtr,
57 vm: &mut Vm,
58 ) -> Result<(Self, Self::Guard), StackError> {
59 let slot = value.into_object(vm)?;
60 Ok(Ref::unsafe_into_ref(vm.object_ref(slot)?))
61 }
62}
63
64impl<T> ToValue for Object<T>
65where
66 T: ToValue,
67{
68 fn to_value(self, vm: &mut Vm) -> Result<ValuePtr, StackError> {
69 let mut object = Object::with_capacity(self.len());
70
71 for (key, value) in self {
72 object.insert(key, value.to_value(vm)?);
73 }
74
75 Ok(vm.object_allocate(object))
76 }
77}