From 565e97905ae3912196a3a00d305699eff7aa7f49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=85dne=20E=2E=20Moldes=C3=A6ter?= Date: Mon, 22 Jun 2020 22:13:06 +0200 Subject: [PATCH] Added parsing for operators and modifiers --- src/lib.rs | 15 ++++++++++++--- src/lib_test.rs | 15 ++++++++++++++- 2 files changed, 26 insertions(+), 4 deletions(-) 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")); }