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: ®ex::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}