expr/lib.rs
1//!
2//! Example:
3//! ```
4//! use expr::{Context, Parser};
5//!
6//! let mut p = Parser::new();
7//!
8//! let mut ctx = Context::default();
9//! ctx.insert("two".to_string(), 2);
10//!
11//! let three: i64 = p.eval("1 + two", &ctx).unwrap().as_number().unwrap();
12//! assert_eq!(three, 3);
13//!
14//! p.add_function("add", |c| {
15//! let mut sum = 0;
16//! for arg in c.args {
17//! sum += arg.as_number().unwrap();
18//! }
19//! Ok(sum.into())
20//! });
21//!
22//! let six: i64 = p.eval("add(1, two, 3)", &ctx).unwrap().as_number().unwrap();
23//! assert_eq!(six, 6);
24//! ```
25mod ast;
26mod context;
27mod error;
28mod functions;
29mod parser;
30mod pest;
31mod pratt;
32#[cfg(test)]
33mod test;
34mod value;
35
36pub use crate::context::Context;
37pub use crate::error::{Error, Result};
38pub use crate::parser::Parser;
39pub use crate::ast::program::Program;
40pub use crate::value::Value;
41
42use pest_derive::Parser as PestParser;
43
44#[derive(PestParser)]
45#[grammar = "expr.pest"]
46pub(crate) struct ExprPest;