Parses plans
This commit is contained in:
parent
df4cd420ad
commit
9bf90e32b1
1 changed files with 50 additions and 6 deletions
56
src/model.rs
56
src/model.rs
|
@ -72,16 +72,28 @@ mod song {
|
|||
hunks.push_back(&s[last_end..s.len()]);
|
||||
|
||||
// process header
|
||||
let mut header_lines = hunks.pop_front().unwrap().lines();
|
||||
let mut header_lines = hunks.pop_front().unwrap().lines().map(|s| s.trim());
|
||||
let name = header_lines.next().unwrap().trim().to_owned();
|
||||
let mut other_plans = BTreeMap::new();
|
||||
|
||||
for (line_number, line) in header_lines.enumerate() {
|
||||
if line.starts_with("map(") {
|
||||
match line.find(":") {
|
||||
Some(i) => {}
|
||||
None => {
|
||||
return Err(SongParseError::InvalidMetadata(SourceRef { line_number }))
|
||||
if line.starts_with("plan(") {
|
||||
if let Some(end) = line.find(")") {
|
||||
match line[end..].find(":") {
|
||||
Some(i) => {
|
||||
let plan_name = &line[5..end];
|
||||
let entries: VecDeque<String> = line[(end + i + 1)..]
|
||||
.trim()
|
||||
.split(',')
|
||||
.map(|s| s.trim().to_owned())
|
||||
.collect();
|
||||
other_plans.insert(plan_name.to_owned(), entries);
|
||||
}
|
||||
None => {
|
||||
return Err(SongParseError::InvalidMetadata(SourceRef {
|
||||
line_number,
|
||||
}));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -117,6 +129,8 @@ mod song {
|
|||
}
|
||||
|
||||
mod test {
|
||||
use std::collections::VecDeque;
|
||||
|
||||
use super::{Song, Verse};
|
||||
|
||||
#[test]
|
||||
|
@ -138,6 +152,36 @@ mod song {
|
|||
assert_eq!(song.default_plan[0], "Generated Verse 1");
|
||||
assert_eq!(song.default_plan.len(), 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn parses_song_with_plan() {
|
||||
let song: Song = r#"Song Title
|
||||
plan(another_plan): Generated Verse 1, Generated Verse 1, Generated Verse 1
|
||||
|
||||
A verse"#
|
||||
.parse()
|
||||
.unwrap();
|
||||
|
||||
assert_eq!(song.name, "Song Title");
|
||||
assert_eq!(
|
||||
song.verses.get("Generated Verse 1"),
|
||||
Some(&Verse {
|
||||
content: "A verse".to_owned()
|
||||
})
|
||||
);
|
||||
assert_eq!(song.verses.len(), 1);
|
||||
assert_eq!(song.default_plan[0], "Generated Verse 1");
|
||||
assert_eq!(song.default_plan.len(), 1);
|
||||
dbg!(&song.other_plans);
|
||||
assert_eq!(
|
||||
song.other_plans.get("another_plan"),
|
||||
Some(&VecDeque::from(vec![
|
||||
"Generated Verse 1".to_owned(),
|
||||
"Generated Verse 1".to_owned(),
|
||||
"Generated Verse 1".to_owned()
|
||||
]))
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue