From b111ee38909e17e916ee6cf801cc22ea147c2f85 Mon Sep 17 00:00:00 2001 From: Simon Gardling Date: Wed, 16 Feb 2022 13:34:18 -0500 Subject: [PATCH] SOO much better error handling! --- src/lib.rs | 18 ++++++++++++++++-- www/index.js | 7 +++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index a7bde29..1a27ef2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -57,12 +57,26 @@ impl ChartManager { // Used in order to hook into `panic!()` to log in the browser's console pub fn init_panic_hook() { panic::set_hook(Box::new(console_error_panic_hook::hook)); } + pub fn test_func(function_string: String) -> String { + let expr: Expr = function_string.parse().unwrap(); + let func_result = expr.bind("x"); + match func_result { + Ok(_) => "".to_string(), + Err(error) => format!("{}", error), + } + } + + fn get_func(&self) -> impl Fn(f64) -> f64 { + let expr: Expr = self.func_str.parse().unwrap(); + let func = expr.bind("x").unwrap(); + return func; + } + #[inline] fn draw( &mut self, element: HtmlCanvasElement, ) -> DrawResult<(impl Fn((i32, i32)) -> Option<(f32, f32)>, f32)> { - let expr: Expr = self.func_str.parse().unwrap(); - let func = expr.bind("x").unwrap(); + let func = self.get_func(); let backend = CanvasBackend::with_canvas_object(element).unwrap(); let root = backend.into_drawing_area(); diff --git a/www/index.js b/www/index.js index a8e6ef7..0970ae9 100644 --- a/www/index.js +++ b/www/index.js @@ -78,6 +78,13 @@ function updatePlot() { chart_manager = ChartManager.new(math_function.value, Number(minX.value), Number(maxX.value), Number(minY.value), Number(maxY.value), Number(num_interval.value), Number(resolution.value)); } + const test_result = ChartManager.test_func(math_function.value); + if (test_result != "") { + status.style.color = "red"; + status.innerText = test_result; + return; + } + try { const start = performance.now(); chart = chart_manager.update(canvas, math_function.value, Number(minX.value), Number(maxX.value), Number(minY.value), Number(maxY.value), Number(num_interval.value), Number(resolution.value));