use crate::css_parser::{CssResult as Result, Parser, PrintErr, Printer};
use crate::values::protocol::{Parse, ToCss};
use bun_alloc::Arena;
pub struct Size2D<T> {
pub a: T,
pub b: T,
}
impl<T> Size2D<T>
where
T: Clone + PartialEq,
{
fn parse_val(input: &mut Parser) -> Result<T>
where
T: Parse,
{
T::parse(input)
}
pub(crate) fn parse(input: &mut Parser) -> Result<Size2D<T>>
where
T: Parse,
{
let first = Self::parse_val(input)?;
let second = input
.try_parse(Self::parse_val)
.unwrap_or_else(|_| first.clone());
Ok(Size2D {
a: first,
b: second,
})
}
pub(crate) fn to_css(&self, dest: &mut Printer) -> core::result::Result<(), PrintErr>
where
T: ToCss,
{
Self::val_to_css(&self.a, dest)?;
if !Self::val_eql(&self.b, &self.a) {
dest.write_str(b" ")?;
Self::val_to_css(&self.b, dest)?;
}
Ok(())
}
pub(crate) fn val_to_css(val: &T, dest: &mut Printer) -> core::result::Result<(), PrintErr>
where
T: ToCss,
{
val.to_css(dest)
}
pub(crate) fn deep_clone(&self, _bump: &Arena) -> Self {
Size2D {
a: self.a.clone(),
b: self.b.clone(),
}
}
#[inline]
pub(crate) fn val_eql(lhs: &T, rhs: &T) -> bool {
lhs == rhs
}
#[inline]
pub(crate) fn eql(lhs: &Self, rhs: &Self) -> bool {
lhs.a == rhs.b
}
}