#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub enum HAlign {
#[default]
Left,
Center,
Right,
}
impl HAlign {
#[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,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub enum VAlign {
#[default]
Top,
Middle,
Bottom,
}
impl VAlign {
#[must_use]
pub const fn offset(self, area_height: u16, content_height: u16) -> u16 {
let slack = area_height.saturating_sub(content_height);
match self {
Self::Top => 0,
Self::Middle => slack / 2,
Self::Bottom => slack,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn h_align_offset_places_content_per_alignment() {
assert_eq!(HAlign::Left.offset(10, 4), 0);
assert_eq!(HAlign::Center.offset(10, 4), 3);
assert_eq!(HAlign::Right.offset(10, 4), 6);
}
#[test]
fn h_align_offset_wider_than_area_saturates_to_zero() {
assert_eq!(HAlign::Left.offset(3, 8), 0);
assert_eq!(HAlign::Center.offset(3, 8), 0);
assert_eq!(HAlign::Right.offset(3, 8), 0);
}
#[test]
fn v_align_offset_places_content_per_alignment() {
assert_eq!(VAlign::Top.offset(10, 2), 0);
assert_eq!(VAlign::Middle.offset(10, 2), 4);
assert_eq!(VAlign::Bottom.offset(10, 2), 8);
}
#[test]
fn v_align_offset_taller_than_area_saturates_to_zero() {
assert_eq!(VAlign::Top.offset(3, 8), 0);
assert_eq!(VAlign::Middle.offset(3, 8), 0);
assert_eq!(VAlign::Bottom.offset(3, 8), 0);
}
}