reinhardt_forms/lib.rs
1#![warn(missing_docs)]
2
3//! # Reinhardt Forms
4//!
5//! Form processing and validation for the Reinhardt framework.
6//!
7//! ## Overview
8//!
9//! This crate provides comprehensive form processing capabilities inspired by Django's
10//! form system, focusing on data validation and multi-step form wizards.
11//!
12//! This crate is designed to be WASM-compatible, providing a pure form processing layer
13//! without HTML generation or platform-specific features.
14//!
15//! ## Features
16//!
17//! - **[`Form`]**: Base form class with validation
18//! - **[`ModelForm`]**: Auto-generated forms from model definitions
19//! - **[`FormSet`]**: Handle multiple forms of the same type
20//! - **[`FormWizard`]**: Multi-step form workflows
21//! - **Field Types**: 20+ field types (CharField, IntegerField, EmailField, etc.)
22//! - **WASM Support**: Compatible with WebAssembly targets via `wasm_compat` module
23//!
24//! ## Quick Start
25//!
26//! ### Basic Form
27//!
28//! ```rust,ignore
29//! use reinhardt_forms::{Form, CharField, EmailField, IntegerField};
30//!
31//! // Build a form imperatively using add_field()
32//! let mut form = Form::new();
33//! form.add_field(Box::new(CharField::new("name")));
34//! form.add_field(Box::new(EmailField::new("email")));
35//! form.add_field(Box::new(IntegerField::new("age")));
36//! form.add_field(Box::new(CharField::new("message")));
37//!
38//! // Validate form data
39//! form.bind(&request_data);
40//! if form.is_valid() {
41//! // Process the validated form...
42//! } else {
43//! let errors = form.errors();
44//! }
45//! ```
46//!
47//! ### Model Form
48//!
49//! ```rust,ignore
50//! use reinhardt_forms::{ModelForm, ModelFormBuilder};
51//!
52//! // Auto-generate form from User model
53//! let form = ModelFormBuilder::<User>::new()
54//! .fields(vec!["username".to_string(), "email".to_string(), "bio".to_string()])
55//! .exclude(vec!["password".to_string()])
56//! .build();
57//! ```
58//!
59//! ## Available Field Types
60//!
61//! | Field | Description |
62//! |-------|-------------|
63//! | [`CharField`] | Text input with max_length validation |
64//! | [`IntegerField`] | Integer input with min/max validation |
65//! | [`FloatField`] | Floating-point number input |
66//! | [`DecimalField`] | Decimal number with precision control |
67//! | [`BooleanField`] | Checkbox input |
68//! | [`EmailField`] | Email address validation |
69//! | [`URLField`] | URL validation |
70//! | [`DateField`] | Date input with format parsing |
71//! | [`DateTimeField`] | DateTime input |
72//! | [`TimeField`] | Time input |
73//! | [`DurationField`] | Duration input |
74//! | [`FileField`] | File upload |
75//! | [`ImageField`] | Image upload with dimension validation |
76//! | [`ChoiceField`] | Select dropdown |
77//! | [`MultipleChoiceField`] | Multi-select |
78//! | [`ModelChoiceField`] | Foreign key selection |
79//! | [`JSONField`] | JSON data input |
80//! | [`UUIDField`] | UUID input |
81//! | [`SlugField`] | URL-safe slug input |
82//! | [`RegexField`] | Custom regex validation |
83//!
84//! ## FormSets
85//!
86//! Handle multiple forms of the same type:
87//!
88//! ```rust,ignore
89//! use reinhardt_forms::{FormSet, FormSetFactory};
90//!
91//! // Create a formset with 3 forms
92//! let formset = FormSetFactory::<ItemForm>::new()
93//! .extra(3)
94//! .min_num(1)
95//! .max_num(10)
96//! .build();
97//!
98//! if formset.is_valid() {
99//! for form in formset.forms() {
100//! // Process each form
101//! }
102//! }
103//! ```
104//!
105//! ## Form Wizard
106//!
107//! Multi-step forms:
108//!
109//! ```rust,ignore
110//! use reinhardt_forms::{FormWizard, WizardStep};
111//!
112//! let wizard = FormWizard::new()
113//! .add_step(WizardStep::new("account", AccountForm::new()))
114//! .add_step(WizardStep::new("profile", ProfileForm::new()))
115//! .add_step(WizardStep::new("confirmation", ConfirmForm::new()));
116//!
117//! // Process wizard step
118//! let result = wizard.process_step(&request).await?;
119//! ```
120
121/// Bound field rendering with data and errors attached.
122pub mod bound_field;
123/// Core form field trait and error types.
124pub mod field;
125/// Built-in field types (text, email, integer, choice, etc.).
126pub mod fields;
127/// Form trait and validation logic.
128pub mod form;
129/// Formset for managing multiple form instances.
130pub mod formset;
131/// Built-in formset types (inline, base).
132pub mod formsets;
133/// Model-backed form with automatic field generation.
134pub mod model_form;
135/// Model-backed formset for bulk editing.
136pub mod model_formset;
137/// Field-level and form-level validators.
138pub mod validators;
139/// WASM compatibility layer for client-side forms.
140pub mod wasm_compat;
141/// Multi-step form wizard.
142pub mod wizard;
143
144pub use bound_field::BoundField;
145pub use field::{
146 ErrorType,
147 FieldError,
148 FieldResult,
149 FormField as Field, // Alias for compatibility
150 FormField,
151 Widget,
152 escape_attribute,
153 html_escape,
154};
155pub use fields::{
156 BooleanField, CharField, ChoiceField, ColorField, ComboField, DateField, DateTimeField,
157 DecimalField, DurationField, EmailField, FileField, FloatField, GenericIPAddressField,
158 IPProtocol, ImageField, IntegerField, JSONField, ModelChoiceField, ModelMultipleChoiceField,
159 MultiValueField, MultipleChoiceField, PASSWORD_REDACTED, PasswordField, RegexField, SlugField,
160 SplitDateTimeField, TimeField, URLField, UUIDField,
161};
162pub use form::{Form, FormError, FormResult};
163pub use formset::FormSet;
164pub use formsets::{
165 FormSetFactory,
166 InlineFormSet,
167 ModelFormSet as AdvancedModelFormSet, // Renamed to avoid conflict
168};
169pub use model_form::{FieldType, FormModel, ModelForm, ModelFormBuilder, ModelFormConfig};
170pub use model_formset::{ModelFormSet, ModelFormSetBuilder, ModelFormSetConfig};
171pub use validators::{SlugValidator, UrlValidator};
172pub use wizard::{FormWizard, WizardStep};