generated from mitchell/rust_template
minor fixes
This commit is contained in:
parent
40dc1d8cdc
commit
bc1216ef26
@ -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 {}
|
||||
|
||||
|
||||
13
src/form.rs
13
src/form.rs
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user