expr/
lib.rs

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
37
38
39
40
41
42
43
44
45
46
//!
//! Example:
//! ```
//! use expr::{Context, Parser};
//!
//! let mut p = Parser::new();
//!
//! let mut ctx = Context::default();
//! ctx.insert("two".to_string(), 2);
//!
//! let three: i64 = p.eval("1 + two", &ctx).unwrap().as_number().unwrap();
//! assert_eq!(three, 3);
//!
//! p.add_function("add", |c| {
//!   let mut sum = 0;
//!   for arg in c.args {
//!     sum += arg.as_number().unwrap();
//!   }
//!   Ok(sum.into())
//! });
//!
//! let six: i64 = p.eval("add(1, two, 3)", &ctx).unwrap().as_number().unwrap();
//! assert_eq!(six, 6);
//! ```
mod ast;
mod context;
mod error;
mod functions;
mod parser;
mod pest;
mod pratt;
#[cfg(test)]
mod test;
mod value;

pub use crate::context::Context;
pub use crate::error::{Error, Result};
pub use crate::parser::Parser;
pub use crate::ast::program::Program;
pub use crate::value::Value;

use pest_derive::Parser as PestParser;

#[derive(PestParser)]
#[grammar = "expr.pest"]
pub(crate) struct ExprPest;