summaryrefslogtreecommitdiff
path: root/rust/src/parser.rs
blob: d5d4c30484586efbd44c15debfd752cefbc8f6f6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
use crate::ast::*;

pub fn parse(arg: &str) -> Value {
    let token = arg.trim();
    parse_number(token)
        .or(parse_bool(token))
        .or(parse_symbol(token))
        .unwrap()
}

fn parse_symbol(token: &str) -> Result<Value, String> {
    Ok(Value::Sym(token.to_string()))
}

fn parse_bool(token: &str) -> Result<Value, String> {
    token
        .parse::<bool>()
        .map(Value::Bool)
        .map_err(|e| e.to_string())
}

fn parse_number(token: &str) -> Result<Value, String> {
    token
        .parse::<i32>()
        .map(Value::Num)
        .map_err(|e| e.to_string())
}