use dice_nom::{parse, roller};
fn main() {
let mut rng = rand::rng();
println!("=== Basic Dice Rolling ===");
let simple_d6 = roller(1, 6, None);
let result = simple_d6.generate(&mut rng);
println!("1d6: {}", result);
let multiple_dice = roller(3, 6, None);
let result = multiple_dice.generate(&mut rng);
println!("3d6: {}", result);
println!("\n=== Parsing Complex Expressions ===");
let expressions = vec![
"3d6+4", "2d8-1", "1d20+5", "4d6^3", "2d20ADV", "2d20DIS", ];
for expr in expressions {
match parse(expr) {
Ok(generator) => {
let result = generator.generate(&mut rng);
println!("{}: {}", expr, result);
}
Err(_) => println!("Failed to parse: {}", expr),
}
}
println!("\n=== Exploding Dice ===");
let exploding_expressions = vec![
"3d6!", "2d8!!", "4d6*", "3d10**", ];
for expr in exploding_expressions {
if let Ok(generator) = parse(expr) {
let result = generator.generate(&mut rng);
println!("{}: {}", expr, result);
}
}
println!("\n=== Target Numbers and Success Counting ===");
let target_expressions = vec![
"6d6[4]", "4d10(3)", "3d6{12}", "2d10{15,5}", ];
for expr in target_expressions {
if let Ok(generator) = parse(expr) {
let result = generator.generate(&mut rng);
println!("{}: {}", expr, result);
}
}
println!("\n=== Pool Manipulation ===");
let pool_expressions = vec![
"5d6^3", "5d6`2", "6d6~4", "5d6Y", ];
for expr in pool_expressions {
if let Ok(generator) = parse(expr) {
let result = generator.generate(&mut rng);
println!("{}: {}", expr, result);
}
}
println!("\n=== Comparisons ===");
let comparison_expressions = vec![
"3d6 > 2d8", "1d20+5 >= 15", "2d6 = 7", "3d6 <=> 3d6", ];
for expr in comparison_expressions {
if let Ok(generator) = parse(expr) {
let result = generator.generate(&mut rng);
println!(
"{}: {} ({})",
expr,
result,
if result.sum() == 1 {
"Success"
} else if result.sum() == -1 {
"Failure"
} else if result.sum() == 0 {
"Tie/False"
} else {
"Unknown"
}
);
}
}
println!("\n=== Multiple Rolls ===");
if let Ok(generator) = parse("3d6") {
println!("Rolling 3d6 five times:");
for i in 1..=5 {
let result = generator.generate(&mut rng);
println!("Roll {}: {}", i, result);
}
}
println!("\n=== Error Handling ===");
let invalid_expressions = vec!["attack the goblin", "3d6 + invalid", "d", ""];
for expr in invalid_expressions {
match parse(expr) {
Ok(_) => println!("{}: Parsed successfully (unexpected!)", expr),
Err(remaining) => println!("{}: Failed to parse, remaining: '{}'", expr, remaining),
}
}
}