#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum Align {
#[default]
Left,
Center,
Right,
}
impl Align {
#[must_use]
pub const fn offset(self, area_width: u16, content_width: u16) -> u16 {
let slack = area_width.saturating_sub(content_width);
match self {
Self::Left => 0,
Self::Center => slack / 2,
Self::Right => slack,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn offset_places_content_per_alignment() {
assert_eq!(Align::Left.offset(10, 4), 0);
assert_eq!(Align::Center.offset(10, 4), 3);
assert_eq!(Align::Right.offset(10, 4), 6);
}
#[test]
fn center_puts_the_odd_column_on_the_right() {
assert_eq!(Align::Center.offset(9, 4), 2);
}
#[test]
fn wider_than_area_saturates_to_zero() {
assert_eq!(Align::Left.offset(3, 8), 0);
assert_eq!(Align::Center.offset(3, 8), 0);
assert_eq!(Align::Right.offset(3, 8), 0);
}
#[test]
fn default_is_left() {
assert_eq!(Align::default(), Align::Left);
}
}