1use std::convert::TryFrom;
2
3use pest::iterators::Pair;
4
5use crate::{Error, FrameNumberNext, ObjectDataParser, Rule, SubRuleFn};
6
7pub use self::{
8 effect::{Effect, EffectParseError},
9 itr_kind::ItrKind,
10 itr_kind_parse_error::ItrKindParseError,
11};
12
13mod effect;
14mod itr_kind;
15mod itr_kind_parse_error;
16
17#[derive(Clone, Copy, Debug, PartialEq, Eq)]
21pub struct Itr {
22 pub kind: ItrKind,
24 pub x: i32,
26 pub y: i32,
28 pub w: u32,
30 pub h: u32,
32 pub z_width: u32,
37 pub d_vx: i64,
44 pub d_vy: i64,
46 pub a_rest: u32,
48 pub v_rest: u32,
50 pub fall: i32,
81 pub b_defend: i32,
115 pub injury: i32,
124 pub effect: Effect,
126 pub catching_act: FrameNumberNext,
131 pub caught_act: FrameNumberNext,
136}
137
138impl Default for Itr {
139 fn default() -> Self {
140 Itr {
141 kind: Default::default(),
142 x: Default::default(),
143 y: Default::default(),
144 w: Default::default(),
145 h: Default::default(),
146 z_width: Self::Z_WIDTH_DEFAULT,
147 d_vx: Default::default(),
148 d_vy: Default::default(),
149 a_rest: Default::default(),
150 v_rest: Default::default(),
151 fall: Default::default(),
152 b_defend: Default::default(),
153 injury: Default::default(),
154 effect: Default::default(),
155 catching_act: Default::default(),
156 caught_act: Default::default(),
157 }
158 }
159}
160
161impl Itr {
162 pub const Z_WIDTH_DEFAULT: u32 = 13;
164
165 fn parse_tags<'i>(itr: Itr, itr_data_pair: Pair<'i, Rule>) -> Result<Itr, Error<'i>> {
166 itr_data_pair.into_inner().try_fold(itr, Itr::parse_tag)
167 }
168
169 fn parse_tag<'i>(itr: Itr, itr_tag_pair: Pair<'i, Rule>) -> Result<Itr, Error<'i>> {
170 ObjectDataParser::parse_as_type(
171 itr,
172 itr_tag_pair,
173 Rule::ItrTag,
174 &[Self::parse_tag_value as SubRuleFn<_>],
175 )
176 }
177
178 fn parse_tag_value<'i>(mut itr: Itr, itr_tag_pair: Pair<'i, Rule>) -> Result<Itr, Error<'i>> {
179 itr = match itr_tag_pair.as_rule() {
180 Rule::TagKind => {
181 ObjectDataParser::parse_value(itr, itr_tag_pair, Self::parse_kind_value)?
182 }
183 Rule::TagX => ObjectDataParser::parse_value(itr, itr_tag_pair, Self::parse_x_value)?,
184 Rule::TagY => ObjectDataParser::parse_value(itr, itr_tag_pair, Self::parse_y_value)?,
185 Rule::TagW => ObjectDataParser::parse_value(itr, itr_tag_pair, Self::parse_w_value)?,
186 Rule::TagH => ObjectDataParser::parse_value(itr, itr_tag_pair, Self::parse_h_value)?,
187 Rule::TagZWidth => {
188 ObjectDataParser::parse_value(itr, itr_tag_pair, Self::parse_z_width_value)?
189 }
190 Rule::TagDVx => {
191 ObjectDataParser::parse_value(itr, itr_tag_pair, Self::parse_d_vx_value)?
192 }
193 Rule::TagDVy => {
194 ObjectDataParser::parse_value(itr, itr_tag_pair, Self::parse_d_vy_value)?
195 }
196 Rule::TagARest => {
197 ObjectDataParser::parse_value(itr, itr_tag_pair, Self::parse_a_rest_value)?
198 }
199 Rule::TagVRest => {
200 ObjectDataParser::parse_value(itr, itr_tag_pair, Self::parse_v_rest_value)?
201 }
202 Rule::TagFall => {
203 ObjectDataParser::parse_value(itr, itr_tag_pair, Self::parse_fall_value)?
204 }
205 Rule::TagBDefend => {
206 ObjectDataParser::parse_value(itr, itr_tag_pair, Self::parse_b_defend_value)?
207 }
208 Rule::TagInjury => {
209 ObjectDataParser::parse_value(itr, itr_tag_pair, Self::parse_injury_value)?
210 }
211 Rule::TagEffect => {
212 ObjectDataParser::parse_value(itr, itr_tag_pair, Self::parse_effect_value)?
213 }
214 Rule::TagCatchingAct => {
215 ObjectDataParser::parse_value(itr, itr_tag_pair, Self::parse_catching_act_value)?
216 }
217 Rule::TagCaughtAct => {
218 ObjectDataParser::parse_value(itr, itr_tag_pair, Self::parse_caught_act_value)?
219 }
220 _ => itr,
221 };
222 Ok(itr)
223 }
224
225 fn parse_kind_value<'i>(mut itr: Itr, value_pair: Pair<'i, Rule>) -> Result<Itr, Error<'i>> {
226 let kind = value_pair
227 .as_str()
228 .parse()
229 .map_err(|error| Error::ParseItrKind { value_pair, error })?;
230 itr.kind = kind;
231 Ok(itr)
232 }
233
234 fn parse_x_value<'i>(mut itr: Itr, value_pair: Pair<'i, Rule>) -> Result<Itr, Error<'i>> {
235 let x = value_pair
236 .as_str()
237 .parse()
238 .map_err(|error| Error::ParseInt {
239 field: stringify!(x),
240 value_pair,
241 error,
242 })?;
243 itr.x = x;
244 Ok(itr)
245 }
246
247 fn parse_y_value<'i>(mut itr: Itr, value_pair: Pair<'i, Rule>) -> Result<Itr, Error<'i>> {
248 let y = value_pair
249 .as_str()
250 .parse()
251 .map_err(|error| Error::ParseInt {
252 field: stringify!(y),
253 value_pair,
254 error,
255 })?;
256 itr.y = y;
257 Ok(itr)
258 }
259
260 fn parse_w_value<'i>(mut itr: Itr, value_pair: Pair<'i, Rule>) -> Result<Itr, Error<'i>> {
261 let w = value_pair
262 .as_str()
263 .parse()
264 .map_err(|error| Error::ParseInt {
265 field: stringify!(w),
266 value_pair,
267 error,
268 })?;
269 itr.w = w;
270 Ok(itr)
271 }
272
273 fn parse_h_value<'i>(mut itr: Itr, value_pair: Pair<'i, Rule>) -> Result<Itr, Error<'i>> {
274 let h = value_pair
275 .as_str()
276 .parse()
277 .map_err(|error| Error::ParseInt {
278 field: stringify!(h),
279 value_pair,
280 error,
281 })?;
282 itr.h = h;
283 Ok(itr)
284 }
285
286 fn parse_z_width_value<'i>(mut itr: Itr, value_pair: Pair<'i, Rule>) -> Result<Itr, Error<'i>> {
287 let z_width = value_pair
288 .as_str()
289 .parse()
290 .map_err(|error| Error::ParseInt {
291 field: stringify!(zwidth),
292 value_pair,
293 error,
294 })?;
295 itr.z_width = z_width;
296 Ok(itr)
297 }
298
299 fn parse_d_vx_value<'i>(mut itr: Itr, value_pair: Pair<'i, Rule>) -> Result<Itr, Error<'i>> {
300 let d_vx = value_pair
301 .as_str()
302 .parse()
303 .map_err(|error| Error::ParseInt {
304 field: stringify!(d_vx),
305 value_pair,
306 error,
307 })?;
308 itr.d_vx = d_vx;
309 Ok(itr)
310 }
311
312 fn parse_d_vy_value<'i>(mut itr: Itr, value_pair: Pair<'i, Rule>) -> Result<Itr, Error<'i>> {
313 let d_vy = value_pair
314 .as_str()
315 .parse()
316 .map_err(|error| Error::ParseInt {
317 field: stringify!(d_vy),
318 value_pair,
319 error,
320 })?;
321 itr.d_vy = d_vy;
322 Ok(itr)
323 }
324
325 fn parse_a_rest_value<'i>(mut itr: Itr, value_pair: Pair<'i, Rule>) -> Result<Itr, Error<'i>> {
326 let a_rest = value_pair
327 .as_str()
328 .parse()
329 .map_err(|error| Error::ParseInt {
330 field: stringify!(arest),
331 value_pair,
332 error,
333 })?;
334 itr.a_rest = a_rest;
335 Ok(itr)
336 }
337
338 fn parse_v_rest_value<'i>(mut itr: Itr, value_pair: Pair<'i, Rule>) -> Result<Itr, Error<'i>> {
339 let v_rest = value_pair
340 .as_str()
341 .parse()
342 .map_err(|error| Error::ParseInt {
343 field: stringify!(vrest),
344 value_pair,
345 error,
346 })?;
347 itr.v_rest = v_rest;
348 Ok(itr)
349 }
350
351 fn parse_fall_value<'i>(mut itr: Itr, value_pair: Pair<'i, Rule>) -> Result<Itr, Error<'i>> {
352 let fall = value_pair
353 .as_str()
354 .parse()
355 .map_err(|error| Error::ParseInt {
356 field: stringify!(fall),
357 value_pair,
358 error,
359 })?;
360 itr.fall = fall;
361 Ok(itr)
362 }
363
364 fn parse_b_defend_value<'i>(
365 mut itr: Itr,
366 value_pair: Pair<'i, Rule>,
367 ) -> Result<Itr, Error<'i>> {
368 let b_defend = value_pair
369 .as_str()
370 .parse()
371 .map_err(|error| Error::ParseInt {
372 field: stringify!(b_defend),
373 value_pair,
374 error,
375 })?;
376 itr.b_defend = b_defend;
377 Ok(itr)
378 }
379
380 fn parse_injury_value<'i>(mut itr: Itr, value_pair: Pair<'i, Rule>) -> Result<Itr, Error<'i>> {
381 let injury = value_pair
382 .as_str()
383 .parse()
384 .map_err(|error| Error::ParseInt {
385 field: stringify!(injury),
386 value_pair,
387 error,
388 })?;
389 itr.injury = injury;
390 Ok(itr)
391 }
392
393 fn parse_effect_value<'i>(mut itr: Itr, value_pair: Pair<'i, Rule>) -> Result<Itr, Error<'i>> {
394 let effect = value_pair
395 .as_str()
396 .parse()
397 .map_err(|error| Error::ParseItrEffect { value_pair, error })?;
398 itr.effect = effect;
399 Ok(itr)
400 }
401
402 fn parse_catching_act_value<'i>(
403 mut itr: Itr,
404 value_pair: Pair<'i, Rule>,
405 ) -> Result<Itr, Error<'i>> {
406 let catching_act = value_pair
407 .as_str()
408 .parse()
409 .map_err(|error| Error::ParseInt {
410 field: stringify!(catching_act),
411 value_pair,
412 error,
413 })?;
414 itr.catching_act = catching_act;
415 Ok(itr)
416 }
417
418 fn parse_caught_act_value<'i>(
419 mut itr: Itr,
420 value_pair: Pair<'i, Rule>,
421 ) -> Result<Itr, Error<'i>> {
422 let caught_act = value_pair
423 .as_str()
424 .parse()
425 .map_err(|error| Error::ParseInt {
426 field: stringify!(caught_act),
427 value_pair,
428 error,
429 })?;
430 itr.caught_act = caught_act;
431 Ok(itr)
432 }
433}
434
435impl<'i> TryFrom<Pair<'i, Rule>> for Itr {
436 type Error = Error<'i>;
437
438 fn try_from(pair: Pair<'i, Rule>) -> Result<Self, Self::Error> {
439 let sub_rule_fns: &[SubRuleFn<_>] = &[Itr::parse_tags];
440 ObjectDataParser::parse_as_type(Itr::default(), pair, Rule::Itr, sub_rule_fns)
441 }
442}