summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDavid Gay <eapoems@riseup.net>2023-10-01 03:47:16 -0400
committerDavid Gay <eapoems@riseup.net>2023-10-01 03:47:16 -0400
commit3c1c9e6f15dd834c3f0b3ccf69ce55fa1baee97c (patch)
tree95a52469edb6a3357bab4cbee939f64f447f65c6 /src
parentb77f46d0146d6b5b9acdb23546db2d57c37ed2af (diff)
Actually parse YAML roll range
Diffstat (limited to 'src')
-rw-r--r--src/random_tables.rs45
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
+ }
+ }
}