concinnity_core/components/
variables.rs1use alloc::string::String;
4use alloc::vec::Vec;
5
6use crate::components::BehaviorLiteral;
7use crate::ecs::asset_id::AssetId;
8
9#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
23#[serde(default)]
24pub struct Variables {
25 #[serde(skip)]
27 pub asset_id: AssetId,
28 pub vars: Vec<VariableDecl>,
30}
31
32#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
35#[serde(default)]
36pub struct VariableDecl {
37 pub name: String,
39 pub value: BehaviorLiteral,
41}
42
43#[cfg(test)]
44mod tests {
45 use super::*;
46
47 #[test]
48 fn defaults_declare_nothing() {
49 assert!(Variables::default().vars.is_empty());
50 }
51
52 #[test]
53 fn typed_declarations_parse() {
54 let v: Variables = serde_json::from_str(
55 r#"{"vars":[{"name":"health","value":{"float":100.0}},
56 {"name":"spawn","value":{"vec3":[0,1,0]}}]}"#,
57 )
58 .expect("variables parse");
59 assert_eq!(v.vars.len(), 2);
60 assert_eq!(v.vars[0].name, "health");
61 assert_eq!(v.vars[0].value, BehaviorLiteral::Float(100.0));
62 assert_eq!(v.vars[1].value, BehaviorLiteral::Vec3([0.0, 1.0, 0.0]));
63 }
64
65 #[test]
66 fn round_trips_through_postcard() {
67 let v: Variables =
68 serde_json::from_str(r#"{"vars":[{"name":"n","value":{"int":3}}]}"#).unwrap();
69 let bytes = postcard::to_allocvec(&v).expect("encodes");
70 let back: Variables = postcard::from_bytes(&bytes).expect("decodes");
71 assert_eq!(back.vars[0].name, "n");
72 assert_eq!(back.vars[0].value, BehaviorLiteral::Int(3));
73 }
74}