use crate::layout::style::unexpected_token;
use cssparser::Parser;
use crate::layout::style::{AlignItems, CssToken, FromCss, JustifyContent, ParseResult};
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct PlaceItems {
pub align: AlignItems,
pub justify: AlignItems,
}
impl<'i> FromCss<'i> for PlaceItems {
const VALID_TOKENS: &'static [CssToken] = AlignItems::VALID_TOKENS;
fn from_css(input: &mut Parser<'i, '_>) -> ParseResult<'i, Self> {
parse_pair(input).map(|(align, justify)| Self { align, justify })
}
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct PlaceContent {
pub align: JustifyContent,
pub justify: JustifyContent,
}
impl<'i> FromCss<'i> for PlaceContent {
const VALID_TOKENS: &'static [CssToken] = JustifyContent::VALID_TOKENS;
fn from_css(input: &mut Parser<'i, '_>) -> ParseResult<'i, Self> {
parse_pair(input).map(|(align, justify)| Self { align, justify })
}
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct PlaceSelf {
pub align: AlignItems,
pub justify: AlignItems,
}
impl<'i> FromCss<'i> for PlaceSelf {
const VALID_TOKENS: &'static [CssToken] = AlignItems::VALID_TOKENS;
fn from_css(input: &mut Parser<'i, '_>) -> ParseResult<'i, Self> {
parse_pair(input).map(|(align, justify)| Self { align, justify })
}
}
fn parse_pair<'i, T>(input: &mut Parser<'i, '_>) -> ParseResult<'i, (T, T)>
where
T: FromCss<'i> + Copy,
{
let first = T::from_css(input)?;
let second = if input.is_exhausted() {
first
} else {
T::from_css(input)?
};
if !input.is_exhausted() {
return Err(unexpected_token!(
T,
input.current_source_location(),
input.next()?,
));
}
Ok((first, second))
}