1use std::{convert::TryFrom, path::PathBuf};
2
3use pest::iterators::Pair;
4
5use crate::{Error, ObjectDataParser, Rule, SubRuleFn};
6
7#[derive(Clone, Debug, Default, PartialEq)]
8pub struct SpriteFile {
9 path: PathBuf,
10 w: u32,
11 h: u32,
12 row: u32,
13 col: u32,
14}
15
16impl SpriteFile {
17 fn parse_path<'i>(
18 sprite_file: SpriteFile,
19 path_pair: Pair<'i, Rule>,
20 ) -> Result<SpriteFile, Error<'i>> {
21 ObjectDataParser::parse_as_type(
22 sprite_file,
23 path_pair,
24 Rule::TagFileValue,
25 &[Self::parse_path_value as SubRuleFn<_>],
26 )
27 }
28
29 fn parse_path_value<'i>(
30 mut sprite_file: SpriteFile,
31 value_pair: Pair<'i, Rule>,
32 ) -> Result<SpriteFile, Error<'i>> {
33 let path = value_pair.as_str().parse().map_err(|_| Error::ParsePath {
34 field: stringify!(path),
35 value_pair,
36 })?;
37 sprite_file.path = path;
38 Ok(sprite_file)
39 }
40
41 fn parse_w<'i>(
42 sprite_file: SpriteFile,
43 w_pair: Pair<'i, Rule>,
44 ) -> Result<SpriteFile, Error<'i>> {
45 ObjectDataParser::parse_as_type(
46 sprite_file,
47 w_pair,
48 Rule::TagW,
49 &[Self::parse_w_value as SubRuleFn<_>],
50 )
51 }
52
53 fn parse_w_value<'i>(
54 mut sprite_file: SpriteFile,
55 value_pair: Pair<'i, Rule>,
56 ) -> Result<SpriteFile, Error<'i>> {
57 let w = value_pair
58 .as_str()
59 .parse()
60 .map_err(|error| Error::ParseInt {
61 field: stringify!(w),
62 value_pair,
63 error,
64 })?;
65 sprite_file.w = w;
66 Ok(sprite_file)
67 }
68
69 fn parse_h<'i>(
70 sprite_file: SpriteFile,
71 h_pair: Pair<'i, Rule>,
72 ) -> Result<SpriteFile, Error<'i>> {
73 ObjectDataParser::parse_as_type(
74 sprite_file,
75 h_pair,
76 Rule::TagH,
77 &[Self::parse_h_value as SubRuleFn<_>],
78 )
79 }
80
81 fn parse_h_value<'i>(
82 mut sprite_file: SpriteFile,
83 value_pair: Pair<'i, Rule>,
84 ) -> Result<SpriteFile, Error<'i>> {
85 let h = value_pair
86 .as_str()
87 .parse()
88 .map_err(|error| Error::ParseInt {
89 field: stringify!(h),
90 value_pair,
91 error,
92 })?;
93 sprite_file.h = h;
94 Ok(sprite_file)
95 }
96
97 fn parse_row<'i>(
98 sprite_file: SpriteFile,
99 row_pair: Pair<'i, Rule>,
100 ) -> Result<SpriteFile, Error<'i>> {
101 ObjectDataParser::parse_as_type(
102 sprite_file,
103 row_pair,
104 Rule::TagRow,
105 &[Self::parse_row_value as SubRuleFn<_>],
106 )
107 }
108
109 fn parse_row_value<'i>(
110 mut sprite_file: SpriteFile,
111 value_pair: Pair<'i, Rule>,
112 ) -> Result<SpriteFile, Error<'i>> {
113 let row = value_pair
114 .as_str()
115 .parse()
116 .map_err(|error| Error::ParseInt {
117 field: stringify!(row),
118 value_pair,
119 error,
120 })?;
121 sprite_file.row = row;
122 Ok(sprite_file)
123 }
124
125 fn parse_col<'i>(
126 sprite_file: SpriteFile,
127 col_pair: Pair<'i, Rule>,
128 ) -> Result<SpriteFile, Error<'i>> {
129 ObjectDataParser::parse_as_type(
130 sprite_file,
131 col_pair,
132 Rule::TagCol,
133 &[Self::parse_col_value as SubRuleFn<_>],
134 )
135 }
136
137 fn parse_col_value<'i>(
138 mut sprite_file: SpriteFile,
139 value_pair: Pair<'i, Rule>,
140 ) -> Result<SpriteFile, Error<'i>> {
141 let col = value_pair
142 .as_str()
143 .parse()
144 .map_err(|error| Error::ParseInt {
145 field: stringify!(col),
146 value_pair,
147 error,
148 })?;
149 sprite_file.col = col;
150 Ok(sprite_file)
151 }
152}
153
154impl<'i> TryFrom<Pair<'i, Rule>> for SpriteFile {
155 type Error = Error<'i>;
156
157 fn try_from(pair: Pair<'i, Rule>) -> Result<Self, Self::Error> {
158 ObjectDataParser::parse_as_type(
159 SpriteFile::default(),
160 pair,
161 Rule::SpriteFile,
162 &[
163 Self::parse_path,
164 Self::parse_w,
165 Self::parse_h,
166 Self::parse_row,
167 Self::parse_col,
168 ],
169 )
170 }
171}