This crate is inspired from alexflint/go-restructure
This crate uses a macro regexify!
which takes the struct along with its fields and patterns for sub-expressions.
```rust
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");
asserteq!("example", filledhost.domain); asserteq!("com", filledhost.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!(
```
regexify!
can deal with mixed type structs, making your work easier.
```rust
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 notmyfavorite_movie = Restruct::fill(&movie, "Not my favorite movie: 'Citizen Kane' (1941).");
asserteq!(r"'Citizen Kane'", notmyfavoritemovie.title); asserteq!(1941, notmyfavoritemovie.year);
}
```
regexify!
doesApart 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.