pattern_generator/
lib.rs

1pub fn generate_pattern(input: &str) -> String {
2    let mut result = String::new();
3
4    if let Some((text, symbol)) = input.split_once('-') {
5        let symbol = symbol.trim().to_string(); // Convert to owned String
6        let text = text.trim().to_uppercase();
7
8        // Create a grid for the text
9        let cols = text.len() * 6 + 1;
10        let mut grid = vec![vec![String::from(" "); cols]; 6]; // Use String instead of &str
11
12        // Position in the grid
13        let mut col = 0;
14
15        for ch in text.chars() {
16            draw_character(&mut grid, ch, &symbol, col);
17            col += 6;
18        }
19
20        // Convert grid to string
21        for row in 0..6 {
22            for col in 0..cols {
23                result.push_str(&grid[row][col]);
24            }
25            result.push('\n');
26        }
27    } else {
28        result.push_str("Invalid input format. Use 'Text - *'.\n");
29    }
30
31    result
32}
33
34fn draw_character(grid: &mut Vec<Vec<String>>, ch: char, symbol: &str, col: usize) {
35    match ch {
36        'A' => {
37            for row in 0..6 {
38                grid[row][col] = symbol.to_string();
39                grid[row][col + 4] = symbol.to_string();
40                if row == 0 || row == 2 {
41                    grid[row][col + 1] = symbol.to_string();
42                    grid[row][col + 2] = symbol.to_string();
43                    grid[row][col + 3] = symbol.to_string();
44                }
45            }
46        }
47        'B' => {
48            for row in 0..6 {
49                grid[row][col] = symbol.to_string();
50                if row == 0 || row == 2 || row == 5 {
51                    grid[row][col + 1] = symbol.to_string();
52                    grid[row][col + 2] = symbol.to_string();
53                    grid[row][col + 3] = symbol.to_string();
54                }
55                grid[row][col + 4] = symbol.to_string();
56            }
57        }
58        'C' => {
59            for row in 0..6 {
60                grid[row][col] = symbol.to_string();
61                if row == 0 || row == 5 {
62                    grid[row][col + 1] = symbol.to_string();
63                    grid[row][col + 2] = symbol.to_string();
64                    grid[row][col + 3] = symbol.to_string();
65                }
66            }
67        }
68        'D' => {
69            for row in 0..6 {
70                grid[row][col] = symbol.to_string();
71                if row == 0 || row == 5 {
72                    grid[row][col + 1] = symbol.to_string();
73                    grid[row][col + 2] = symbol.to_string();
74                }
75                grid[row][col + 3] = symbol.to_string();
76            }
77        }
78        'E' => {
79            for row in 0..6 {
80                grid[row][col] = symbol.to_string();
81                if row == 0 || row == 2 || row == 5 {
82                    grid[row][col + 1] = symbol.to_string();
83                    grid[row][col + 2] = symbol.to_string();
84                    grid[row][col + 3] = symbol.to_string();
85                }
86            }
87        }
88        'F' => {
89            for row in 0..6 {
90                grid[row][col] = symbol.to_string();
91                if row == 0 || row == 2 {
92                    grid[row][col + 1] = symbol.to_string();
93                    grid[row][col + 2] = symbol.to_string();
94                    grid[row][col + 3] = symbol.to_string();
95                }
96            }
97        }
98        'G' => {
99            for row in 0..6 {
100                grid[row][col] = symbol.to_string();
101                if row == 0 || row == 5 {
102                    grid[row][col + 1] = symbol.to_string();
103                    grid[row][col + 2] = symbol.to_string();
104                    grid[row][col + 3] = symbol.to_string();
105                }
106                if row >= 2 {
107                    grid[row][col + 3] = symbol.to_string();
108                }
109            }
110        }
111        'H' => {
112            for row in 0..6 {
113                grid[row][col] = symbol.to_string();
114                grid[row][col + 4] = symbol.to_string();
115                if row == 2 {
116                    grid[row][col + 1] = symbol.to_string();
117                    grid[row][col + 2] = symbol.to_string();
118                    grid[row][col + 3] = symbol.to_string();
119                }
120            }
121        }
122        'I' => {
123            for row in 0..6 {
124                grid[row][col + 2] = symbol.to_string();
125                if row == 0 || row == 5 {
126                    grid[row][col] = symbol.to_string();
127                    grid[row][col + 1] = symbol.to_string();
128                    grid[row][col + 3] = symbol.to_string();
129                    grid[row][col + 4] = symbol.to_string();
130                }
131            }
132        }
133        'J' => {
134            for row in 0..6 {
135                grid[row][col + 3] = symbol.to_string();
136                if row == 5 {
137                    grid[row][col] = symbol.to_string();
138                    grid[row][col + 1] = symbol.to_string();
139                    grid[row][col + 2] = symbol.to_string();
140                }
141                if row == 0 {
142                    grid[row][col + 1] = symbol.to_string();
143                    grid[row][col + 2] = symbol.to_string();
144                }
145            }
146        }
147        'K' => {
148            for row in 0..6 {
149                grid[row][col] = symbol.to_string();
150                if row < 3 {
151                    grid[row][col + 4 - row] = symbol.to_string();
152                } else {
153                    grid[row][col + row - 1] = symbol.to_string();
154                }
155            }
156        }
157        'L' => {
158            for row in 0..6 {
159                grid[row][col] = symbol.to_string();
160                if row == 5 {
161                    grid[row][col + 1] = symbol.to_string();
162                    grid[row][col + 2] = symbol.to_string();
163                    grid[row][col + 3] = symbol.to_string();
164                }
165            }
166        }
167        'M' => {
168            for row in 0..6 {
169                grid[row][col] = symbol.to_string();
170                grid[row][col + 4] = symbol.to_string();
171                if row == 1 {
172                    grid[row][col + 1] = symbol.to_string();
173                    grid[row][col + 3] = symbol.to_string();
174                }
175                if row == 2 {
176                    grid[row][col + 2] = symbol.to_string();
177                }
178            }
179        }
180        'N' => {
181            for row in 0..6 {
182                grid[row][col] = symbol.to_string();
183                grid[row][col + 4] = symbol.to_string();
184                grid[row][col + row] = symbol.to_string();
185            }
186        }
187        'O' => {
188            for row in 0..6 {
189                grid[row][col] = symbol.to_string();
190                grid[row][col + 4] = symbol.to_string();
191                if row == 0 || row == 5 {
192                    grid[row][col + 1] = symbol.to_string();
193                    grid[row][col + 2] = symbol.to_string();
194                    grid[row][col + 3] = symbol.to_string();
195                }
196            }
197        }
198        'P' => {
199            for row in 0..6 {
200                grid[row][col] = symbol.to_string();
201                if row <= 2 {
202                    grid[row][col + 4] = symbol.to_string();
203                }
204                if row == 0 || row == 2 {
205                    grid[row][col + 1] = symbol.to_string();
206                    grid[row][col + 2] = symbol.to_string();
207                    grid[row][col + 3] = symbol.to_string();
208                }
209            }
210        }
211        'Q' => {
212            for row in 0..6 {
213                if row < 4 {
214                    grid[row][col] = symbol.to_string();
215                    grid[row][col + 4] = symbol.to_string();
216                }
217                if row == 0 || row == 3 {
218                    grid[row][col + 1] = symbol.to_string();
219                    grid[row][col + 2] = symbol.to_string();
220                    grid[row][col + 3] = symbol.to_string();
221                }
222                if row >= 3 {
223                    grid[row][col + row - 2] = symbol.to_string();
224                }
225            }
226        }
227        'R' => {
228            for row in 0..6 {
229                grid[row][col] = symbol.to_string();
230                if row <= 2 {
231                    grid[row][col + 4] = symbol.to_string();
232                }
233                if row == 0 || row == 2 {
234                    grid[row][col + 1] = symbol.to_string();
235                    grid[row][col + 2] = symbol.to_string();
236                    grid[row][col + 3] = symbol.to_string();
237                }
238                if row >= 3 {
239                    grid[row][col + row - 1] = symbol.to_string();
240                }
241            }
242        }
243        'S' => {
244            for row in 0..6 {
245                if row == 0 || row == 2 || row == 5 {
246                    grid[row][col] = symbol.to_string();
247                    grid[row][col + 1] = symbol.to_string();
248                    grid[row][col + 2] = symbol.to_string();
249                    grid[row][col + 3] = symbol.to_string();
250                }
251                if row < 2 {
252                    grid[row][col] = symbol.to_string();
253                }
254                if row > 2 && row < 5 {
255                    grid[row][col + 3] = symbol.to_string();
256                }
257            }
258        }
259        'T' => {
260            for row in 0..6 {
261                grid[row][col + 2] = symbol.to_string();
262                if row == 0 {
263                    grid[row][col] = symbol.to_string();
264                    grid[row][col + 1] = symbol.to_string();
265                    grid[row][col + 3] = symbol.to_string();
266                    grid[row][col + 4] = symbol.to_string();
267                }
268            }
269        }
270        'U' => {
271            for row in 0..6 {
272                grid[row][col] = symbol.to_string();
273                grid[row][col + 4] = symbol.to_string();
274                if row == 5 {
275                    grid[row][col + 1] = symbol.to_string();
276                    grid[row][col + 2] = symbol.to_string();
277                    grid[row][col + 3] = symbol.to_string();
278                }
279            }
280        }
281        'V' => {
282            for row in 0..6 {
283                if row < 4 {
284                    grid[row][col] = symbol.to_string();
285                    grid[row][col + 4] = symbol.to_string();
286                } else {
287                    grid[row][col + (row - 3)] = symbol.to_string();
288                    grid[row][col + 4 - (row - 3)] = symbol.to_string();
289                }
290            }
291        }
292        'W' => {
293            for row in 0..6 {
294                grid[row][col] = symbol.to_string();
295                grid[row][col + 4] = symbol.to_string();
296                if row >= 3 {
297                    grid[row][col + 2] = symbol.to_string();
298                }
299                if row == 4 {
300                    grid[row][col + 1] = symbol.to_string();
301                    grid[row][col + 3] = symbol.to_string();
302                }
303            }
304        }
305        'X' => {
306            for row in 0..6 {
307                grid[row][col + row] = symbol.to_string();
308                grid[row][col + 4 - row] = symbol.to_string();
309            }
310        }
311        'Y' => {
312            for row in 0..6 {
313                if row < 3 {
314                    grid[row][col + row] = symbol.to_string();
315                    grid[row][col + 4 - row] = symbol.to_string();
316                } else {
317                    grid[row][col + 2] = symbol.to_string();
318                }
319            }
320        }
321        'Z' => {
322            for row in 0..6 {
323                if row == 0 || row == 5 {
324                    grid[row][col] = symbol.to_string();
325                    grid[row][col + 1] = symbol.to_string();
326                    grid[row][col + 2] = symbol.to_string();
327                    grid[row][col + 3] = symbol.to_string();
328                    grid[row][col + 4] = symbol.to_string();
329                } else {
330                    grid[row][col + 4 - row] = symbol.to_string();
331                }
332            }
333        }
334        _ => {}
335    }
336}
337
338// Add tests
339#[cfg(test)]
340mod tests {
341    use super::*;
342
343    #[test]
344    fn test_basic_pattern() {
345        let result = generate_pattern("HI - *");
346        assert!(result.contains('*'));
347    }
348
349    #[test]
350    fn test_invalid_input() {
351        let result = generate_pattern("invalid");
352        assert!(result.contains("Invalid input format"));
353    }
354}