first stab

This commit is contained in:
2024-03-15 21:12:19 -05:00
parent eab2e1b19b
commit bf6529cc1d
10 changed files with 355 additions and 5 deletions
+59
View File
@@ -0,0 +1,59 @@
use controls::{
heading::HeadingData, select::SelectData, submit::SubmitData, text_area::TextAreaData,
text_input::TextInputData,
};
use leptos::*;
use std::marker::PhantomData;
mod controls;
mod provider_impl;
pub trait FormStyleProvider {
type StylingAttributes;
fn heading(&self, data: HeadingData, attributes: Vec<Self::StylingAttributes>) -> View;
fn text_input(&self, data: TextInputData, attributes: Vec<Self::StylingAttributes>) -> View;
fn select(&self, data: SelectData, attributes: Vec<Self::StylingAttributes>) -> View;
fn submit(&self, data: SubmitData, attributes: Vec<Self::StylingAttributes>) -> View;
fn text_area(&self, data: TextAreaData, attributes: Vec<Self::StylingAttributes>) -> View;
fn custom_component(&self, component: View) -> View;
// TODO: add group
}
pub trait ControlData<FS: FormStyleProvider>: 'static {
fn build_control(self, fs: &FS, attributes: Vec<FS::StylingAttributes>) -> View;
}
pub struct FormBuilder<FD: FormData, FS: FormStyleProvider> {
_fd: PhantomData<FD>,
fs: FS,
controls: Vec<(Box<dyn ControlData<FS>>, Vec<FS::StylingAttributes>)>,
}
pub trait FormData {}
pub struct ControlBuilder<FD: FormData, FS: FormStyleProvider, C: ControlData<FS>> {
fb: FormBuilder<FD, FS>,
parse_fn: Option<Box<dyn Fn(&str, &mut FD)>>,
style_attributes: Vec<FS::StylingAttributes>,
data: C,
}
impl<FD: FormData, FS: FormStyleProvider, C: ControlData<FS>> ControlBuilder<FD, FS, C> {
pub fn parse_fn(mut self, parse_fn: Box<dyn Fn(&str, &mut FD)>) -> Self {
self.parse_fn = Some(parse_fn);
self
}
pub fn style(mut self, attribute: FS::StylingAttributes) -> Self {
self.style_attributes.push(attribute);
self
}
pub fn end(mut self) -> FormBuilder<FD, FS> {
self.fb
.controls
.push((Box::new(self.data), self.style_attributes));
self.fb
}
}