From bc1216ef268685d89fe0b51683c802f15b000e3b Mon Sep 17 00:00:00 2001 From: Mitchell M Date: Fri, 19 Apr 2024 17:29:18 -0500 Subject: [PATCH] minor fixes --- src/controls/mod.rs | 4 ++-- src/form.rs | 13 ++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/controls/mod.rs b/src/controls/mod.rs index 6b383cc..a940c42 100644 --- a/src/controls/mod.rs +++ b/src/controls/mod.rs @@ -11,13 +11,13 @@ pub mod text_input; // TODO: change to returning an Option pub trait ValidationFn: Fn(&FDT) -> Result<(), String> + 'static {} -pub trait ParseFn: Fn(&CR) -> Result + 'static {} +pub trait ParseFn: Fn(CR) -> Result + 'static {} pub trait UnparseFn: Fn(&FDT) -> CR + 'static {} pub trait FieldFn: Fn(&mut FD) -> &mut FDT + 'static {} // implement the traits for all valid types impl ValidationFn for T where T: Fn(&FDT) -> Result<(), String> + 'static {} -impl ParseFn for F where F: Fn(&CR) -> Result + 'static {} +impl ParseFn for F where F: Fn(CR) -> Result + 'static {} impl UnparseFn for F where F: Fn(&FDT) -> CR + 'static {} impl FieldFn for F where F: Fn(&mut FD) -> &mut FDT + 'static {} diff --git a/src/form.rs b/src/form.rs index ad619d1..5516411 100644 --- a/src/form.rs +++ b/src/form.rs @@ -231,7 +231,7 @@ impl FormBuilder { let fd = builder.fd.clone(); let value_setter = move |value| { // TODO: also do this on a submit somehow - let parsed = match parse_fn(&value) { + let parsed = match parse_fn(value) { Ok(p) => p, Err(e) => { validation_signal_set.set(Err(e)); @@ -242,14 +242,17 @@ impl FormBuilder { // parse succeeded, update value and validate let field_fn = field_fn.clone(); // move let validation_fn = validation_fn.clone(); // move + + // TODO: change this to a get then set, so that if the validation fails, + // The value is not actually updated fd.update(move |fd| { let field = field_fn(fd); *field = parsed; - validation_fn - .as_ref() - .and_then(|vfn| vfn(fd).err()) - .map(|e| validation_signal_set.set(Err(e))); + if let Some(ref validation_fn) = validation_fn { + let validation_result = (validation_fn)(fd); + validation_signal_set.set(validation_result); + } }); }; let value_setter = Box::new(value_setter);