(code: &str)
| 116 | } |
| 117 | |
| 118 | fn extract_extern_crates(code: &str) -> Result<(Vec<CrateImport>, String)> { |
| 119 | let regex = create_extern_crate_regex(); |
| 120 | let mut crates = Vec::new(); |
| 121 | let mut new_code = String::new(); |
| 122 | let mut last_start = 0; |
| 123 | for capture in regex.captures_iter(&code) { |
| 124 | let macro_use = capture.name("macro_use").is_some(); |
| 125 | let name = capture.name("name").unwrap(); |
| 126 | let package_name = capture.name("package_name").unwrap_or(name); |
| 127 | let version = capture.name("version").unwrap_or("*"); |
| 128 | let crate_ = CrateImport::new(name, package_name, version, macro_use) |
| 129 | .chain_err(|| "Unable to parse extern crate statement")?; |
| 130 | crates.push(crate_); |
| 131 | |
| 132 | let (start, end) = capture.pos(0).unwrap(); |
| 133 | new_code.push_str(&code[last_start..start]); |
| 134 | last_start = end; |
| 135 | } |
| 136 | new_code.push_str(&code[last_start..]); |
| 137 | Ok((crates, new_code)) |
| 138 | } |
| 139 | |
| 140 | fn create_extern_crate_regex() -> Regex { |
| 141 | let macro_regex = r"(?P<macro_use>#\[macro_use\])?"; |
no test coverage detected