dice_roll/
limits.rs

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}