Skip to content

Commit d681afe

Browse files
committed
Simplify procedure error logic
1 parent 3de54b8 commit d681afe

File tree

1 file changed

+65
-81
lines changed

1 file changed

+65
-81
lines changed

src/parsing/parser.rs

Lines changed: 65 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -212,72 +212,62 @@ impl<'i> Parser<'i> {
212212
}
213213
break;
214214
} else if is_procedure_declaration(self.source) {
215-
let procedure_result = self
215+
match self
216216
.take_block_lines(
217217
is_procedure_declaration,
218218
|line| is_section(line) || potential_procedure_declaration(line),
219219
|inner| {
220-
match inner.read_procedure() {
221-
Ok(proc) => {
222-
// Return both the procedure and the errors
223-
Ok((Some(proc), std::mem::take(&mut inner.problems)))
224-
}
225-
Err(_err) => {
226-
// Return None for procedure but still collect errors
227-
Ok((None, std::mem::take(&mut inner.problems)))
228-
}
229-
}
220+
let result = inner.read_procedure();
221+
let errors = std::mem::take(&mut inner.problems);
222+
Ok((result, errors))
230223
},
231224
)
232-
.map(|(maybe_procedure, errors)| {
233-
// Transfer errors from subparser to main parser
225+
.and_then(|(result, errors)| {
234226
self.problems
235227
.extend(errors);
236-
maybe_procedure
237-
})
238-
.unwrap_or_else(|error| {
239-
self.problems
240-
.push(error);
241-
// Return None on error
242-
None
243-
});
244-
245-
if let Some(mut procedure) = procedure_result {
246-
// Check if there are sections following this procedure
247-
while !self.is_finished() {
248-
self.trim_whitespace();
249-
if self.is_finished() {
250-
break;
251-
}
228+
result
229+
}) {
230+
Ok(mut procedure) => {
231+
// Check if there are sections following this procedure
232+
while !self.is_finished() {
233+
self.trim_whitespace();
234+
if self.is_finished() {
235+
break;
236+
}
252237

253-
if is_section(self.source) {
254-
match self.read_section() {
255-
Ok(section) => {
256-
if let Some(Element::Steps(ref mut steps)) = procedure
257-
.elements
258-
.last_mut()
259-
{
260-
steps.push(section);
261-
} else {
262-
// Create a new Steps element if one doesn't exist
263-
procedure
238+
if is_section(self.source) {
239+
match self.read_section() {
240+
Ok(section) => {
241+
if let Some(Element::Steps(ref mut steps)) = procedure
264242
.elements
265-
.push(Element::Steps(vec![section]));
243+
.last_mut()
244+
{
245+
steps.push(section);
246+
} else {
247+
// Create a new Steps element if one doesn't exist
248+
procedure
249+
.elements
250+
.push(Element::Steps(vec![section]));
251+
}
252+
}
253+
Err(error) => {
254+
self.problems
255+
.push(error);
256+
break;
266257
}
267258
}
268-
Err(error) => {
269-
self.problems
270-
.push(error);
271-
break;
272-
}
259+
} else {
260+
// If we hit something that's not a section, stop parsing sections
261+
break;
273262
}
274-
} else {
275-
// If we hit something that's not a section, stop parsing sections
276-
break;
277263
}
278-
}
279264

280-
procedures.push(procedure);
265+
procedures.push(procedure);
266+
}
267+
Err(error) => {
268+
self.problems
269+
.push(error);
270+
}
281271
}
282272
} else if self
283273
.source
@@ -286,39 +276,28 @@ impl<'i> Parser<'i> {
286276
// It might be that we've encountered a malformed procedure
287277
// declaration, so we try parsing it anyway to get a more
288278
// specific error message.
289-
let procedure_result = self
279+
match self
290280
.take_block_lines(
291281
|_| true, // Accept the line regardless
292282
|line| is_section(line) || potential_procedure_declaration(line),
293283
|inner| {
294-
match inner.read_procedure() {
295-
Ok(proc) => {
296-
// Return both the procedure and the errors
297-
Ok((Some(proc), std::mem::take(&mut inner.problems)))
298-
}
299-
Err(_err) => {
300-
// Return None for procedure but still collect errors
301-
Ok((None, std::mem::take(&mut inner.problems)))
302-
}
303-
}
284+
let result = inner.read_procedure();
285+
let errors = std::mem::take(&mut inner.problems);
286+
Ok((result, errors))
304287
},
305288
)
306-
.map(|(maybe_proc, errors)| {
307-
// Transfer errors from subparser to main parser
289+
.and_then(|(result, errors)| {
308290
self.problems
309291
.extend(errors);
310-
maybe_proc
311-
})
312-
.unwrap_or_else(|error| {
292+
result
293+
}) {
294+
Ok(procedure) => {
295+
procedures.push(procedure);
296+
}
297+
Err(error) => {
313298
self.problems
314299
.push(error);
315-
// Return None on error
316-
None
317-
});
318-
319-
// Only add procedure if recovery was successful
320-
if let Some(procedure) = procedure_result {
321-
procedures.push(procedure);
300+
}
322301
}
323302
} else {
324303
self.problems
@@ -924,8 +903,10 @@ impl<'i> Parser<'i> {
924903
result
925904
}
926905

927-
928-
fn parse_procedure_block(&mut self, parser: &mut Parser<'i>) -> Result<Procedure<'i>, ParsingError<'i>> {
906+
fn parse_procedure_block(
907+
&mut self,
908+
parser: &mut Parser<'i>,
909+
) -> Result<Procedure<'i>, ParsingError<'i>> {
929910
// Extract the declaration with recovery
930911
let declaration = match self.parse_declaration(parser) {
931912
Ok(decl) => decl,
@@ -1061,11 +1042,14 @@ impl<'i> Parser<'i> {
10611042
fn parse_declaration(
10621043
&mut self,
10631044
parser: &mut Parser<'i>,
1064-
) -> Result<(
1065-
Identifier<'i>,
1066-
Option<Vec<Identifier<'i>>>,
1067-
Option<Signature<'i>>,
1068-
), ParsingError<'i>> {
1045+
) -> Result<
1046+
(
1047+
Identifier<'i>,
1048+
Option<Vec<Identifier<'i>>>,
1049+
Option<Signature<'i>>,
1050+
),
1051+
ParsingError<'i>,
1052+
> {
10691053
// Find declaration block boundaries
10701054
let mut i = 0;
10711055
let mut begun = false;

0 commit comments

Comments
 (0)