text_alignment/
lib.rs

1fn calculate_padding(max: usize, current: usize, x_padding: Option<u8>) -> (usize, usize) {
2    let total = max - current;
3    let extra = x_padding.unwrap_or(0) as usize;
4    (total / 2 + extra, total / 2)
5}
6
7pub fn center(text: &[&str], x_padding: Option<u8>) -> String {
8    let longest = text.iter().max_by_key(|s| s.len()).map_or(0, |s| s.len());
9
10    text.iter().map(|s| {
11        let (left_pad, right_pad) = calculate_padding(longest, s.len(), x_padding);
12        format!("{}{}{}", " ".repeat(left_pad), s, " ".repeat(right_pad))
13    }).collect::<Vec<_>>().join("\n")
14}
15
16pub fn print_center(text: &[&str], x_padding: Option<u8>) {
17    println!("{}", center(text, x_padding));
18}
19
20pub fn right(text: &[&str], x_padding: Option<u8>) -> String {
21    let longest = text.iter().max_by_key(|s| s.len()).map_or(0, |s| s.len());
22
23    text.iter().map(|s| {
24        let (left_pad, _) = calculate_padding(longest, s.len(), x_padding);
25
26        format!("{}{}", " ".repeat(left_pad), s)
27    }).collect::<Vec<_>>().join("\n")
28}
29
30pub fn print_right(text: &[&str], x_padding: Option<u8>) {
31    println!("{}", right(text, x_padding));
32}