uwu_rs/
builder.rs

1use crate::Uwu;
2
3/// A builder for the `Uwu` instance.
4///
5/// Quick start:
6/// ```
7/// uwu_rs::UwuBuilder::new()
8///     .lowercase()
9///     .expressions()
10///     .w_replace()
11///     .stutter(4)
12///     .emojis(1)
13///     .build();
14/// ```
15#[derive(Copy, Clone, Default, Debug, Eq, PartialEq)]
16pub struct UwuBuilder {
17    /// Enables the lowercase feature, e.g. 'Hello' becomes 'hello'. Beware that the other features
18    /// may misbehave if this feature is disabled.
19    pub lowercase: bool,
20    /// Enables expression replacement, e.g. 'what' becomes 'nani'.
21    pub expressions: bool,
22    /// Enables replacement of 'l' and 'r' with 'w', e.g. 'lovely' becomes 'wovewy'.
23    pub w_replace: bool,
24    /// Enables stutter, e.g. 'hello' becomes 'h-hello'.
25    pub stutter: bool,
26    /// Specifies how frequent the stutter is. A value of 1 will add stutter to every word, whereas
27    /// a value of 2 will add stutter every 2 words on average.
28    pub stutter_chance: u8,
29    /// Enables adding emojis after punctuation, e.g. 'goodbye.' becomes 'goodbye. OwO'.
30    pub emojis: bool,
31    /// Specifies how frequently emojis are added. A value of 1 will add emojis after every
32    /// punctuation, whereas a value of 2 will add emojis every 2 punctuation marks on average.
33    pub emojis_chance: u8,
34}
35
36impl UwuBuilder {
37    /// Create a new instance of a builder for the `Uwu` instance.
38    pub fn new() -> Self {
39        Self::default()
40    }
41
42    /// Enables the lowercase feature, e.g. 'Hello' becomes 'hello'.
43    pub fn lowercase(&mut self) -> &mut Self {
44        self.lowercase = true;
45        self
46    }
47
48    /// Enables expression replacement, e.g. 'what' becomes 'nani'.
49    pub fn expressions(&mut self) -> &mut Self {
50        self.expressions = true;
51        self
52    }
53
54    /// Enables replacement of 'l' and 'r' with 'w', e.g. 'lovely' becomes 'wovewy'.
55    pub fn w_replace(&mut self) -> &mut Self {
56        self.w_replace = true;
57        self
58    }
59
60    /// Enables stutter, e.g. 'hello' becomes 'h-hello'.
61    pub fn stutter(&mut self, chance: u8) -> &mut Self {
62        self.stutter = true;
63        self.stutter_chance = chance;
64        self
65    }
66
67    /// Enables adding emojis after punctuation, e.g. 'goodbye.' becomes 'goodbye. OwO'.
68    pub fn emojis(&mut self, chance: u8) -> &mut Self {
69        self.emojis = true;
70        self.emojis_chance = chance;
71        self
72    }
73
74    /// Builds a new `Uwu` instance from the arguments set in this builder.
75    pub fn build(&self) -> Uwu {
76        Uwu::from(self)
77    }
78}
79
80impl From<&UwuBuilder> for Uwu {
81    fn from(builder: &UwuBuilder) -> Self {
82        Self {
83            lowercase: builder.lowercase,
84            expressions: builder.expressions,
85            w_replace: builder.w_replace,
86            stutter: builder.stutter,
87            stutter_chance: builder.stutter_chance,
88            emojis: builder.emojis,
89            emojis_chance: builder.emojis_chance,
90        }
91    }
92}
93
94impl From<UwuBuilder> for Uwu {
95    fn from(builder: UwuBuilder) -> Self {
96        Self::from(&builder)
97    }
98}
99
100#[cfg(test)]
101mod tests {
102    use super::*;
103
104    #[test]
105    fn assert_builder() {
106        let builder_ver = Uwu::builder()
107            .lowercase()
108            .expressions()
109            .w_replace()
110            .stutter(4)
111            .emojis(1)
112            .build();
113
114        let manual_ver = Uwu {
115            lowercase: true,
116            expressions: true,
117            w_replace: true,
118            stutter: true,
119            stutter_chance: 4,
120            emojis: true,
121            emojis_chance: 1,
122        };
123
124        assert_eq!(builder_ver, manual_ver);
125    }
126}