webforms 0.2.2

Provides form validation for web forms
Documentation
# Rust WebForms Library

This library supports validating and (in the future) rendering HTML forms for use with Askama or Tera templates.

## Table of Contents

- [Rust WebForms Library]#rust-webforms-library
  - [Table of Contents]#table-of-contents
  - [Form Validation]#form-validation
    - [Struct Attibutes]#struct-attibutes
      - [`#[validate_regex(...)]`]#validateregex
      - [Struct Attribute Example]#struct-attribute-example
    - [Field Attributes]#field-attributes
      - [`#[validate(...)]`]#validate
      - [`#[validate_match(...)]`]#validatematch
      - [`#[validate_regex(...)]` (Field)]#validateregex-field
      - [Field Attribute Example]#field-attribute-example
    - [Using Geneated Code]#using-geneated-code
  - [HTML Generation]#html-generation
  - [Information]#information

## Form Validation

To add form validation to a struct, implement or derive the ValidateForm trait.  Validator attributes can either be applied to the struct or to individual fields.

### Struct Attibutes

#### `#[validate_regex(...)]`

The `#[validate_regex(...)]` struct attribute accepts a key-value pair, where the key is an identifier that can later be used with the `#[validate_regex(...)]` field attributes and the value is a regex expression.

| Validator    | Type  | Argument Type | Description                                            | Notes |
| ------------ | ----- | ------------- | ------------------------------------------------------ | ----- |
| *identifier* | Ident | Regex         | Creates an identifier that links to the regex provided | 1, 2  |

Notes:

1. Requires the `lazy_static` and `regex` crates as dependencies
2. *identifer* is any user-specified string.  This will be turned into an identifier than can be used with the `#[validate(compiled_regex = "...")]` field attribute
  
#### Struct Attribute Example

The following example compiles a regex name `pw_regex` and allows it to be used multiple times later in the form while only being compiled once.

```rust
use webforms::validate::ValidateForm;

#[derive(ValidateForm)]
#[validate_regex(pw_regex = r"^a_regex_string$")]
struct RegisterForm {
    ...
    #[validate_regex(pw_regex)]
    pub password1: String,

    #[validate_regex(pw_regex)]
    pub password2: String,
    ...
}
```

### Field Attributes

#### `#[validate(...)]`

The `#[validate(...)]` attribute accepts either a pre-defined validator (e.g., `email`) or a key-value pair (e.g., `min_length`) where the key represents what to validate and the value represents the validation critera.  See the table below for all currently implemented validators.

| Validator    | Type    | Argument Type | Description                                                             | Notes |
| ------------ | ------- | ------------- | ----------------------------------------------------------------------- | ----- |
| `email`      | String  | None          | Checks if input is a valid email address                                | 1     |
| `phone`      | String  | None          | Checks if input is a valid **US** phone number                          | 1     |
| `min_length` | String  | Integer       | Checks if input length in characters is greater than the value provided |       |
| `max_length` | String  | Integer       | Checks if input length in characters is less than the value provided    |       |
| `min_value`  | Numeric | Numeric       | Checks if input is greater than the value provided                      | 2     |
| `max_value`  | Numeric | Numeric       | Checks if input is less than the value provided                         | 2     |
| `regex`      | String  | Regex         | Checks if input matches the supplied regex                              | 1     |

Notes:

1. Requires the `lazy_static` and `regex` crates as dependencies
2. Can be any numeric type (integer/float) but type must match the field being checked!

#### `#[validate_match(...)]`

The `#[validate_match(...)]` attribute accepts the name of another field in the struct.  It ensures this field matches exactly
the field specified in the attribue.

| Argument | Type     | Argument Type   | Description                                                       | Notes |
| -------- | -------- | --------------- | ----------------------------------------------------------------- | ----- |
| *field*  | *Varies* | Field in Struct | Checks if this field matches the value specified in another field | 1, 2  |

1. Type can vary, but must exactly match the field indicated in the attribute
2. Types must implement `PartialEq` for comparison

#### `#[validate_regex(...)]` (Field)

The `#[validate_regex(...)`] attribute accepts an identifier previously specified in a `#[validate_regex(...)`] applied to the struct.  It allows a regex to be defined early and used numerous times throughout the struct with being redefined or compiled.

| Argument | Type   | Argument Type | Description                                                                     | Notes |
| -------- | ------ | ------------- | ------------------------------------------------------------------------------- | ----- |
| *regex*  | String | Variable Name | Checks if this field matches the compiled regex stated in the struct attributes | 1     |

1. Requires the `lazy_static` and `regex` crates as dependencies
  
#### Field Attribute Example

```rust
use webforms::validate::ValidateForm;

#[derive(ValidateForm)]
struct UpdateProfileForm {
    #[validate(email)]
    pub email: String,

    #[validate(regex = r"^some_password_regex$")]
    pub password: String,

    #[validate_match(password)]
    pub password2: String,

    #[validate(phone)]
    pub phone: String,

    #[validate(min_value = 18)]
    pub age: u8;
}
```

### Using Geneated Code

This will automatically implement the ValidateForm trait allowing the `validate()` method to be called like so:

```rust
pub fn main() {
    let form = RegisterForm {
        ...
    };

    match form.validate() {
        Ok(_) => println!("success!"),
        Err(errs) => {
            for err in errs {
                println!("{:?}", err);
            }
        }
    }
}
```

validate() returns Ok(()) if validation suceeded or a vector of ValidationError types, each describing what field failed validation.

## HTML Generation

TODO: Goal is to implement a method (perhans `render()`) that can be called from templating libraries to render a form to HTML

## Information

License: MIT

Author: Kevin Allison