1use bevy::reflect::{
4 array::DynamicArray,
5 enums::{DynamicEnum, DynamicVariant},
6 list::DynamicList,
7 map::DynamicMap,
8 reflect_trait,
9 serde::TypedReflectDeserializer,
10 set::{DynamicSet, Set},
11 std_traits::ReflectDefault,
12 structs::DynamicStruct,
13 tuple::DynamicTuple,
14 tuple_struct::DynamicTupleStruct,
15 FromReflect, PartialReflect, Reflect, ReflectFromReflect, TypeRegistry, Typed,
16};
17use serde::de::DeserializeSeed;
18use std::collections::{HashMap, HashSet};
19
20fn main() {
21 #[derive(Reflect, Default, PartialEq, Debug)]
22 #[reflect(Identifiable, Default)]
23 struct Player {
24 id: u32,
25 }
26
27 #[reflect_trait]
28 trait Identifiable {
29 fn id(&self) -> u32;
30 }
31
32 impl Identifiable for Player {
33 fn id(&self) -> u32 {
34 self.id
35 }
36 }
37
38 let player: Player = Player { id: 123 };
42
43 let reflected: Box<dyn Reflect> = Box::new(player);
49
50 assert!(reflected.downcast_ref::<Player>().is_some());
52
53 let cloned: Box<dyn Reflect> = reflected.reflect_clone().unwrap();
57 assert_eq!(cloned.downcast_ref::<Player>(), Some(&Player { id: 123 }));
58
59 let dynamic: Box<dyn PartialReflect> = reflected.to_dynamic();
64 assert!(dynamic.is_dynamic());
65
66 assert!(dynamic.try_as_reflect().is_none());
69
70 let dynamic_ref = dynamic.reflect_ref().as_struct().unwrap();
73 let id = dynamic_ref.field("id").unwrap().try_downcast_ref::<u32>();
74 assert_eq!(id, Some(&123));
75
76 let input = "(id: 123)";
81 let mut registry = TypeRegistry::default();
82 registry.register::<Player>();
83 let registration = registry.get(std::any::TypeId::of::<Player>()).unwrap();
84 let deserialized = TypedReflectDeserializer::new(registration, ®istry)
85 .deserialize(&mut ron::Deserializer::from_str(input).unwrap())
86 .unwrap();
87
88 assert!(deserialized.represents::<Player>());
90
91 let reflect_identifiable = registration
96 .data::<ReflectIdentifiable>()
97 .expect("`ReflectIdentifiable` should be registered");
98
99 assert!(deserialized
104 .try_as_reflect()
105 .and_then(|reflect_trait_obj| reflect_identifiable.get(reflect_trait_obj))
106 .is_none());
107
108 {
113 let mut value = Player::default();
116 value.apply(deserialized.as_ref());
117 assert_eq!(value.id, 123);
118
119 let reflect_default = registration
122 .data::<ReflectDefault>()
123 .expect("`ReflectDefault` should be registered");
124
125 let mut value: Box<dyn Reflect> = reflect_default.default();
126 value.apply(deserialized.as_ref());
127
128 let identifiable: &dyn Identifiable = reflect_identifiable.get(value.as_reflect()).unwrap();
129 assert_eq!(identifiable.id(), 123);
130 }
131
132 {
134 let value: Player = Player::from_reflect(deserialized.as_ref()).unwrap();
137 assert_eq!(value.id, 123);
138
139 let reflect_from_reflect = registration
142 .data::<ReflectFromReflect>()
143 .expect("`ReflectFromReflect` should be registered");
144
145 let value: Box<dyn Reflect> = reflect_from_reflect
146 .from_reflect(deserialized.as_ref())
147 .unwrap();
148 let identifiable: &dyn Identifiable = reflect_identifiable.get(value.as_reflect()).unwrap();
149 assert_eq!(identifiable.id(), 123);
150 }
151
152 let mut my_dynamic_list = DynamicList::from_iter([1u32, 2u32, 3u32]);
156
157 let mut my_list: Vec<u32> = Vec::new();
159 my_list.apply(&my_dynamic_list);
160 assert_eq!(my_list, vec![1, 2, 3]);
161
162 assert!(!my_dynamic_list
164 .as_partial_reflect()
165 .represents::<Vec<u32>>());
166 my_dynamic_list.set_represented_type(Some(<Vec<u32>>::type_info()));
167 assert!(my_dynamic_list
168 .as_partial_reflect()
169 .represents::<Vec<u32>>());
170
171 {
176 let mut dynamic_tuple = DynamicTuple::default();
177 dynamic_tuple.insert(1u32);
178 dynamic_tuple.insert(2u32);
179 dynamic_tuple.insert(3u32);
180
181 let mut my_tuple: (u32, u32, u32) = (0, 0, 0);
182 my_tuple.apply(&dynamic_tuple);
183 assert_eq!(my_tuple, (1, 2, 3));
184 }
185
186 {
188 let dynamic_array = DynamicArray::from_iter([1u32, 2u32, 3u32]);
189
190 let mut my_array = [0u32; 3];
191 my_array.apply(&dynamic_array);
192 assert_eq!(my_array, [1, 2, 3]);
193 }
194
195 {
197 let dynamic_list = DynamicList::from_iter([1u32, 2u32, 3u32]);
198
199 let mut my_list: Vec<u32> = Vec::new();
200 my_list.apply(&dynamic_list);
201 assert_eq!(my_list, vec![1, 2, 3]);
202 }
203
204 {
206 let mut dynamic_set = DynamicSet::from_iter(["x", "y", "z"]);
207 assert!(dynamic_set.contains(&"x"));
208
209 dynamic_set.remove(&"y");
210
211 let mut my_set: HashSet<&str> = HashSet::default();
212 my_set.apply(&dynamic_set);
213 assert_eq!(my_set, HashSet::from_iter(["x", "z"]));
214 }
215
216 {
218 let dynamic_map = DynamicMap::from_iter([("x", 1u32), ("y", 2u32), ("z", 3u32)]);
219
220 let mut my_map: HashMap<&str, u32> = HashMap::default();
221 my_map.apply(&dynamic_map);
222 assert_eq!(my_map.get("x"), Some(&1));
223 assert_eq!(my_map.get("y"), Some(&2));
224 assert_eq!(my_map.get("z"), Some(&3));
225 }
226
227 {
229 #[derive(Reflect, Default, Debug, PartialEq)]
230 struct MyStruct {
231 x: u32,
232 y: u32,
233 z: u32,
234 }
235
236 let mut dynamic_struct = DynamicStruct::default();
237 dynamic_struct.insert("x", 1u32);
238 dynamic_struct.insert("y", 2u32);
239 dynamic_struct.insert("z", 3u32);
240
241 let mut my_struct = MyStruct::default();
242 my_struct.apply(&dynamic_struct);
243 assert_eq!(my_struct, MyStruct { x: 1, y: 2, z: 3 });
244 }
245
246 {
248 #[derive(Reflect, Default, Debug, PartialEq)]
249 struct MyTupleStruct(u32, u32, u32);
250
251 let mut dynamic_tuple_struct = DynamicTupleStruct::default();
252 dynamic_tuple_struct.insert(1u32);
253 dynamic_tuple_struct.insert(2u32);
254 dynamic_tuple_struct.insert(3u32);
255
256 let mut my_tuple_struct = MyTupleStruct::default();
257 my_tuple_struct.apply(&dynamic_tuple_struct);
258 assert_eq!(my_tuple_struct, MyTupleStruct(1, 2, 3));
259 }
260
261 {
263 #[derive(Reflect, Default, Debug, PartialEq)]
264 enum MyEnum {
265 #[default]
266 Empty,
267 Xyz(u32, u32, u32),
268 }
269
270 let mut values = DynamicTuple::default();
271 values.insert(1u32);
272 values.insert(2u32);
273 values.insert(3u32);
274
275 let dynamic_variant = DynamicVariant::Tuple(values);
276 let dynamic_enum = DynamicEnum::new("Xyz", dynamic_variant);
277
278 let mut my_enum = MyEnum::default();
279 my_enum.apply(&dynamic_enum);
280 assert_eq!(my_enum, MyEnum::Xyz(1, 2, 3));
281 }
282}