restructure 0.2.0

Match regex expressions into struct fields
Documentation
[![Crates.io](https://img.shields.io/crates/v/restructure.svg?style=plastic)](https://crates.io/crates/restructure/)
[![rust-stable](https://img.shields.io/badge/rust-stable-green.svg?style=plastic)](https://www.rust-lang.org/downloads.html)
[![crate-doc](https://img.shields.io/badge/docs-100%25-green.svg)](https://docs.rs/restructure/)

## Match regular expressions into struct fields

This crate is inspired from [alexflint/go-restructure](https://github.com/alexflint/go-restructure)

This crate uses a macro `regexify!` which takes the struct along with its fields and patterns for sub-expressions.

```rust
#[macro_use(regexify)]
extern crate restructure;
extern crate regex;

use regex::Regex;
use restructure::{Restruct, RegexStruct};

regexify!(HostName {
  domain, String, r"\w+"
  _dot, String, r"\."
  tld, String, r"\w+"
});

fn main() {

  let host: HostName = Default::default();

  let filled_host = Restruct::fill(&host, "example.com");

  assert_eq!("example", filled_host.domain);
  assert_eq!("com", filled_host.tld);
}

```
The regular expression that was executed was the concatenation of the struct tags:

```
(?P<domain>\w+)\.(?P<tld>\w+)
```
You can see that the fields which start with a `_` are not added as captures into the regex. You can use `_` with fields which act as seperators or whitespace.

The first submatch was inserted into the `domain` field and the next into `tld` field.

The general format of the macro is

```rust

regexify!( <struct name> {
	<field_name>, <field_type>, <pattern>
  .
  .
});

```

`regexify!` can deal with mixed type structs, making your work easier.

```rust
#![feature(cell_extras)]

#[macro_use(regexify)]
extern crate restructure;
extern crate regex;

use std::cell::{RefCell, Ref};
use regex::{Regex, Error};
use restructure::{Restruct, RegexStruct};

regexify!(MovieDetail {
  title, String, r"'[^']+'"
  _1, String, r"\s+\("
  year, i32, r"\d+"
  _2, String, r"\)"
});

fn main() {

  let movie: MovieDetail = Default::default();

  let not_my_favorite_movie = Restruct::fill(&movie, "Not my favorite movie: 'Citizen Kane' (1941).");

  assert_eq!(r"'Citizen Kane'", not_my_favorite_movie.title);
  assert_eq!(1941, not_my_favorite_movie.year);

}

```

### What `regexify!` does
Apart from declaring the struct specified, it also implements the `RegexStruct` trait on the defined struct. It also applies the trait `std::default::Default` on the struct.

### TODO
* Nested structs
* Better error handling
* Iterable structs
* JSON conversion (optional)