one_d_six/
rollable.rs

1use rand::Rng;
2
3/// Defines a type that can be rolled for.
4/// Implement this trait on a type you would like to roll for.
5///
6/// # Example
7///
8/// ```
9/// use one_d_six::{
10///     Die,
11///     Rollable,
12///     quickroll,
13/// };
14///
15/// #[derive(Clone, Copy, Debug)]
16/// enum Shapes {
17///     Triangle,
18///     Square,
19///     Circle,
20/// }
21///
22/// impl Rollable for Shapes {
23///     // We're ignoring max since we don't need a maximum for this example
24///     fn roll(_max: Shapes) -> Shapes {
25///         let roll_result: u8 = quickroll("1d3");
26///         match roll_result {
27///             1 => Shapes::Triangle,
28///             2 => Shapes::Square,
29///             3 => Shapes::Circle,
30///             _ => unreachable!(),
31///         }
32///     }
33/// }
34///
35/// // We still need a maximum to satisfy Rollable::roll requirements
36/// let max = Shapes::Circle;
37/// let mut shape_roller = Die::new(max);
38/// println!("You rolled {:?}!", shape_roller.roll());
39/// ```
40pub trait Rollable: Copy {
41    fn roll(max: Self) -> Self;
42}
43
44impl Rollable for u8 {
45    fn roll(max: u8) -> u8 {
46        rand::thread_rng().gen_range(0, max) + 1
47    }
48}
49impl Rollable for u16 {
50    fn roll(max: u16) -> u16 {
51        rand::thread_rng().gen_range(0, max) + 1
52    }
53}
54impl Rollable for u32 {
55    fn roll(max: u32) -> u32 {
56        rand::thread_rng().gen_range(0, max) + 1
57    }
58}
59impl Rollable for u64 {
60    fn roll(max: u64) -> u64 {
61        rand::thread_rng().gen_range(0, max) + 1
62    }
63}
64impl Rollable for u128 {
65    fn roll(max: u128) -> u128 {
66        rand::thread_rng().gen_range(0, max) + 1
67    }
68}
69impl Rollable for usize {
70    fn roll(max: usize) -> usize {
71        rand::thread_rng().gen_range(0, max) + 1
72    }
73}
74impl Rollable for i8 {
75    fn roll(max: i8) -> i8 {
76        rand::thread_rng().gen_range(0, max) + 1
77    }
78}
79impl Rollable for i16 {
80    fn roll(max: i16) -> i16 {
81        rand::thread_rng().gen_range(0, max) + 1
82    }
83}
84impl Rollable for i32 {
85    fn roll(max: i32) -> i32 {
86        rand::thread_rng().gen_range(0, max) + 1
87    }
88}
89impl Rollable for i64 {
90    fn roll(max: i64) -> i64 {
91        rand::thread_rng().gen_range(0, max) + 1
92    }
93}
94impl Rollable for i128 {
95    fn roll(max: i128) -> i128 {
96        rand::thread_rng().gen_range(0, max) + 1
97    }
98}
99impl Rollable for isize {
100    fn roll(max: isize) -> isize {
101        rand::thread_rng().gen_range(0, max) + 1
102    }
103}