Mercurial > lbo > hg > myi3stat
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); + } +}