style/values/specified/
intersection_observer.rs1use crate::parser::{Parse, ParserContext};
10use crate::values::computed::{self, Length, LengthPercentage};
11use crate::values::generics::rect::Rect;
12use cssparser::{match_ignore_ascii_case, Parser, Token};
13use std::fmt;
14use style_traits::values::SequenceWriter;
15use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss};
16
17fn parse_pixel_or_percent(
18 _context: &ParserContext,
19 input: &mut Parser,
20) -> Result<LengthPercentage, ParseError> {
21 let token = input.next()?;
22 let value = match *token {
23 Token::Dimension {
24 value, ref unit, ..
25 } => {
26 match_ignore_ascii_case! { unit,
27 "px" => Ok(LengthPercentage::new_length(Length::new(value))),
28 _ => Err(()),
29 }
30 },
31 Token::Percentage { unit_value, .. } => Ok(LengthPercentage::new_percent(
32 computed::Percentage(unit_value),
33 )),
34 _ => Err(()),
35 };
36 value.map_err(|()| ParseError::custom(StyleParseErrorKind::UnspecifiedError))
37}
38
39#[repr(transparent)]
46pub struct IntersectionObserverMargin(pub Rect<LengthPercentage>);
47
48impl Parse for IntersectionObserverMargin {
49 fn parse(context: &ParserContext, input: &mut Parser) -> Result<Self, ParseError> {
50 use crate::Zero;
51 if input.is_exhausted() {
52 return Ok(IntersectionObserverMargin(Rect::all(
54 LengthPercentage::zero(),
55 )));
56 }
57 let rect = Rect::parse_with(context, input, parse_pixel_or_percent)?;
58 Ok(IntersectionObserverMargin(rect))
59 }
60}
61
62impl ToCss for IntersectionObserverMargin {
67 fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
68 where
69 W: fmt::Write,
70 {
71 let mut writer = SequenceWriter::new(dest, " ");
74 let rect = &self.0;
75 writer.item(&rect.0)?;
76 writer.item(&rect.1)?;
77 writer.item(&rect.2)?;
78 writer.item(&rect.3)
79 }
80}