sb3_decoder/decoder/raw_structs/
raw_target.rs1use std::collections::HashMap;
6
7use crate::decoder::{RawBlock, RawCostume, RawSound};
8
9pub enum RawTarget {
12 Sprite(RawSprite),
14
15 Stage(RawStage),
17}
18
19impl<'de> serde::Deserialize<'de> for RawTarget {
20 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
21 where
22 D: serde::Deserializer<'de>,
23 {
24 let v = serde_json::Value::deserialize(deserializer)?;
25 let is_stage = v
26 .get("isStage")
27 .and_then(|val| val.as_bool())
28 .ok_or_else(|| serde::de::Error::missing_field("isStage"))?;
29 if is_stage {
30 let stage: RawStage = serde_json::from_value(v).map_err(serde::de::Error::custom)?;
31 Ok(RawTarget::Stage(stage))
32 } else {
33 let sprite: RawSprite = serde_json::from_value(v).map_err(serde::de::Error::custom)?;
34 Ok(RawTarget::Sprite(sprite))
35 }
36 }
37}
38
39#[derive(serde::Deserialize)]
41#[serde(rename_all = "camelCase")]
42pub struct RawSprite {
43 pub name: String,
45
46 pub variables: HashMap<String, RawVariable>,
48
49 pub lists: HashMap<String, (String, Vec<serde_json::Value>)>,
51
52 pub blocks: HashMap<String, RawBlock>,
54
55 pub current_costume: usize,
57
58 pub costumes: Vec<RawCostume>,
60
61 pub sounds: Vec<RawSound>,
63
64 pub volume: u8,
66
67 pub layer_order: isize,
69
70 pub visible: bool,
72
73 pub x: i32,
75
76 pub y: i32,
78
79 pub size: u32,
81
82 pub direction: i32,
84
85 pub draggable: bool,
87
88 pub rotation_style: String,
90}
91
92#[derive(serde::Deserialize)]
94#[serde(rename_all = "camelCase")]
95pub struct RawStage {
96 pub variables: HashMap<String, RawVariable>,
98
99 pub lists: HashMap<String, (String, Vec<serde_json::Value>)>,
101
102 pub broadcasts: HashMap<String, String>,
104
105 pub blocks: HashMap<String, RawBlock>,
107
108 #[serde(rename = "currentCostume")]
110 pub current_backdrop: usize,
111
112 #[serde(rename = "costumes")]
114 pub backdrops: Vec<RawCostume>,
115
116 pub sounds: Vec<RawSound>,
118
119 pub volume: u8,
121}
122
123#[derive(serde::Deserialize)]
125pub struct RawVariable {
126 pub name: String,
128
129 pub value: serde_json::Value,
131}