1use persil::Profiler;
2
3#[derive(Debug)]
4enum Expr {
5 Number(i64),
6 Identifier(String),
7}
8
9fn main() {
10 let profiler = Profiler::from_name("parser").expect("failed to create profiler");
11 profiler.enable();
12
13 let result = parse_expression(&profiler, "1234");
14 match result {
15 Ok(expr) => println!("got expr: {:?}", expr),
16 Err(msg) => eprintln!("failed to parse expr: {}", msg),
17 }
18}
19
20fn parse_expression(profiler: &Profiler, input: &str) -> Result<Expr, &'static str> {
21 let _p = profiler.trace("parsing", "expression");
23
24 input
25 .parse::<i64>()
26 .map(|num| Expr::Number(num))
27 .or_else(|_| {
28 if input.chars().all(char::is_alphabetic) {
29 Ok(Expr::Identifier(input.to_string()))
30 } else {
31 Err("invalid identifier")
32 }
33 })
34 .map_err(|_| "invalid expression")
35}