mirror_mirror/foreign_impls/
array.rs

1use alloc::boxed::Box;
2use alloc::vec::Vec;
3use core::any::Any;
4use core::fmt;
5
6use crate::array::Array;
7use crate::iter::ValueIterMut;
8use crate::type_info::graph::ArrayNode;
9use crate::type_info::graph::NodeId;
10use crate::type_info::graph::TypeGraph;
11use crate::DescribeType;
12use crate::FromReflect;
13use crate::Reflect;
14use crate::ReflectMut;
15use crate::ReflectOwned;
16use crate::ReflectRef;
17use crate::Value;
18
19impl<T, const N: usize> DescribeType for [T; N]
20where
21    T: DescribeType,
22{
23    fn build(graph: &mut TypeGraph) -> NodeId {
24        graph.get_or_build_node_with::<Self, _>(|graph| ArrayNode::new::<Self, T, N>(graph))
25    }
26}
27
28impl<T, const N: usize> Reflect for [T; N]
29where
30    T: FromReflect + DescribeType,
31{
32    trivial_reflect_methods!();
33
34    fn reflect_owned(self: Box<Self>) -> ReflectOwned {
35        ReflectOwned::Array(self)
36    }
37
38    fn reflect_ref(&self) -> ReflectRef<'_> {
39        ReflectRef::Array(self)
40    }
41
42    fn reflect_mut(&mut self) -> ReflectMut<'_> {
43        ReflectMut::Array(self)
44    }
45
46    fn patch(&mut self, value: &dyn Reflect) {
47        if let Some(array) = value.reflect_ref().as_array() {
48            for (idx, new_value) in array.iter().enumerate() {
49                if let Some(value) = self.get_mut(idx) {
50                    value.patch(new_value);
51                }
52            }
53        }
54    }
55
56    fn to_value(&self) -> Value {
57        let data = self.iter().map(Reflect::to_value).collect();
58        Value::List(data)
59    }
60
61    fn clone_reflect(&self) -> Box<dyn Reflect> {
62        let value = self.to_value();
63        Box::new(Self::from_reflect(&value).unwrap())
64    }
65
66    fn debug(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
67        f.debug_list().entries(self.iter()).finish()
68    }
69}
70
71impl<T, const N: usize> Array for [T; N]
72where
73    T: FromReflect + DescribeType,
74{
75    fn get(&self, index: usize) -> Option<&dyn Reflect> {
76        self.as_slice().get(index).map(|value| value.as_reflect())
77    }
78
79    fn get_mut(&mut self, index: usize) -> Option<&mut dyn Reflect> {
80        self.as_mut_slice()
81            .get_mut(index)
82            .map(|value| value.as_reflect_mut())
83    }
84
85    fn len(&self) -> usize {
86        N
87    }
88
89    fn is_empty(&self) -> bool {
90        N == 0
91    }
92
93    fn iter(&self) -> crate::array::Iter<'_> {
94        crate::array::Iter::new(self)
95    }
96
97    fn iter_mut(&mut self) -> ValueIterMut<'_> {
98        let iter = self
99            .as_mut_slice()
100            .iter_mut()
101            .map(|value| value.as_reflect_mut());
102        Box::new(iter)
103    }
104}
105
106impl<T, const N: usize> FromReflect for [T; N]
107where
108    T: FromReflect + DescribeType,
109{
110    fn from_reflect(reflect: &dyn Reflect) -> Option<Self> {
111        Vec::<T>::from_reflect(reflect)?.try_into().ok()
112    }
113}
114
115impl<T, const N: usize> From<[T; N]> for Value
116where
117    T: Reflect,
118{
119    fn from(list: [T; N]) -> Self {
120        let list = list
121            .iter()
122            .map(|value| value.to_value())
123            .collect::<Vec<_>>();
124        Value::List(list)
125    }
126}