stk/reflection/
object.rs

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}