Skip to content

Commit 23bae52

Browse files
committed
Refactor chalk-parse/src/lib.rs
1 parent 955533c commit 23bae52

File tree

1 file changed

+34
-38
lines changed

1 file changed

+34
-38
lines changed

chalk-parse/src/lib.rs

Lines changed: 34 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -9,54 +9,50 @@ pub mod ast;
99
lalrpop_mod!(pub parser);
1010

1111
use lalrpop_util::ParseError;
12-
use std::fmt::Write;
1312

1413
type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;
1514

1615
pub fn parse_program(text: &str) -> Result<ast::Program> {
17-
match parser::ProgramParser::new().parse(text) {
18-
Ok(v) => Ok(v),
19-
Err(e) => Err(format!("parse error: {}", e).into()),
20-
}
16+
parser::ProgramParser::new()
17+
.parse(text)
18+
.map_err(|e| format!("parse error: {}", e).into())
2119
}
2220

2321
pub fn parse_ty(text: &str) -> Result<ast::Ty> {
24-
match parser::TyParser::new().parse(text) {
25-
Ok(v) => Ok(v),
26-
Err(e) => Err(format!("error parsing `{}`: {}", text, e).into()),
27-
}
22+
parser::TyParser::new()
23+
.parse(text)
24+
.map_err(|e| format!("error parsing `{}`: {}", text, e).into())
2825
}
2926

3027
pub fn parse_goal(text: &str) -> Result<Box<ast::Goal>> {
31-
match parser::GoalParser::new().parse(text) {
32-
Ok(v) => Ok(v),
33-
Err(e) => {
34-
let position_string = |start: usize, end: usize| {
35-
let mut output = String::new();
36-
let text = text.replace("\n", " ").replace("\r", " ");
37-
writeln!(output, "position: `{}`", text).expect("str-write cannot fail");
38-
output.push_str(&" ".repeat(11 + start));
39-
output.push_str(&"^".repeat(end - start));
40-
output.push_str("\n");
41-
output
42-
};
43-
match e {
44-
ParseError::InvalidToken { location } => Err(format!(
45-
"parse error: {}\n{}",
46-
e,
47-
position_string(location, location + 1)
48-
)
49-
.into()),
50-
ParseError::UnrecognizedToken {
51-
token: (start, _, end),
52-
..
53-
} => Err(format!("parse error: {}\n{}", e, position_string(start, end)).into()),
54-
ParseError::ExtraToken {
55-
token: (start, _, end),
56-
..
57-
} => Err(format!("parse error: {}\n{}", e, position_string(start, end)).into()),
58-
_ => Err(format!("parse error: {}", e).into()),
28+
parser::GoalParser::new().parse(text).map_err(|e| {
29+
let mut output = format!("parse error: {}", &e);
30+
if let Some(s) = match e {
31+
ParseError::InvalidToken { location } => {
32+
Some(position_string(text, location, location + 1))
5933
}
34+
ParseError::UnrecognizedToken {
35+
token: (start, _, end),
36+
..
37+
} => Some(position_string(text, start, end)),
38+
ParseError::ExtraToken {
39+
token: (start, _, end),
40+
..
41+
} => Some(position_string(text, start, end)),
42+
_ => None,
43+
} {
44+
output.push('\n');
45+
output += &s;
6046
}
61-
}
47+
output.into()
48+
})
49+
}
50+
51+
fn position_string(text: &str, start: usize, end: usize) -> String {
52+
let text = text.replace('\n', " ").replace('\r', " ");
53+
let mut output = format!("position: `{}`", text);
54+
output += &" ".repeat(11 + start);
55+
output += &"^".repeat(end - start);
56+
output.push('\n');
57+
output
6258
}

0 commit comments

Comments
 (0)