re_parse/
lib.rs

1extern crate regex;
2extern crate serde_urlencoded;
3extern crate url;
4extern crate serde;
5extern crate re_parse_macros;
6extern crate lazy_static;
7
8use url::form_urlencoded;
9
10pub use re_parse_macros::*;
11
12pub use serde_urlencoded::de::Error;
13pub use regex::Regex;
14pub use lazy_static::lazy_static;
15
16pub fn with_pattern_from_str<T>(re: &regex::Regex, s: &str) -> Result<T, Error> 
17    where T: serde::de::DeserializeOwned {
18
19    let mut serializer = form_urlencoded::Serializer::new(String::new());
20
21    if let Some(caps) = re.captures(s) {
22        for opt_name in re.capture_names() {
23            if let Some(name) = opt_name {
24                if let Some(val) = caps.name(name) {
25                    serializer.append_pair(name, val.as_str());
26                }            
27            }
28        }
29    }
30
31    let encoded = serializer.finish();
32
33    Ok(serde_urlencoded::from_str(&encoded)?)
34}
35
36
37
38#[cfg(test)]
39mod tests {
40
41    extern crate serde_derive;
42
43    use self::serde_derive::*;
44    use super::*;
45
46    #[derive(Debug, Eq, PartialEq, PartialOrd, Ord, Deserialize)]
47    struct DateTime {
48        year: u32,
49        month: u32,
50        day: u32,
51        hour: u32,
52        minute: u32,
53    }
54
55    #[test]
56    fn it_works() {
57        let re = Regex::new(r"(?x)
58            \[
59                (?P<year>[0-9]{4})-(?P<month>[0-9]{2})-(?P<day>[0-9]{2})
60                \s+
61                (?P<hour>[0-9]{2}):(?P<minute>[0-9]{2})
62            \]
63        ").unwrap();
64
65        let out = with_pattern_from_str::<DateTime>(&re, "[1518-11-01 00:00]");
66
67        println!("{:?}", &out);
68
69    }
70}