rpgmxp_types/
event_page_condition.rs

1use ruby_marshal::FromValue;
2use ruby_marshal::FromValueContext;
3use ruby_marshal::FromValueError;
4use ruby_marshal::IntoValue;
5use ruby_marshal::IntoValueError;
6use ruby_marshal::ObjectValue;
7use ruby_marshal::StringValue;
8use ruby_marshal::SymbolValue;
9use ruby_marshal::Value;
10use ruby_marshal::ValueArena;
11use ruby_marshal::ValueHandle;
12
13const OBJECT_NAME: &[u8] = b"RPG::Event::Page::Condition";
14
15const SWITCH2_VALID_FIELD: &[u8] = b"@switch2_valid";
16const SELF_SWITCH_CH_FIELD: &[u8] = b"@self_switch_ch";
17const SWITCH1_ID_FIELD: &[u8] = b"@switch1_id";
18const SWITCH1_VALID_FIELD: &[u8] = b"@switch1_valid";
19const VARIABLE_VALUE_FIELD: &[u8] = b"@variable_value";
20const SELF_SWITCH_VALID_FIELD: &[u8] = b"@self_switch_valid";
21const VARIABLE_ID_FIELD: &[u8] = b"@variable_id";
22const VARIABLE_VALID_FIELD: &[u8] = b"@variable_valid";
23const SWITCH2_ID_FIELD: &[u8] = b"@switch2_id";
24
25#[derive(Debug, serde::Deserialize, serde::Serialize)]
26pub struct EventPageCondition {
27    pub switch2_valid: bool,
28    pub self_switch_ch: String,
29    pub switch1_id: i32,
30    pub switch1_valid: bool,
31    pub variable_value: i32,
32    pub self_switch_valid: bool,
33    pub variable_id: i32,
34    pub variable_valid: bool,
35    pub switch2_id: i32,
36}
37
38impl<'a> FromValue<'a> for EventPageCondition {
39    fn from_value(ctx: &FromValueContext<'a>, value: &Value) -> Result<Self, FromValueError> {
40        let object: &ObjectValue = FromValue::from_value(ctx, value)?;
41        let name = object.name();
42        let name: &SymbolValue = ctx.from_value(name.into())?;
43        let name = name.value();
44        if name != OBJECT_NAME {
45            return Err(FromValueError::UnexpectedObjectName { name: name.into() });
46        }
47
48        let instance_variables = object.instance_variables();
49
50        let mut switch2_valid_field = None;
51        let mut self_switch_ch_field = None;
52        let mut switch1_id_field = None;
53        let mut switch1_valid_field = None;
54        let mut variable_value_field = None;
55        let mut self_switch_valid_field = None;
56        let mut variable_id_field = None;
57        let mut variable_valid_field = None;
58        let mut switch2_id_field = None;
59
60        for (key, value) in instance_variables.iter().copied() {
61            let key: &SymbolValue = ctx.from_value(key.into())?;
62            let key = key.value();
63
64            match key {
65                SWITCH2_VALID_FIELD => {
66                    if switch2_valid_field.is_some() {
67                        return Err(FromValueError::DuplicateInstanceVariable {
68                            name: SWITCH2_VALID_FIELD.into(),
69                        });
70                    }
71
72                    switch2_valid_field = Some(ctx.from_value(value)?);
73                }
74                SELF_SWITCH_CH_FIELD => {
75                    if self_switch_ch_field.is_some() {
76                        return Err(FromValueError::DuplicateInstanceVariable {
77                            name: SELF_SWITCH_CH_FIELD.into(),
78                        });
79                    }
80
81                    let value: &StringValue = ctx.from_value(value)?;
82                    self_switch_ch_field = Some(
83                        std::str::from_utf8(value.value())
84                            .map_err(FromValueError::new_other)?
85                            .into(),
86                    );
87                }
88                SWITCH1_ID_FIELD => {
89                    if switch1_id_field.is_some() {
90                        return Err(FromValueError::DuplicateInstanceVariable {
91                            name: SWITCH1_ID_FIELD.into(),
92                        });
93                    }
94
95                    switch1_id_field = Some(ctx.from_value(value)?);
96                }
97                SWITCH1_VALID_FIELD => {
98                    if switch1_valid_field.is_some() {
99                        return Err(FromValueError::DuplicateInstanceVariable {
100                            name: SWITCH1_VALID_FIELD.into(),
101                        });
102                    }
103
104                    switch1_valid_field = Some(ctx.from_value(value)?);
105                }
106                VARIABLE_VALUE_FIELD => {
107                    if variable_value_field.is_some() {
108                        return Err(FromValueError::DuplicateInstanceVariable {
109                            name: VARIABLE_VALUE_FIELD.into(),
110                        });
111                    }
112
113                    variable_value_field = Some(ctx.from_value(value)?);
114                }
115                SELF_SWITCH_VALID_FIELD => {
116                    if self_switch_valid_field.is_some() {
117                        return Err(FromValueError::DuplicateInstanceVariable {
118                            name: SELF_SWITCH_VALID_FIELD.into(),
119                        });
120                    }
121
122                    self_switch_valid_field = Some(ctx.from_value(value)?);
123                }
124                VARIABLE_ID_FIELD => {
125                    if variable_id_field.is_some() {
126                        return Err(FromValueError::DuplicateInstanceVariable {
127                            name: VARIABLE_ID_FIELD.into(),
128                        });
129                    }
130
131                    variable_id_field = Some(ctx.from_value(value)?);
132                }
133                VARIABLE_VALID_FIELD => {
134                    if variable_valid_field.is_some() {
135                        return Err(FromValueError::DuplicateInstanceVariable {
136                            name: VARIABLE_VALID_FIELD.into(),
137                        });
138                    }
139
140                    variable_valid_field = Some(ctx.from_value(value)?);
141                }
142                SWITCH2_ID_FIELD => {
143                    if switch2_id_field.is_some() {
144                        return Err(FromValueError::DuplicateInstanceVariable {
145                            name: SWITCH2_ID_FIELD.into(),
146                        });
147                    }
148
149                    switch2_id_field = Some(ctx.from_value(value)?);
150                }
151                _ => {
152                    return Err(FromValueError::UnknownInstanceVariable { name: key.into() });
153                }
154            }
155        }
156
157        let switch2_valid =
158            switch2_valid_field.ok_or_else(|| FromValueError::MissingInstanceVariable {
159                name: SWITCH2_VALID_FIELD.into(),
160            })?;
161        let self_switch_ch =
162            self_switch_ch_field.ok_or_else(|| FromValueError::MissingInstanceVariable {
163                name: SELF_SWITCH_CH_FIELD.into(),
164            })?;
165        let switch1_id =
166            switch1_id_field.ok_or_else(|| FromValueError::MissingInstanceVariable {
167                name: SWITCH1_ID_FIELD.into(),
168            })?;
169        let switch1_valid =
170            switch1_valid_field.ok_or_else(|| FromValueError::MissingInstanceVariable {
171                name: SWITCH1_VALID_FIELD.into(),
172            })?;
173        let variable_value =
174            variable_value_field.ok_or_else(|| FromValueError::MissingInstanceVariable {
175                name: VARIABLE_VALUE_FIELD.into(),
176            })?;
177        let self_switch_valid =
178            self_switch_valid_field.ok_or_else(|| FromValueError::MissingInstanceVariable {
179                name: SELF_SWITCH_VALID_FIELD.into(),
180            })?;
181        let variable_id =
182            variable_id_field.ok_or_else(|| FromValueError::MissingInstanceVariable {
183                name: VARIABLE_ID_FIELD.into(),
184            })?;
185        let variable_valid =
186            variable_valid_field.ok_or_else(|| FromValueError::MissingInstanceVariable {
187                name: VARIABLE_VALID_FIELD.into(),
188            })?;
189        let switch2_id =
190            switch2_id_field.ok_or_else(|| FromValueError::MissingInstanceVariable {
191                name: SWITCH2_ID_FIELD.into(),
192            })?;
193
194        Ok(Self {
195            switch2_valid,
196            self_switch_ch,
197            switch1_id,
198            switch1_valid,
199            variable_value,
200            self_switch_valid,
201            variable_id,
202            variable_valid,
203            switch2_id,
204        })
205    }
206}
207
208impl IntoValue for EventPageCondition {
209    fn into_value(self, arena: &mut ValueArena) -> Result<ValueHandle, IntoValueError> {
210        let object_name = arena.create_symbol(OBJECT_NAME.into());
211
212        let switch2_valid_field_key = arena.create_symbol(SWITCH2_VALID_FIELD.into());
213        let self_switch_ch_field_key = arena.create_symbol(SELF_SWITCH_CH_FIELD.into());
214        let switch1_id_field_key = arena.create_symbol(SWITCH1_ID_FIELD.into());
215        let switch1_valid_field_key = arena.create_symbol(SWITCH1_VALID_FIELD.into());
216        let variable_value_field_key = arena.create_symbol(VARIABLE_VALUE_FIELD.into());
217        let self_switch_valid_field_key = arena.create_symbol(SELF_SWITCH_VALID_FIELD.into());
218        let variable_id_field_key = arena.create_symbol(VARIABLE_ID_FIELD.into());
219        let variable_valid_field_key = arena.create_symbol(VARIABLE_VALID_FIELD.into());
220        let switch2_id_field_key = arena.create_symbol(SWITCH2_ID_FIELD.into());
221
222        let switch2_valid_field_value = self.switch2_valid.into_value(arena)?;
223        let self_switch_ch_field_value = arena.create_string(self.self_switch_ch.into()).into();
224        let switch1_id_field_value = self.switch1_id.into_value(arena)?;
225        let switch1_valid_field_value = self.switch1_valid.into_value(arena)?;
226        let variable_value_field_value = self.variable_value.into_value(arena)?;
227        let self_switch_valid_field_value = self.self_switch_valid.into_value(arena)?;
228        let variable_id_field_value = self.variable_id.into_value(arena)?;
229        let variable_valid_field_value = self.variable_valid.into_value(arena)?;
230        let switch2_id_field_value = self.switch2_id.into_value(arena)?;
231
232        let fields = vec![
233            (switch2_valid_field_key, switch2_valid_field_value),
234            (self_switch_ch_field_key, self_switch_ch_field_value),
235            (switch1_id_field_key, switch1_id_field_value),
236            (switch1_valid_field_key, switch1_valid_field_value),
237            (variable_value_field_key, variable_value_field_value),
238            (self_switch_valid_field_key, self_switch_valid_field_value),
239            (variable_id_field_key, variable_id_field_value),
240            (variable_valid_field_key, variable_valid_field_value),
241            (switch2_id_field_key, switch2_id_field_value),
242        ];
243
244        let object = arena.create_object(object_name, fields);
245
246        Ok(object.into())
247    }
248}