minor fixes

This commit is contained in:
Mitchell Marino 2024-04-19 17:29:18 -05:00
parent 40dc1d8cdc
commit bc1216ef26
2 changed files with 10 additions and 7 deletions

View File

@ -11,13 +11,13 @@ pub mod text_input;
// TODO: change to returning an Option<String>
pub trait ValidationFn<FDT>: Fn(&FDT) -> Result<(), String> + 'static {}
pub trait ParseFn<CR, FDT>: Fn(&CR) -> Result<FDT, String> + 'static {}
pub trait ParseFn<CR, FDT>: Fn(CR) -> Result<FDT, String> + 'static {}
pub trait UnparseFn<CR, FDT>: Fn(&FDT) -> CR + 'static {}
pub trait FieldFn<FD, FDT>: Fn(&mut FD) -> &mut FDT + 'static {}
// implement the traits for all valid types
impl<FDT, T> ValidationFn<FDT> for T where T: Fn(&FDT) -> Result<(), String> + 'static {}
impl<CR, FDT, F> ParseFn<CR, FDT> for F where F: Fn(&CR) -> Result<FDT, String> + 'static {}
impl<CR, FDT, F> ParseFn<CR, FDT> for F where F: Fn(CR) -> Result<FDT, String> + 'static {}
impl<CR, FDT, F> UnparseFn<CR, FDT> for F where F: Fn(&FDT) -> CR + 'static {}
impl<FD, FDT, F> FieldFn<FD, FDT> for F where F: Fn(&mut FD) -> &mut FDT + 'static {}

View File

@ -231,7 +231,7 @@ impl<FD: FormData, FS: FormStyle> FormBuilder<FD, FS> {
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<FD: FormData, FS: FormStyle> FormBuilder<FD, FS> {
// 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);