Skip to main content

simple/
simple.rs

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    // We will trace the `parse_expression` function using this.
22    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}