diff --git a/src/controls/button.rs b/src/controls/button.rs index 841d64b..a3d39fe 100644 --- a/src/controls/button.rs +++ b/src/controls/button.rs @@ -4,10 +4,12 @@ use leptos::RwSignal; use std::rc::Rc; use web_sys::MouseEvent; +type ButtonAction = dyn Fn(MouseEvent, &mut FD); + #[derive(Clone)] pub struct ButtonData { pub(crate) text: String, - pub(crate) action: Option>, + pub(crate) action: Option>>, } impl Default for ButtonData { fn default() -> Self { diff --git a/src/controls/group.rs b/src/controls/group.rs index 9ddf664..27711ac 100644 --- a/src/controls/group.rs +++ b/src/controls/group.rs @@ -15,7 +15,7 @@ impl FormBuilder { let (views, validation_cbs): (Vec<_>, Vec<_>) = group_builder .render_fns .into_iter() - .map(|r_fn| r_fn(&fs, fd)) + .map(|r_fn| r_fn(fs, fd)) .unzip(); let view = fs.group(super::ControlRenderData { diff --git a/src/form_builder.rs b/src/form_builder.rs index 73c317c..de96f90 100644 --- a/src/form_builder.rs +++ b/src/form_builder.rs @@ -1,8 +1,8 @@ use crate::{ controls::{ BuiltControlData, BuiltVanityControlData, ControlBuilder, ControlData, ControlRenderData, - FieldGetter, FieldSetter, ParseFn, RenderFn, UnparseFn, ValidationCb, ValidationFn, - VanityControlBuilder, VanityControlData, + FieldSetter, ParseFn, RenderFn, ValidationCb, ValidationFn, VanityControlBuilder, + VanityControlData, }, form::{Form, FormToolData, FormValidator}, styles::FormStyle, @@ -87,33 +87,17 @@ impl FormBuilder { &mut self, control: ControlBuilder, ) { - let BuiltControlData { - render_data, - getter, - setter, - parse_fn, - unparse_fn, - validation_fn, - } = match control.build() { + let built_control_data = match control.build() { Ok(c) => c, Err(e) => panic!("Invalid Component: {}", e), }; - if let Some(ref validation_fn) = validation_fn { + if let Some(ref validation_fn) = built_control_data.validation_fn { self.validations.push(validation_fn.clone()); } let render_fn = move |fs: &FS, fd: RwSignal| { - let (view, cb) = Self::build_control_view( - fd, - fs, - getter, - setter, - unparse_fn, - parse_fn, - validation_fn, - render_data, - ); + let (view, cb) = Self::build_control_view(fd, fs, built_control_data); (view, Some(cb)) }; @@ -123,13 +107,17 @@ impl FormBuilder { fn build_control_view( fd: RwSignal, fs: &FS, - getter: Rc>, - setter: Rc>, - unparse_fn: Box::ReturnType, FDT>>, - parse_fn: Box::ReturnType, FDT>>, - validation_fn: Option>>, - render_data: crate::controls::ControlRenderData, + control_data: BuiltControlData, ) -> (View, Box) { + let BuiltControlData { + render_data, + getter, + setter, + parse_fn, + unparse_fn, + validation_fn, + } = control_data; + let (validation_signal, validation_signal_set) = create_signal(Ok(())); let validation_fn_clone = validation_fn.clone(); let value_getter = move || { diff --git a/src/validation_builder.rs b/src/validation_builder.rs index 43c4514..b70b254 100644 --- a/src/validation_builder.rs +++ b/src/validation_builder.rs @@ -1,6 +1,12 @@ use crate::{controls::ValidationFn, FormToolData}; use std::fmt::Display; +/// A function that validates a field. +/// +/// This is similar to [`ValidationFn`](crate::controls::ValidationFn) +/// but takes a &str for the name of the field for improved error messages. +type ValidationBuilderFn = dyn Fn(&str, &T) -> Result<(), String> + 'static; + /// A helper builder that allows you to specify a validation function /// declaritivly /// @@ -14,7 +20,7 @@ pub struct ValidationBuilder { /// The getter function for the field to validate. field_fn: Box &T + 'static>, /// The functions to be called when validating. - functions: Vec Result<(), String> + 'static>>, + functions: Vec>>, } impl ValidationBuilder {