use bevy::{
platform::collections::HashMap,
prelude::*,
reflect::{DynamicList, PartialReflect, ReflectRef},
};
use serde::{Deserialize, Serialize};
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_systems(Startup, setup)
.run();
}
#[derive(Reflect)]
pub struct A {
x: usize,
y: Vec<u32>,
z: HashMap<String, f32>,
}
#[derive(Reflect)]
pub struct B;
#[derive(Reflect)]
pub struct C(usize);
#[derive(Reflect)]
enum D {
A,
B(usize),
C { value: f32 },
}
#[derive(Reflect, Hash, PartialEq, Clone)]
#[reflect(Hash, PartialEq, Clone)]
pub struct E {
x: usize,
}
#[derive(Reflect, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[reflect(opaque)]
#[reflect(PartialEq, Clone, Serialize, Deserialize)]
enum F {
X,
Y,
}
fn setup() {
let mut z = <HashMap<_, _>>::default();
z.insert("Hello".to_string(), 1.0);
let value: Box<dyn Reflect> = Box::new(A {
x: 1,
y: vec![1, 2],
z,
});
match value.reflect_ref() {
ReflectRef::Struct(value) => {
info!(
"This is a 'struct' type with an 'x' value of {}",
value.get_field::<usize>("x").unwrap()
);
}
ReflectRef::TupleStruct(_) => {}
ReflectRef::Tuple(_) => {}
ReflectRef::Enum(_) => {}
ReflectRef::List(_) => {}
ReflectRef::Array(_) => {}
ReflectRef::Map(_) => {}
ReflectRef::Set(_) => {}
#[cfg(feature = "reflect_functions")]
ReflectRef::Function(_) => {}
ReflectRef::Opaque(_) => {}
#[expect(
clippy::allow_attributes,
reason = "`unreachable_patterns` is not always linted"
)]
#[allow(
unreachable_patterns,
reason = "This example cannot always detect when `bevy_reflect/functions` is enabled."
)]
_ => {}
}
let mut dynamic_list = DynamicList::default();
dynamic_list.push(3u32);
dynamic_list.push(4u32);
dynamic_list.push(5u32);
let mut value: A = value.take::<A>().unwrap();
value.y.apply(&dynamic_list);
assert_eq!(value.y, vec![3u32, 4u32, 5u32]);
_ = || -> (A, B, C, D, E, F) { unreachable!() };
}