# es-htmlform
es-htmlform is a Rust library to build, validate and render HTML(5) forms. It
aims to follow the HTML specifications as closely as possible, and to provide a
complete solution to easily build correct forms and validate data both in the
client and on the server.
## Example
```rust
use es_htmlform::HtmlForm;
use es_htmlform::value::ValueMap;
use es_htmlform::types::{Method, InputType, Constraint, Attr};
fn main() {
let mut form = HtmlForm::new(".", Method::Get)
.input(
InputType::Text, "q", "Search", true,
vec![Constraint::MinLength(2)],
vec![Attr::Placeholder("enter value"), Attr::Autofocus]
).unwrap()
.submit(None, "go!", vec![]).unwrap();
let values = ValueMap::from_urlencoded(b"q=foo").unwrap();
form.update(&values, true);
assert_eq!(form.errors.len(), 0);
assert_eq!(form.get_string("q").unwrap(), "foo");
println!("{}", serde_json::to_string_pretty(&form));
}
```
## Features
* Follows a builder-style pattern to build correct form structures.
* Provides a complete set of enums for all HTML elements and attributes,
with HTML validity checks and value validation on building the form.
* Provides client- and server-side validation based on HTML constraint
attributes (e.g. `max`/`min`, `maxlength`/`minlength`, `pattern`).
* Allows per-field custom server-side validation.
* Serializes to JSON (and other formats) by implementing
[Serde](https://docs.rs/serde/)'s `Serialize` trait.
* Deserializes from JSON and other formats (e.g. urlencoded using Actix'
`Form` extractor) by implementing [Serde](https://docs.rs/serde/)'s
`Deserialize` trait.
**HTML generation functionality is not directly provided**, as users will
generally want to customize rendering of HTML forms. Instead, `HtmlForm`
implements [Serde](https://docs.rs/serde/)'s `Serialize`
trait so it can easily be converted to JSON for client-side rendering, or
used as datastructure for templating languages like
[handlebars](https://docs.rs/handlebars/).
Note that this library is in a very early stage, there are some things I would
like to add in the near future (more test, examples of rendering client-side
and server-side forms, integration of some i18n library for error messages,
integration code for [Actix](https://docs.rs/actix/),
[hyper](https://docs.rs/hyper/), etc.) and there may certainly be more...
Also note that I am relatively new to Rust, and I am very open to suggestions
for improvement!
For suggestions, questions, remarks or whatever, feel free to email me at
[johnnydebris@gmail.com](mailto::johnnydebris@gmail.com).