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
28
29
30
31
32
33
34
35
36
mod ast;
mod parser;
pub mod primitive;

#[doc(html_no_source)]
pub use crate::primitive::OpResult;
pub use crate::primitive::Primitive;

/// Contains an expression parser.
/// # Examples
/// ```rust
/// # use shroom::*;
/// let shrm = Shroom::new();
/// assert_eq!(shrm.eval("2 + 3 * 4").unwrap().unwrap_int(), 14);
/// ```
pub struct Shroom {
    parser: parser::ExpressionParser,
}

impl Shroom {
    /// Constructs a new expression parser
    pub fn new() -> Shroom {
        Shroom {
            parser: parser::ExpressionParser::new(),
        }
    }

    /// Evaluates the given string as a Shroom expression  
    ///
    pub fn eval(&self, expr: &str) -> OpResult {
        match self.parser.parse(expr) {
            Ok(v) => v.eval(),
            Err(_) => Err("syntax error".to_string()),
        }
    }
}