Skip to content

Commit d0e7f82

Browse files
committed
Clean up and fixes
1 parent 0a01fc0 commit d0e7f82

3 files changed

Lines changed: 46 additions & 60 deletions

File tree

bin/src/main.rs

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use clap::{ArgAction, Parser};
2-
use expr_solver::{SymTable, Symbol, eval_file_with_table, load_with_table};
2+
use expr_solver::{Program, SymTable, Symbol};
33
use rust_decimal::prelude::*;
44
use std::path::PathBuf;
55

@@ -61,29 +61,31 @@ fn run() -> Result<(), String> {
6161
return Ok(());
6262
}
6363

64-
// load either from string input or a file
65-
if let Some(expr) = args.expression.as_ref().or(args.expr.as_ref()) {
66-
let program = load_with_table(expr, table)?;
67-
68-
if args.assembly {
69-
print!("{}", program.get_assembly());
70-
return Ok(());
71-
}
72-
73-
// save to a file?
74-
if let Some(output_path) = &args.output {
75-
program
76-
.save_bytecode_to_file(output_path)
77-
.map_err(|e| e.to_string())?
78-
} else {
79-
let res = program.execute().map_err(|e| e.to_string())?;
80-
println!("{res}");
81-
}
82-
} else if let Some(input) = &args.input {
83-
let res = eval_file_with_table(input.to_string_lossy().as_ref(), table)?;
84-
println!("{res}");
64+
// Load input from either expression or file
65+
let program = if let Some(expr) = args.expression.as_ref().or(args.expr.as_ref()) {
66+
Program::new_from_source(expr)
67+
.map_err(|err| err.to_string())?
68+
.link(table)
69+
.map_err(|err| err.to_string())?
70+
} else if let Some(file) = &args.input {
71+
Program::new_from_file(file.to_string_lossy().as_ref())
72+
.map_err(|err| err.to_string())?
73+
.link(table)
74+
.map_err(|err| err.to_string())?
8575
} else {
8676
return Err("no input".to_string());
77+
};
78+
79+
// Act on the loaded program
80+
if args.assembly {
81+
print!("{}", program.get_assembly());
82+
} else if let Some(output_path) = &args.output {
83+
program
84+
.save_bytecode_to_file(output_path)
85+
.map_err(|e| e.to_string())?;
86+
} else {
87+
let res = program.execute().map_err(|e| e.to_string())?;
88+
println!("{res}");
8789
}
8890

8991
Ok(())

lib/src/lib.rs

Lines changed: 9 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@
4040
//! The `Program` type uses the type-state pattern to enforce correct usage:
4141
//!
4242
//! ```
43-
//! use expr_solver::{load, SymTable};
43+
//! use expr_solver::{SymTable, Program};
4444
//! use rust_decimal_macros::dec;
4545
//!
4646
//! // Compile expression to bytecode
47-
//! let program = load("x + y").unwrap();
47+
//! let program = Program::new_from_source("x + y").unwrap();
4848
//!
4949
//! // Link with symbol table (validated at link time)
5050
//! let mut table = SymTable::new();
@@ -109,8 +109,7 @@ pub use vm::{Vm, VmError};
109109
/// assert_eq!(result.to_string(), "14");
110110
/// ```
111111
pub fn eval(expression: &str) -> Result<Decimal, String> {
112-
let program = load_with_table(expression, SymTable::stdlib())?;
113-
program.execute().map_err(|err| err.to_string())
112+
eval_with_table(expression, SymTable::stdlib())
114113
}
115114

116115
/// Evaluates an expression string with a custom symbol table.
@@ -128,8 +127,12 @@ pub fn eval(expression: &str) -> Result<Decimal, String> {
128127
/// assert_eq!(result, dec!(84));
129128
/// ```
130129
pub fn eval_with_table(expression: &str, table: SymTable) -> Result<Decimal, String> {
131-
let program = load_with_table(expression, table)?;
132-
program.execute().map_err(|err| err.to_string())
130+
Program::new_from_source(expression)
131+
.map_err(|err| err.to_string())?
132+
.link(table)
133+
.map_err(|err| err.to_string())?
134+
.execute()
135+
.map_err(|err| err.to_string())
133136
}
134137

135138
/// Evaluates an expression from a binary file with the standard library.
@@ -159,34 +162,3 @@ pub fn eval_file_with_table(path: impl AsRef<str>, table: SymTable) -> Result<De
159162
let linked = program.link(table).map_err(|err| err.to_string())?;
160163
linked.execute().map_err(|err| err.to_string())
161164
}
162-
163-
/// Loads and compiles an expression, returning a compiled program.
164-
///
165-
/// # Examples
166-
///
167-
/// ```
168-
/// use expr_solver::{load, SymTable};
169-
///
170-
/// let program = load("2 + 3 * 4").unwrap();
171-
/// let linked = program.link(SymTable::stdlib()).unwrap();
172-
/// let result = linked.execute().unwrap();
173-
/// assert_eq!(result.to_string(), "14");
174-
/// ```
175-
pub fn load(expression: &str) -> Result<Program<'_, Compiled>, String> {
176-
Program::new_from_source(expression).map_err(|err| err.to_string())
177-
}
178-
179-
/// Loads, compiles, and links an expression, returning a ready-to-execute program.
180-
///
181-
/// # Examples
182-
///
183-
/// ```
184-
/// use expr_solver::{load_with_table, SymTable};
185-
///
186-
/// let program = load_with_table("sin(pi/2)", SymTable::stdlib()).unwrap();
187-
/// let result = program.execute().unwrap();
188-
/// ```
189-
pub fn load_with_table(expression: &str, table: SymTable) -> Result<Program<'_, Linked>, String> {
190-
let program = load(expression)?;
191-
program.link(table).map_err(|err| err.to_string())
192-
}

lib/tests/integration_tests.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use expr_solver::{SymTable, eval, eval_with_table, load, load_with_table};
1+
use expr_solver::{Compiled, Linked, Program, SymTable, eval, eval_with_table};
22
use indoc::indoc;
33
use rust_decimal::{Decimal, MathematicalOps};
44
use rust_decimal_macros::dec;
@@ -250,6 +250,18 @@ fn test_if_function_semantic_errors() {
250250
// Program API Tests
251251
// ====================
252252

253+
fn load_with_table(
254+
expr: &'static str,
255+
table: SymTable,
256+
) -> Result<Program<'static, Linked>, String> {
257+
let program = Program::new_from_source(expr).map_err(|err| err.to_string())?;
258+
program.link(table).map_err(|err| err.to_string())
259+
}
260+
261+
fn load(expr: &'static str) -> Result<Program<'static, Compiled>, String> {
262+
Program::new_from_source(expr).map_err(|err| err.to_string())
263+
}
264+
253265
#[test]
254266
fn test_program_basic_arithmetic() {
255267
let program = load_with_table("2 + 3 * 4", SymTable::stdlib()).expect("link failed");

0 commit comments

Comments
 (0)