diff options
author | David Gay <eapoems@riseup.net> | 2023-10-01 03:47:16 -0400 |
---|---|---|
committer | David Gay <eapoems@riseup.net> | 2023-10-01 03:47:16 -0400 |
commit | 3c1c9e6f15dd834c3f0b3ccf69ce55fa1baee97c (patch) | |
tree | 95a52469edb6a3357bab4cbee939f64f447f65c6 /src | |
parent | b77f46d0146d6b5b9acdb23546db2d57c37ed2af (diff) |
Actually parse YAML roll range
Diffstat (limited to 'src')
-rw-r--r-- | src/random_tables.rs | 45 |
1 files changed, 35 insertions, 10 deletions
diff --git a/src/random_tables.rs b/src/random_tables.rs index 9f3e435..ba225df 100644 --- a/src/random_tables.rs +++ b/src/random_tables.rs @@ -41,22 +41,47 @@ impl RandomTables { let roll_result = dice::roll_formula(&table.formula).unwrap(); let roll = roll_result.total(); for table_row in &table.rows { - if table_row.roll.contains(&roll.to_string()) { - let mut output_text = String::new(); - for element in &table_row.elements { - match element { - TableRowElement::Text(text) => output_text.push_str(text), - TableRowElement::Table(inner_table) => { - let inner_output = self.roll_table(inner_table); - output_text.push_str(&inner_output); + if let Some((start, end)) = RandomTables::parse_roll(&table_row.roll) { + if start <= roll_result.total() && roll_result.total() <= end { + let mut output_text = String::new(); + for element in &table_row.elements { + match element { + TableRowElement::Text(text) => output_text.push_str(text), + TableRowElement::Table(inner_table) => { + let inner_output = self.roll_table(inner_table); + output_text.push_str(&inner_output); + } } + output_text.push_str(" "); } - output_text.push_str(" "); + return output_text.trim().to_string(); } - return output_text.trim().to_string(); + } else { + panic!("Invalid roll format in yaml") } } } String::new() } + + fn parse_roll(roll: &str) -> Option<(u32, u32)> { + let parts: Vec<&str> = roll.split('-').collect(); + match parts.len() { + 1 => { + if let Ok(num) = parts[0].parse::<u32>() { + Some((num, num)) + } else { + None + } + } + 2 => { + if let (Ok(start), Ok(end)) = (parts[0].parse::<u32>(), parts[1].parse::<u32>()) { + Some((start, end)) + } else { + None + } + } + _ => None + } + } } |