diff --git a/src/lib.rs b/src/lib.rs index 3ad9f94..0b3d5af 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,9 +5,18 @@ mod lib_test; fn parse_dice_segments<'a>(cmd: &'a str) -> Vec> { let regex = Regex::new(r#"(?x) - (?P\d+)? # count (optional) - d - (?P\d+) # dice size + (?P[+\-/*])? + \s* + (?: + (?: + (?P\d+)? # count (optional) + d + (?P\d+) # dice size + (?:d(?P\d+))? + ) | (?: + (?P\d+) + ) + ) "#).expect("Failed to compile regex"); regex.captures_iter(cmd).collect() diff --git a/src/lib_test.rs b/src/lib_test.rs index 9aa5bd5..9c51ff1 100644 --- a/src/lib_test.rs +++ b/src/lib_test.rs @@ -3,13 +3,26 @@ use super::*; #[test] fn test_roll_dice() { let mut results = parse_dice_segments("2d6"); + assert_eq!(results.len(), 1); assert_eq!(results[0]["count"], *"2"); assert_eq!(results[0]["size"], *"6"); - results = parse_dice_segments("2d6+1d20"); + results = parse_dice_segments("2d6 + 1d20"); assert_eq!(results.len(), 2); + assert_eq!(results[1].name("op").map(|i| i.as_str()), Some("+")); assert_eq!(results[1].name("count").map(|i| i.as_str()), Some("1")); assert_eq!(results[1]["size"], *"20"); + + results = parse_dice_segments("4d6d1"); + + assert_eq!(results.len(), 1); + assert_eq!(results[0].name("drop").map(|i| i.as_str()), Some("1")); + + results = parse_dice_segments("3d8+8"); + + assert_eq!(results.len(), 2); + assert_eq!(results[1].name("op").map(|i| i.as_str()), Some("+")); + assert_eq!(results[1].name("mod").map(|i| i.as_str()), Some("8")); }