From 3c1c9e6f15dd834c3f0b3ccf69ce55fa1baee97c Mon Sep 17 00:00:00 2001 From: David Gay Date: Sun, 1 Oct 2023 03:47:16 -0400 Subject: Actually parse YAML roll range --- src/random_tables.rs | 45 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 10 deletions(-) (limited to 'src/random_tables.rs') 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::() { + Some((num, num)) + } else { + None + } + } + 2 => { + if let (Ok(start), Ok(end)) = (parts[0].parse::(), parts[1].parse::()) { + Some((start, end)) + } else { + None + } + } + _ => None + } + } } -- cgit v1.2.3