1pub mod ast;
15mod value;
16
17use ast::{
18 parser::{AnnotatedExprParser, ExprParser},
19 AnnotatedError, ParseError as UserParseError,
20};
21use lalrpop_util::ParseError;
22pub(crate) use value::Result;
23pub use value::{ArithmeticError, Error as ValueError, ParseValueError, Value};
24
25#[derive(Default)]
30pub struct Context {
31 pub history: Vec<Value>,
32}
33
34#[derive(Debug, thiserror::Error)]
35pub enum Error {
36 #[error("Parsing")]
37 Parse(#[from] ParseError<usize, &'static str, UserParseError>),
38 #[error("Evaluating")]
39 Eval(#[from] ValueError),
40 #[error("Formatting")]
41 Format(#[source] num_runtime_fmt::Error),
42}
43
44impl From<AnnotatedError> for Error {
45 fn from(err: AnnotatedError) -> Self {
46 match err {
47 AnnotatedError::Calculation(err) => Self::Eval(err),
48 AnnotatedError::Format(err) => Self::Format(err),
49 }
50 }
51}
52
53impl Context {
54 pub fn evaluate(&mut self, expr: &str) -> Result<Value, Error> {
58 let parser = ExprParser::new();
59 let expr = parser.parse(expr).map_err(|err| err.map_token(|_| ""))?;
60 let result = expr.evaluate(self).map_err(Error::Eval)?;
61 self.history.push(result);
62 Ok(result)
63 }
64}
65
66impl Context {
67 pub fn evaluate_annotated(&mut self, expr: &str) -> Result<String, Error> {
74 let parser = AnnotatedExprParser::new();
75 let expr = parser.parse(expr).map_err(|err| err.map_token(|_| ""))?;
76 let (result, formatted) = expr.evaluate(self)?;
77 self.history.push(result);
78 Ok(formatted)
79 }
80}