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}