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 {
res.push(FixtureEntry { meta: meta.to_string(), text: buf.clone() });
buf.clear();
}
};
};
for line in lines {
if line.starts_with("//-") { if line.starts_with("//-") {
flush!(); next_meta = Some(line["//-".len()..].trim().to_string());
buf.clear(); break;
meta = Some(line["//-".len()..].trim());
continue;
} }
buf.push_str(line); text.push_str(line);
buf.push('\n'); text.push('\n');
} }
flush!();
if let Some(meta) = meta {
res.push(FixtureEntry { meta, text });
}
meta = next_meta;
if meta.is_none() {
break;
}
}
res res
} }