@@ -170,116 +170,127 @@ fn parse_module_block(pair: pest::iterators::Pair<Rule>) -> Result<ModuleBlock>
170170}
171171
172172fn parse_fetch_block ( pair : pest:: iterators:: Pair < Rule > ) -> Result < FetchBlock > {
173- let fetch_spec = pair
173+ let mut spec = None ;
174+ let mut output = None ;
175+
176+ for field in pair. into_inner ( ) {
177+ match field. as_rule ( ) {
178+ Rule :: fetch_field => {
179+ let inner = field. into_inner ( ) . next ( ) . ok_or_else ( || anyhow ! ( "Empty fetch field" ) ) ?;
180+ match inner. as_rule ( ) {
181+ Rule :: fetch_output_field => {
182+ let value = inner. into_inner ( ) . next ( ) . ok_or_else ( || anyhow ! ( "Missing output value" ) ) ?;
183+ output = Some ( parse_value ( value) ?) ;
184+ }
185+ Rule :: fetch_spec => {
186+ spec = Some ( parse_fetch_spec ( inner) ?) ;
187+ }
188+ _ => { }
189+ }
190+ }
191+ _ => { }
192+ }
193+ }
194+
195+ Ok ( FetchBlock {
196+ spec : spec. ok_or_else ( || anyhow ! ( "Missing fetch spec" ) ) ?,
197+ output,
198+ } )
199+ }
200+
201+ fn parse_fetch_spec ( fetch_spec : pest:: iterators:: Pair < Rule > ) -> Result < FetchSpec > {
202+ let inner_spec = fetch_spec
174203 . into_inner ( )
175204 . next ( )
176- . ok_or_else ( || anyhow ! ( "Missing fetch spec" ) ) ?;
177- let fetch_rule = fetch_spec. as_rule ( ) ; // Store the rule before consuming
178- debug ! ( "Parsing fetch spec with rule: {:?}" , fetch_rule) ;
179-
180- let spec = match fetch_rule {
181- Rule :: fetch_spec => {
182- // Handle the fetch_spec wrapper by processing its inner content
183- let inner_spec = fetch_spec
184- . into_inner ( )
185- . next ( )
186- . ok_or_else ( || anyhow ! ( "Missing inner fetch spec" ) ) ?;
187- let inner_rule = inner_spec. as_rule ( ) ;
188- debug ! ( "Inner fetch spec rule: {:?}" , inner_rule) ;
189-
190- match inner_rule {
191- Rule :: git_spec => {
192- let mut url = None ;
193- let mut ref_ = None ;
194- let mut recursive = false ;
195-
196- for field in inner_spec. into_inner ( ) {
197- if field. as_rule ( ) == Rule :: git_field {
198- let inner_field = field. into_inner ( ) . next ( ) . unwrap ( ) ;
199- match inner_field. as_rule ( ) {
200- Rule :: git_url_field => {
201- let mut parts = inner_field. into_inner ( ) ;
202- let value = parts. next ( ) . unwrap ( ) ;
203- url = Some ( parse_value ( value) ?) ;
204- }
205- Rule :: git_ref_field => {
206- let mut parts = inner_field. into_inner ( ) ;
207- let value = parts. next ( ) . unwrap ( ) ;
208- ref_ = Some ( parse_value ( value) ?) ;
209- }
210- Rule :: git_recursive_field => {
211- let mut parts = inner_field. into_inner ( ) ;
212- let value = parts. next ( ) . unwrap ( ) ;
213- recursive = parse_value ( value) ? == "true" ;
214- }
215- _ => { }
216- }
205+ . ok_or_else ( || anyhow ! ( "Missing inner fetch spec" ) ) ?;
206+ let inner_rule = inner_spec. as_rule ( ) ;
207+ debug ! ( "Inner fetch spec rule: {:?}" , inner_rule) ;
208+
209+ match inner_rule {
210+ Rule :: git_spec => {
211+ let mut url = None ;
212+ let mut ref_ = None ;
213+ let mut recursive = false ;
214+
215+ for field in inner_spec. into_inner ( ) {
216+ if field. as_rule ( ) == Rule :: git_field {
217+ let inner_field = field. into_inner ( ) . next ( ) . unwrap ( ) ;
218+ match inner_field. as_rule ( ) {
219+ Rule :: git_url_field => {
220+ let mut parts = inner_field. into_inner ( ) ;
221+ let value = parts. next ( ) . unwrap ( ) ;
222+ url = Some ( parse_value ( value) ?) ;
217223 }
218- }
219-
220- FetchSpec :: Git ( GitSpec {
221- url : url. ok_or_else ( || anyhow ! ( "Git spec missing url" ) ) ?,
222- ref_,
223- recursive,
224- } )
225- }
226- Rule :: http_spec => {
227- let mut url = None ;
228- let mut sha256 = None ;
229-
230- for field in inner_spec. into_inner ( ) {
231- if field. as_rule ( ) == Rule :: http_field {
232- let inner_field = field. into_inner ( ) . next ( ) . unwrap ( ) ;
233- match inner_field. as_rule ( ) {
234- Rule :: http_url_field => {
235- let mut parts = inner_field. into_inner ( ) ;
236- let value = parts. next ( ) . unwrap ( ) ;
237- url = Some ( parse_value ( value) ?) ;
238- }
239- Rule :: http_sha256_field => {
240- let mut parts = inner_field. into_inner ( ) ;
241- let value = parts. next ( ) . unwrap ( ) ;
242- sha256 = Some ( parse_value ( value) ?) ;
243- }
244- _ => { }
245- }
224+ Rule :: git_ref_field => {
225+ let mut parts = inner_field. into_inner ( ) ;
226+ let value = parts. next ( ) . unwrap ( ) ;
227+ ref_ = Some ( parse_value ( value) ?) ;
228+ }
229+ Rule :: git_recursive_field => {
230+ let mut parts = inner_field. into_inner ( ) ;
231+ let value = parts. next ( ) . unwrap ( ) ;
232+ recursive = parse_value ( value) ? == "true" ;
246233 }
234+ _ => { }
247235 }
248-
249- FetchSpec :: Http ( HttpSpec {
250- url : url. ok_or_else ( || anyhow ! ( "HTTP spec missing url" ) ) ?,
251- sha256,
252- } )
253236 }
254- Rule :: local_spec => {
255- let mut path = None ;
256-
257- for field in inner_spec. into_inner ( ) {
258- if field. as_rule ( ) == Rule :: local_field {
259- // local_field contains: "path" ~ "=" ~ value
260- // field.as_str() gives us the full text like "path = /some/path"
261- // field.into_inner() gives us only the value token
262- let value = field. into_inner ( ) . next ( ) . unwrap ( ) ; // Only the value token
263- path = Some ( parse_value ( value) ?) ;
237+ }
238+
239+ Ok ( FetchSpec :: Git ( GitSpec {
240+ url : url. ok_or_else ( || anyhow ! ( "Git spec missing url" ) ) ?,
241+ ref_,
242+ recursive,
243+ } ) )
244+ }
245+ Rule :: http_spec => {
246+ let mut url = None ;
247+ let mut sha256 = None ;
248+
249+ for field in inner_spec. into_inner ( ) {
250+ if field. as_rule ( ) == Rule :: http_field {
251+ let inner_field = field. into_inner ( ) . next ( ) . unwrap ( ) ;
252+ match inner_field. as_rule ( ) {
253+ Rule :: http_url_field => {
254+ let mut parts = inner_field. into_inner ( ) ;
255+ let value = parts. next ( ) . unwrap ( ) ;
256+ url = Some ( parse_value ( value) ?) ;
257+ }
258+ Rule :: http_sha256_field => {
259+ let mut parts = inner_field. into_inner ( ) ;
260+ let value = parts. next ( ) . unwrap ( ) ;
261+ sha256 = Some ( parse_value ( value) ?) ;
264262 }
263+ _ => { }
265264 }
266-
267- FetchSpec :: Local ( LocalSpec {
268- path : path. ok_or_else ( || anyhow ! ( "Local spec missing path" ) ) ?,
269- } )
270- }
271- _ => {
272- return Err ( anyhow ! (
273- "Unsupported inner fetch spec type: {:?}" ,
274- inner_rule
275- ) ) ;
276265 }
277266 }
267+
268+ Ok ( FetchSpec :: Http ( HttpSpec {
269+ url : url. ok_or_else ( || anyhow ! ( "HTTP spec missing url" ) ) ?,
270+ sha256,
271+ } ) )
278272 }
279- _ => return Err ( anyhow ! ( "Unsupported fetch spec type" ) ) ,
280- } ;
273+ Rule :: local_spec => {
274+ let mut path = None ;
275+
276+ for field in inner_spec. into_inner ( ) {
277+ if field. as_rule ( ) == Rule :: local_field {
278+ let value = field. into_inner ( ) . next ( ) . unwrap ( ) ;
279+ path = Some ( parse_value ( value) ?) ;
280+ }
281+ }
281282
282- Ok ( FetchBlock { spec } )
283+ Ok ( FetchSpec :: Local ( LocalSpec {
284+ path : path. ok_or_else ( || anyhow ! ( "Local spec missing path" ) ) ?,
285+ } ) )
286+ }
287+ _ => {
288+ Err ( anyhow ! (
289+ "Unsupported inner fetch spec type: {:?}" ,
290+ inner_rule
291+ ) )
292+ }
293+ }
283294}
284295
285296fn parse_script_block ( pair : pest:: iterators:: Pair < Rule > ) -> Result < ScriptBlock > {
0 commit comments