[![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\w+)\.(?P\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 #![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)