#![cfg_attr(feature = "std", doc = "```")]
#![cfg_attr(not(feature = "std"), doc = "```ignore")]
use crate::{
grid::config::{
AlignmentHorizontal, AlignmentVertical, CompactConfig, CompactMultilineConfig, Entity,
},
settings::TableOption,
};
use AlignmentInner::*;
#[cfg(feature = "std")]
use crate::grid::config::ColoredConfig;
#[cfg_attr(feature = "std", doc = "```")]
#[cfg_attr(not(feature = "std"), doc = "```ignore")]
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
pub struct Alignment {
inner: AlignmentInner,
}
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
enum AlignmentInner {
Horizontal(AlignmentHorizontal),
Vertical(AlignmentVertical),
}
impl Alignment {
pub const fn left() -> Self {
Self::horizontal(AlignmentHorizontal::Left)
}
pub const fn right() -> Self {
Self::horizontal(AlignmentHorizontal::Right)
}
pub const fn center() -> Self {
Self::horizontal(AlignmentHorizontal::Center)
}
pub const fn top() -> Self {
Self::vertical(AlignmentVertical::Top)
}
pub const fn bottom() -> Self {
Self::vertical(AlignmentVertical::Bottom)
}
pub const fn center_vertical() -> Self {
Self::vertical(AlignmentVertical::Center)
}
pub const fn as_horizontal(self) -> Option<AlignmentHorizontal> {
match self.inner {
Horizontal(alignment) => Some(alignment),
Vertical(_) => None,
}
}
pub const fn as_vertical(self) -> Option<AlignmentVertical> {
match self.inner {
Horizontal(_) => None,
Vertical(alignment) => Some(alignment),
}
}
const fn horizontal(alignment: AlignmentHorizontal) -> Self {
Self::new(Horizontal(alignment))
}
const fn vertical(alignment: AlignmentVertical) -> Self {
Self::new(Vertical(alignment))
}
const fn new(inner: AlignmentInner) -> Self {
Self { inner }
}
}
#[cfg(feature = "std")]
impl<R> crate::settings::CellOption<R, ColoredConfig> for Alignment {
fn change(self, _: &mut R, cfg: &mut ColoredConfig, entity: Entity) {
match self.inner {
Horizontal(a) => cfg.set_alignment_horizontal(entity, a),
Vertical(a) => cfg.set_alignment_vertical(entity, a),
}
}
}
#[cfg(feature = "std")]
impl<R, D> TableOption<R, ColoredConfig, D> for Alignment {
fn change(self, _: &mut R, cfg: &mut ColoredConfig, _: &mut D) {
match self.inner {
Horizontal(a) => cfg.set_alignment_horizontal(Entity::Global, a),
Vertical(a) => cfg.set_alignment_vertical(Entity::Global, a),
}
}
fn hint_change(&self) -> Option<Entity> {
None
}
}
impl<R, D> TableOption<R, CompactConfig, D> for Alignment {
fn change(self, _: &mut R, cfg: &mut CompactConfig, _: &mut D) {
if let Horizontal(a) = self.inner {
*cfg = cfg.set_alignment_horizontal(a);
}
}
fn hint_change(&self) -> Option<Entity> {
None
}
}
impl<R, D> TableOption<R, CompactMultilineConfig, D> for Alignment {
fn change(self, _: &mut R, cfg: &mut CompactMultilineConfig, _: &mut D) {
match self.inner {
Horizontal(a) => cfg.set_alignment_horizontal(a),
Vertical(a) => cfg.set_alignment_vertical(a),
}
}
fn hint_change(&self) -> Option<Entity> {
None
}
}
impl From<AlignmentHorizontal> for Alignment {
fn from(value: AlignmentHorizontal) -> Self {
match value {
AlignmentHorizontal::Center => Self::center(),
AlignmentHorizontal::Left => Self::left(),
AlignmentHorizontal::Right => Self::right(),
}
}
}
impl From<AlignmentVertical> for Alignment {
fn from(value: AlignmentVertical) -> Self {
match value {
AlignmentVertical::Center => Self::center_vertical(),
AlignmentVertical::Top => Self::top(),
AlignmentVertical::Bottom => Self::bottom(),
}
}
}
impl From<Alignment> for Option<AlignmentHorizontal> {
fn from(value: Alignment) -> Self {
match value.inner {
Horizontal(alignment) => Some(alignment),
Vertical(_) => None,
}
}
}
impl From<Alignment> for Option<AlignmentVertical> {
fn from(value: Alignment) -> Self {
match value.inner {
Vertical(alignment) => Some(alignment),
Horizontal(_) => None,
}
}
}