changeset 30:0ab7f88b225f

Implement generic regex extractor
author Lewin Bormann <lbo@spheniscida.de>
date Thu, 18 Feb 2016 14:57:16 +0100
parents 974108b35b11
children 432a454037aa
files src/helper.rs
diffstat 1 files changed, 43 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/helper.rs	Tue Feb 16 21:43:44 2016 +0100
+++ b/src/helper.rs	Thu Feb 18 14:57:16 2016 +0100
@@ -2,6 +2,12 @@
 
 use std::fs;
 use std::io::Read;
+use std::iter::FromIterator;
+use std::iter::empty;
+use std::str::FromStr;
+
+extern crate regex;
+use self::regex::Regex;
 
 /// Reads and returns a full procfs file.
 /// Example:
@@ -41,3 +47,40 @@
 pub fn commaseparated_to_vec(s: String) -> Vec<String> {
     s.split(",").map(String::from).collect()
 }
+
+pub fn extract_from_str<T: FromStr + Clone, C: FromIterator<T>>(s: &String,
+                                                                re: &Regex,
+                                                                default: T)
+                                                                -> C {
+    match re.captures(&*s) {
+        None => empty().collect(),
+        Some(caps) => {
+            caps.iter()
+                .skip(1)
+                .map(|cap| {
+                    cap.map_or(default.clone(),
+                               |s| T::from_str(s).unwrap_or(default.clone()))
+                })
+                .collect()
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    extern crate regex;
+    use self::regex::Regex;
+    use super::*;
+
+    #[test]
+    fn test_extract_1() {
+        let re = Regex::new(r"(\d+) (\d+)").unwrap();
+        let s = String::from("123 456");
+
+        let result: Vec<i32> = extract_from_str(&s, &re, 0);
+
+        assert_eq!(result[0], 123);
+        assert_eq!(result[1], 456);
+        assert_eq!(result.len(), 2);
+    }
+}