lf2_parse/
sprite_file.rs

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}