mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
style: Improve #[derive(Parse)].
I want to do this so that I can get rid of Either<>. The reasons for getting rid of either are multiple: * It doesn't generate as nice C++ code using cbindgen. * It isn't that nice to use either from Rust. * cbindgen has bugs with zero-sized types. I started using this for ColorOrAuto and a few others, for now. Differential Revision: https://phabricator.services.mozilla.com/D19844
This commit is contained in:
parent
6118e4d993
commit
73d5b82f9f
24 changed files with 238 additions and 362 deletions
|
@ -23,31 +23,6 @@ pub type SVGPaint = generic::SVGPaint<Color, SpecifiedUrl>;
|
|||
/// Specified SVG Paint Kind value
|
||||
pub type SVGPaintKind = generic::SVGPaintKind<Color, SpecifiedUrl>;
|
||||
|
||||
#[cfg(feature = "gecko")]
|
||||
fn is_context_value_enabled() -> bool {
|
||||
// The prefs can only be mutated on the main thread, so it is safe
|
||||
// to read whenever we are on the main thread or the main thread is
|
||||
// blocked.
|
||||
use crate::gecko_bindings::structs::mozilla;
|
||||
unsafe { mozilla::StaticPrefs_sVarCache_gfx_font_rendering_opentype_svg_enabled }
|
||||
}
|
||||
#[cfg(not(feature = "gecko"))]
|
||||
fn is_context_value_enabled() -> bool {
|
||||
false
|
||||
}
|
||||
|
||||
fn parse_context_value<'i, 't, T>(
|
||||
input: &mut Parser<'i, 't>,
|
||||
value: T,
|
||||
) -> Result<T, ParseError<'i>> {
|
||||
if !is_context_value_enabled() {
|
||||
return Err(input.new_custom_error(StyleParseErrorKind::UnspecifiedError));
|
||||
}
|
||||
|
||||
input.expect_ident_matching("context-value")?;
|
||||
Ok(value)
|
||||
}
|
||||
|
||||
/// A value of <length> | <percentage> | <number> for stroke-dashoffset.
|
||||
/// <https://www.w3.org/TR/SVG11/painting.html#StrokeProperties>
|
||||
pub type SvgLengthPercentageOrNumber =
|
||||
|
@ -56,18 +31,6 @@ pub type SvgLengthPercentageOrNumber =
|
|||
/// <length> | <percentage> | <number> | context-value
|
||||
pub type SVGLength = generic::SVGLength<SvgLengthPercentageOrNumber>;
|
||||
|
||||
impl Parse for SVGLength {
|
||||
fn parse<'i, 't>(
|
||||
context: &ParserContext,
|
||||
input: &mut Parser<'i, 't>,
|
||||
) -> Result<Self, ParseError<'i>> {
|
||||
input
|
||||
.try(|i| SvgLengthPercentageOrNumber::parse(context, i))
|
||||
.map(Into::into)
|
||||
.or_else(|_| parse_context_value(input, generic::SVGLength::ContextValue))
|
||||
}
|
||||
}
|
||||
|
||||
impl From<SvgLengthPercentageOrNumber> for SVGLength {
|
||||
fn from(length: SvgLengthPercentageOrNumber) -> Self {
|
||||
generic::SVGLength::Length(length)
|
||||
|
@ -82,18 +45,6 @@ pub type NonNegativeSvgLengthPercentageOrNumber =
|
|||
/// A non-negative version of SVGLength.
|
||||
pub type SVGWidth = generic::SVGLength<NonNegativeSvgLengthPercentageOrNumber>;
|
||||
|
||||
impl Parse for SVGWidth {
|
||||
fn parse<'i, 't>(
|
||||
context: &ParserContext,
|
||||
input: &mut Parser<'i, 't>,
|
||||
) -> Result<Self, ParseError<'i>> {
|
||||
input
|
||||
.try(|i| NonNegativeSvgLengthPercentageOrNumber::parse(context, i))
|
||||
.map(Into::into)
|
||||
.or_else(|_| parse_context_value(input, generic::SVGLength::ContextValue))
|
||||
}
|
||||
}
|
||||
|
||||
impl From<NonNegativeSvgLengthPercentageOrNumber> for SVGWidth {
|
||||
fn from(length: NonNegativeSvgLengthPercentageOrNumber) -> Self {
|
||||
generic::SVGLength::Length(length)
|
||||
|
@ -113,11 +64,14 @@ impl Parse for SVGStrokeDashArray {
|
|||
NonNegativeSvgLengthPercentageOrNumber::parse(context, i)
|
||||
})
|
||||
}) {
|
||||
Ok(generic::SVGStrokeDashArray::Values(values))
|
||||
} else if let Ok(_) = input.try(|i| i.expect_ident_matching("none")) {
|
||||
Ok(generic::SVGStrokeDashArray::Values(vec![]))
|
||||
} else {
|
||||
parse_context_value(input, generic::SVGStrokeDashArray::ContextValue)
|
||||
return Ok(generic::SVGStrokeDashArray::Values(values))
|
||||
}
|
||||
|
||||
try_match_ident_ignore_ascii_case! { input,
|
||||
"context-value" if generic::is_context_value_enabled(context) => {
|
||||
Ok(generic::SVGStrokeDashArray::ContextValue)
|
||||
},
|
||||
"none" => Ok(generic::SVGStrokeDashArray::Values(vec![])),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -125,22 +79,6 @@ impl Parse for SVGStrokeDashArray {
|
|||
/// <opacity-value> | context-fill-opacity | context-stroke-opacity
|
||||
pub type SVGOpacity = generic::SVGOpacity<Opacity>;
|
||||
|
||||
impl Parse for SVGOpacity {
|
||||
fn parse<'i, 't>(
|
||||
context: &ParserContext,
|
||||
input: &mut Parser<'i, 't>,
|
||||
) -> Result<Self, ParseError<'i>> {
|
||||
if let Ok(opacity) = input.try(|i| Opacity::parse(context, i)) {
|
||||
return Ok(generic::SVGOpacity::Opacity(opacity));
|
||||
}
|
||||
|
||||
try_match_ident_ignore_ascii_case! { input,
|
||||
"context-fill-opacity" => Ok(generic::SVGOpacity::ContextFillOpacity),
|
||||
"context-stroke-opacity" => Ok(generic::SVGOpacity::ContextStrokeOpacity),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// The specified value for a single CSS paint-order property.
|
||||
#[repr(u8)]
|
||||
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd, ToCss)]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue