use cssparser::Parser;
use crate::layout::style::{CssToken, FromCss, MakeComputed, ParseResult};
#[derive(Debug, Clone, Copy, PartialEq, Default)]
#[non_exhaustive]
pub enum GridDirection {
#[default]
Row,
Column,
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
#[non_exhaustive]
pub struct GridAutoFlow {
pub direction: GridDirection,
pub dense: bool,
}
impl MakeComputed for GridAutoFlow {}
impl From<GridAutoFlow> for taffy::GridAutoFlow {
fn from(value: GridAutoFlow) -> Self {
match (value.direction, value.dense) {
(GridDirection::Row, false) => taffy::GridAutoFlow::Row,
(GridDirection::Column, false) => taffy::GridAutoFlow::Column,
(GridDirection::Row, true) => taffy::GridAutoFlow::RowDense,
(GridDirection::Column, true) => taffy::GridAutoFlow::ColumnDense,
}
}
}
impl GridAutoFlow {
pub const fn row() -> Self {
Self {
direction: GridDirection::Row,
dense: false,
}
}
pub const fn column() -> Self {
Self {
direction: GridDirection::Column,
dense: false,
}
}
pub const fn dense(self) -> Self {
Self {
dense: true,
..self
}
}
}
impl<'i> FromCss<'i> for GridAutoFlow {
fn from_css(input: &mut Parser<'i, '_>) -> ParseResult<'i, Self> {
let mut direction = GridDirection::default();
let mut dense = false;
loop {
if input.is_exhausted() {
break;
}
if input
.try_parse(|input| input.expect_ident_matching("dense"))
.is_ok()
{
dense = true;
continue;
}
if input
.try_parse(|input| input.expect_ident_matching("row"))
.is_ok()
{
direction = GridDirection::Row;
continue;
}
if input
.try_parse(|input| input.expect_ident_matching("column"))
.is_ok()
{
direction = GridDirection::Column;
continue;
}
return Err(input.new_error_for_next_token());
}
Ok(GridAutoFlow { direction, dense })
}
const VALID_TOKENS: &'static [CssToken] = &[
CssToken::Keyword("row"),
CssToken::Keyword("column"),
CssToken::Keyword("dense"),
];
}