Add context #27

Merged
mitchell merged 3 commits from feature/context into main 2024-06-12 23:45:35 +00:00
15 changed files with 48 additions and 79 deletions
Showing only changes of commit e371ff748b - Show all commits

View File

@ -1,7 +1,6 @@
use leptos::{Signal, View};
use super::{ControlBuilder, ControlData, ControlRenderData};
use super::{BuilderFn, ControlBuilder, ControlData, ControlRenderData};
use crate::{form::FormToolData, form_builder::FormBuilder, styles::FormStyle};
use leptos::{Signal, View};
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct CheckboxData {
@ -26,9 +25,7 @@ impl ControlData for CheckboxData {
impl<FD: FormToolData, FS: FormStyle, CX: 'static> FormBuilder<FD, FS, CX> {
pub fn checkbox<FDT: Clone + PartialEq + 'static>(
self,
builder: impl Fn(
ControlBuilder<FD, FS, CheckboxData, FDT>,
) -> ControlBuilder<FD, FS, CheckboxData, FDT>,
builder: impl BuilderFn<ControlBuilder<FD, FS, CheckboxData, FDT>, CX>,
) -> Self {
self.new_control(builder)
}

View File

@ -1,4 +1,4 @@
use super::{ControlBuilder, ControlData};
use super::{BuilderFn, ControlBuilder, ControlData};
use crate::{styles::FormStyle, FormBuilder, FormToolData};
impl<FD: FormToolData, FS: FormStyle, CX: 'static> FormBuilder<FD, FS, CX> {
@ -15,7 +15,7 @@ impl<FD: FormToolData, FS: FormStyle, CX: 'static> FormBuilder<FD, FS, CX> {
pub fn custom_default<CC: Default + ControlData, FDT: Clone + PartialEq + 'static>(
self,
builder: impl Fn(ControlBuilder<FD, FS, CC, FDT>) -> ControlBuilder<FD, FS, CC, FDT>,
builder: impl BuilderFn<ControlBuilder<FD, FS, CC, FDT>, CX>,
) -> Self {
self.new_control(builder)
}

View File

@ -1,4 +1,4 @@
use super::{ControlRenderData, VanityControlBuilder, VanityControlData};
use super::{BuilderFn, ControlRenderData, VanityControlBuilder, VanityControlData};
use crate::{form::FormToolData, form_builder::FormBuilder, styles::FormStyle};
use leptos::View;
@ -20,9 +20,7 @@ impl VanityControlData for HeadingData {
impl<FD: FormToolData, FS: FormStyle, CX: 'static> FormBuilder<FD, FS, CX> {
pub fn heading(
self,
builder: impl Fn(
VanityControlBuilder<FD, FS, HeadingData>,
) -> VanityControlBuilder<FD, FS, HeadingData>,
builder: impl BuilderFn<VanityControlBuilder<FD, FS, HeadingData>, CX>,
) -> Self {
self.new_vanity(builder)
}

View File

@ -1,7 +1,6 @@
use leptos::{Signal, View};
use super::{ControlBuilder, ControlData, ControlRenderData};
use super::{BuilderFn, ControlBuilder, ControlData, ControlRenderData};
use crate::{form::FormToolData, form_builder::FormBuilder, styles::FormStyle};
use leptos::{Signal, View};
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct HiddenData;
@ -23,9 +22,7 @@ impl ControlData for HiddenData {
impl<FD: FormToolData, FS: FormStyle, CX: 'static> FormBuilder<FD, FS, CX> {
pub fn hidden<FDT: Clone + PartialEq + 'static>(
self,
builder: impl Fn(
ControlBuilder<FD, FS, HiddenData, FDT>,
) -> ControlBuilder<FD, FS, HiddenData, FDT>,
builder: impl BuilderFn<ControlBuilder<FD, FS, HiddenData, FDT>, CX>,
) -> Self {
self.new_control(builder)
}

View File

@ -18,6 +18,7 @@ pub mod submit;
pub mod text_area;
pub mod text_input;
pub trait BuilderFn<B, CX>: Fn(B, &CX) -> B {}
pub trait ValidationFn<FDT>: Fn(&FDT) -> Result<(), String> + 'static {}
pub trait ValidationCb: Fn() -> bool + 'static {}
pub trait ParseFn<CR, FDT>: Fn(CR) -> Result<FDT, String> + 'static {}
@ -30,6 +31,7 @@ pub trait RenderFn<FS, FD>:
}
// implement the traits for all valid types
impl<B, CX, T> BuilderFn<B, CX> for T where T: Fn(B, &CX) -> B {}
impl<FDT, T> ValidationFn<FDT> for T where T: Fn(&FDT) -> Result<(), String> + 'static {}
impl<T> ValidationCb for T where T: Fn() -> bool + 'static {}
impl<CR, FDT, F> ParseFn<CR, FDT> for F where F: Fn(CR) -> Result<FDT, String> + 'static {}

View File

@ -1,7 +1,8 @@
use leptos::{Signal, View};
use super::{ControlRenderData, GetterVanityControlData, VanityControlBuilder, VanityControlData};
use super::{
BuilderFn, ControlRenderData, GetterVanityControlData, VanityControlBuilder, VanityControlData,
};
use crate::{form::FormToolData, form_builder::FormBuilder, styles::FormStyle};
use leptos::{Signal, View};
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct OutputData;
@ -20,9 +21,7 @@ impl GetterVanityControlData for OutputData {}
impl<FD: FormToolData, FS: FormStyle, CX: 'static> FormBuilder<FD, FS, CX> {
pub fn output(
self,
builder: impl Fn(
VanityControlBuilder<FD, FS, OutputData>,
) -> VanityControlBuilder<FD, FS, OutputData>,
builder: impl BuilderFn<VanityControlBuilder<FD, FS, OutputData>, CX>,
) -> Self {
self.new_vanity(builder)
}

View File

@ -1,7 +1,6 @@
use leptos::{Signal, View};
use super::{ControlBuilder, ControlData, ControlRenderData, ValidatedControlData};
use super::{BuilderFn, ControlBuilder, ControlData, ControlRenderData, ValidatedControlData};
use crate::{form::FormToolData, form_builder::FormBuilder, styles::FormStyle};
use leptos::{Signal, View};
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct RadioButtonsData {
@ -28,9 +27,7 @@ impl ValidatedControlData for RadioButtonsData {}
impl<FD: FormToolData, FS: FormStyle, CX: 'static> FormBuilder<FD, FS, CX> {
pub fn radio_buttons<FDT: Clone + PartialEq + 'static>(
self,
builder: impl Fn(
ControlBuilder<FD, FS, RadioButtonsData, FDT>,
) -> ControlBuilder<FD, FS, RadioButtonsData, FDT>,
builder: impl BuilderFn<ControlBuilder<FD, FS, RadioButtonsData, FDT>, CX>,
) -> Self {
self.new_control(builder)
}

View File

@ -1,4 +1,4 @@
use super::{ControlBuilder, ControlData, ControlRenderData, ValidatedControlData};
use super::{BuilderFn, ControlBuilder, ControlData, ControlRenderData, ValidatedControlData};
use crate::{form::FormToolData, form_builder::FormBuilder, styles::FormStyle};
use leptos::{Signal, View};
@ -30,9 +30,7 @@ impl ValidatedControlData for SelectData {}
impl<FD: FormToolData, FS: FormStyle, CX: 'static> FormBuilder<FD, FS, CX> {
pub fn select<FDT: Clone + PartialEq + 'static>(
self,
builder: impl Fn(
ControlBuilder<FD, FS, SelectData, FDT>,
) -> ControlBuilder<FD, FS, SelectData, FDT>,
builder: impl BuilderFn<ControlBuilder<FD, FS, SelectData, FDT>, CX>,
) -> Self {
self.new_control(builder)
}

View File

@ -1,9 +1,7 @@
use std::ops::RangeInclusive;
use leptos::{Signal, View};
use super::{ControlBuilder, ControlData, ControlRenderData};
use super::{BuilderFn, ControlBuilder, ControlData, ControlRenderData};
use crate::{form::FormToolData, form_builder::FormBuilder, styles::FormStyle};
use leptos::{Signal, View};
use std::ops::RangeInclusive;
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct SliderData {
@ -41,9 +39,7 @@ impl ControlData for SliderData {
impl<FD: FormToolData, FS: FormStyle, CX: 'static> FormBuilder<FD, FS, CX> {
pub fn slider<FDT: Clone + PartialEq + 'static>(
self,
builder: impl Fn(
ControlBuilder<FD, FS, SliderData, FDT>,
) -> ControlBuilder<FD, FS, SliderData, FDT>,
builder: impl BuilderFn<ControlBuilder<FD, FS, SliderData, FDT>, CX>,
) -> Self {
self.new_control(builder)
}

View File

@ -1,7 +1,6 @@
use leptos::{prelude::Signal, View};
use super::{ControlRenderData, VanityControlBuilder, VanityControlData};
use super::{BuilderFn, ControlRenderData, VanityControlBuilder, VanityControlData};
use crate::{form::FormToolData, form_builder::FormBuilder, styles::FormStyle};
use leptos::{prelude::Signal, View};
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct SpacerData {
@ -21,9 +20,7 @@ impl VanityControlData for SpacerData {
impl<FD: FormToolData, FS: FormStyle, CX: 'static> FormBuilder<FD, FS, CX> {
pub fn spacer(
self,
builder: impl Fn(
VanityControlBuilder<FD, FS, SpacerData>,
) -> VanityControlBuilder<FD, FS, SpacerData>,
builder: impl BuilderFn<VanityControlBuilder<FD, FS, SpacerData>, CX>,
) -> Self {
self.new_vanity(builder)
}

View File

@ -1,9 +1,7 @@
use std::ops::RangeInclusive;
use leptos::{Signal, View};
use super::{ControlBuilder, ControlData, ControlRenderData, ValidatedControlData};
use super::{BuilderFn, ControlBuilder, ControlData, ControlRenderData, ValidatedControlData};
use crate::{form::FormToolData, form_builder::FormBuilder, styles::FormStyle};
use leptos::{Signal, View};
use std::ops::RangeInclusive;
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct StepperData {
@ -32,9 +30,7 @@ impl ValidatedControlData for StepperData {}
impl<FD: FormToolData, FS: FormStyle, CX: 'static> FormBuilder<FD, FS, CX> {
pub fn stepper<FDT: Clone + PartialEq + 'static>(
self,
builder: impl Fn(
ControlBuilder<FD, FS, StepperData, FDT>,
) -> ControlBuilder<FD, FS, StepperData, FDT>,
builder: impl BuilderFn<ControlBuilder<FD, FS, StepperData, FDT>, CX>,
) -> Self {
self.new_control(builder)
}

View File

@ -1,7 +1,6 @@
use leptos::{prelude::Signal, View};
use super::{ControlRenderData, VanityControlBuilder, VanityControlData};
use super::{BuilderFn, ControlRenderData, VanityControlBuilder, VanityControlData};
use crate::{form::FormToolData, form_builder::FormBuilder, styles::FormStyle};
use leptos::{prelude::Signal, View};
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct SubmitData {
@ -21,9 +20,7 @@ impl VanityControlData for SubmitData {
impl<FD: FormToolData, FS: FormStyle, CX: 'static> FormBuilder<FD, FS, CX> {
pub fn submit(
self,
builder: impl Fn(
VanityControlBuilder<FD, FS, SubmitData>,
) -> VanityControlBuilder<FD, FS, SubmitData>,
builder: impl BuilderFn<VanityControlBuilder<FD, FS, SubmitData>, CX>,
) -> Self {
self.new_vanity(builder)
}

View File

@ -1,4 +1,4 @@
use super::{ControlBuilder, ControlData, ControlRenderData, ValidatedControlData};
use super::{BuilderFn, ControlBuilder, ControlData, ControlRenderData, ValidatedControlData};
use crate::{form::FormToolData, form_builder::FormBuilder, styles::FormStyle};
use leptos::{Signal, View};
@ -26,9 +26,7 @@ impl ValidatedControlData for TextAreaData {}
impl<FD: FormToolData, FS: FormStyle, CX: 'static> FormBuilder<FD, FS, CX> {
pub fn text_area<FDT: Clone + PartialEq + 'static>(
self,
builder: impl Fn(
ControlBuilder<FD, FS, TextAreaData, FDT>,
) -> ControlBuilder<FD, FS, TextAreaData, FDT>,
builder: impl BuilderFn<ControlBuilder<FD, FS, TextAreaData, FDT>, CX>,
) -> Self {
self.new_control(builder)
}

View File

@ -1,7 +1,6 @@
use leptos::{Signal, View};
use super::{ControlBuilder, ControlData, ControlRenderData, ValidatedControlData};
use super::{BuilderFn, ControlBuilder, ControlData, ControlRenderData, ValidatedControlData};
use crate::{form::FormToolData, form_builder::FormBuilder, styles::FormStyle};
use leptos::{Signal, View};
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct TextInputData {
@ -42,9 +41,7 @@ impl ValidatedControlData for TextInputData {}
impl<FD: FormToolData, FS: FormStyle, CX: 'static> FormBuilder<FD, FS, CX> {
pub fn text_input<FDT: Clone + PartialEq + 'static>(
self,
builder: impl Fn(
ControlBuilder<FD, FS, TextInputData, FDT>,
) -> ControlBuilder<FD, FS, TextInputData, FDT>,
builder: impl BuilderFn<ControlBuilder<FD, FS, TextInputData, FDT>, CX>,
) -> Self {
self.new_control(builder)
}

View File

@ -1,8 +1,8 @@
use crate::{
controls::{
BuiltControlData, BuiltVanityControlData, ControlBuilder, ControlData, ControlRenderData,
FieldSetter, ParseFn, RenderFn, ValidationCb, ValidationFn, VanityControlBuilder,
VanityControlData,
BuilderFn, BuiltControlData, BuiltVanityControlData, ControlBuilder, ControlData,
ControlRenderData, FieldSetter, ParseFn, RenderFn, ValidationCb, ValidationFn,
VanityControlBuilder, VanityControlData,
},
form::{Form, FormToolData, FormValidator},
styles::FormStyle,
@ -52,20 +52,20 @@ impl<FD: FormToolData, FS: FormStyle, CX: 'static> FormBuilder<FD, FS, CX> {
pub(crate) fn new_vanity<C: VanityControlData + Default>(
mut self,
builder: impl Fn(VanityControlBuilder<FD, FS, C>) -> VanityControlBuilder<FD, FS, C>,
builder: impl BuilderFn<VanityControlBuilder<FD, FS, C>, CX>,
) -> Self {
let vanity_builder = VanityControlBuilder::new(C::default());
let control = builder(vanity_builder);
let control = builder(vanity_builder, &self.cx);
self.add_vanity(control);
self
}
pub(crate) fn new_control<C: ControlData + Default, FDT: Clone + PartialEq + 'static>(
mut self,
builder: impl Fn(ControlBuilder<FD, FS, C, FDT>) -> ControlBuilder<FD, FS, C, FDT>,
builder: impl BuilderFn<ControlBuilder<FD, FS, C, FDT>, CX>,
) -> Self {
let control_builder = ControlBuilder::new(C::default());
let control = builder(control_builder);
let control = builder(control_builder, &self.cx);
self.add_control(control);
self
}