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 eval;
28mod error;
29mod functions;
30mod parser;
31mod pest;
32mod pratt;
33#[cfg(feature = "serde")]
34mod serde;
35#[cfg(test)]
36mod test;
37mod value;
38
39pub use crate::context::Context;
40pub use crate::error::{Error, Result};
41pub use crate::eval::{Environment, run, eval};
42pub use crate::parser::compile;
43#[allow(deprecated)]
44pub use crate::parser::Parser;
45pub use crate::ast::program::Program;
46pub use crate::value::Value;
47#[cfg(feature = "serde")]
48pub use crate::serde::{from_value, to_value};
49
50use pest_derive::Parser as PestParser;
51
52#[derive(PestParser)]
53#[grammar = "expr.pest"]
54pub(crate) struct ExprPest;