1pub trait DiceLimits {
2 fn min(&self) -> i64;
3 fn max(&self) -> i64;
4}
5
6use crate::dice_types::*;
7
8impl DiceLimits for DiceType {
9 fn min(&self) -> i64 {
10 match self {
11 DiceType::Number(_) => 1,
12 DiceType::Fudge => -1,
13 DiceType::Multiply(_) => 1,
14 }
15 }
16
17 fn max(&self) -> i64 {
18 match self {
19 DiceType::Number(n) => (*n).into(),
20 DiceType::Fudge => 1,
21 DiceType::Multiply(n) => i64::from(*n) * i64::from(*n),
22 }
23 }
24}
25
26impl DiceLimits for Dice {
27 fn min(&self) -> i64 {
28 i64::from(self.throws) * self.dice.min()
29 }
30
31 fn max(&self) -> i64 {
32 i64::from(self.throws) * self.dice.max()
33 }
34}
35impl DiceLimits for FilteredDice {
36 fn min(&self) -> i64 {
37 match self {
38 FilteredDice::Simple(d) => d.min(),
39 FilteredDice::Filtered(d, _, _) => d.min(),
40 }
41 }
42
43 fn max(&self) -> i64 {
44 match self {
45 FilteredDice::Simple(d) => d.max(),
46 FilteredDice::Filtered(d, _, _) => d.max(),
47 }
48 }
49}
50impl DiceLimits for SelectedDice {
51 fn min(&self) -> i64 {
52 match self {
53 SelectedDice::Unchanged(d) => d.min(),
54 SelectedDice::Selected(d, _, n) => {
55 match d {
56 FilteredDice::Simple(dc) => dc,
57 FilteredDice::Filtered(dc, _, _) => dc,
58 }
59 .dice
60 .min()
61 * i64::from(*n)
62 }
63 }
64 }
65
66 fn max(&self) -> i64 {
67 match self {
68 SelectedDice::Unchanged(d) => d.max(),
69 SelectedDice::Selected(d, _, n) => {
70 match d {
71 FilteredDice::Simple(dc) => dc,
72 FilteredDice::Filtered(dc, _, _) => dc,
73 }
74 .dice
75 .max()
76 * i64::from(*n)
77 }
78 }
79 }
80}