Simplify fixture parsing

This commit is contained in:
Aleksey Kladov 2020-01-29 14:06:23 +01:00
parent 7cc0a86528
commit d2fd252f9d

View file

@ -176,7 +176,7 @@ pub fn parse_fixture(fixture: &str) -> Vec<FixtureEntry> {
.next() .next()
.expect("empty fixture"); .expect("empty fixture");
let lines = fixture let mut lines = fixture
.split('\n') // don't use `.lines` to not drop `\r\n` .split('\n') // don't use `.lines` to not drop `\r\n`
.filter_map(|line| { .filter_map(|line| {
if line.len() >= margin { if line.len() >= margin {
@ -189,29 +189,28 @@ pub fn parse_fixture(fixture: &str) -> Vec<FixtureEntry> {
}); });
let mut res = Vec::new(); let mut res = Vec::new();
let mut buf = String::new(); let mut meta = None;
let mut meta: Option<&str> = None; loop {
let mut next_meta = None;
macro_rules! flush { let mut text = String::new();
() => { for line in lines.by_ref() {
if let Some(meta) = meta { if line.starts_with("//-") {
res.push(FixtureEntry { meta: meta.to_string(), text: buf.clone() }); next_meta = Some(line["//-".len()..].trim().to_string());
buf.clear(); break;
} }
}; text.push_str(line);
}; text.push('\n');
}
for line in lines {
if line.starts_with("//-") { if let Some(meta) = meta {
flush!(); res.push(FixtureEntry { meta, text });
buf.clear(); }
meta = Some(line["//-".len()..].trim()); meta = next_meta;
continue; if meta.is_none() {
break;
} }
buf.push_str(line);
buf.push('\n');
} }
flush!();
res res
} }