Simplify define_css_keyword_enum

This commit is contained in:
Anthony Ramine 2018-01-30 14:53:16 +01:00
parent 3d99a4489c
commit 1fa88b8c6a
2 changed files with 33 additions and 77 deletions

View file

@ -384,69 +384,12 @@ impl_to_css_for_predefined_type!(::cssparser::UnicodeRange);
#[macro_export] #[macro_export]
macro_rules! define_css_keyword_enum { macro_rules! define_css_keyword_enum {
($name: ident: values { $( $css: expr => $variant: ident),+, } (pub enum $name:ident { $($variant:ident = $css:expr,)+ }) => {
aliases { $( $alias: expr => $alias_variant: ident ),+, }) => { #[allow(missing_docs)]
__define_css_keyword_enum__add_optional_traits!($name [ $( $css => $variant ),+ ] #[cfg_attr(feature = "servo", derive(Deserialize, Serialize))]
[ $( $alias => $alias_variant ),+ ]); #[derive(Clone, Copy, Debug, Eq, Hash, MallocSizeOf, PartialEq)]
};
($name: ident: values { $( $css: expr => $variant: ident),+, }
aliases { $( $alias: expr => $alias_variant: ident ),* }) => {
__define_css_keyword_enum__add_optional_traits!($name [ $( $css => $variant ),+ ]
[ $( $alias => $alias_variant ),* ]);
};
($name: ident: values { $( $css: expr => $variant: ident),+ }
aliases { $( $alias: expr => $alias_variant: ident ),+, }) => {
__define_css_keyword_enum__add_optional_traits!($name [ $( $css => $variant ),+ ]
[ $( $alias => $alias_variant ),+ ]);
};
($name: ident: values { $( $css: expr => $variant: ident),+ }
aliases { $( $alias: expr => $alias_variant: ident ),* }) => {
__define_css_keyword_enum__add_optional_traits!($name [ $( $css => $variant ),+ ]
[ $( $alias => $alias_variant ),* ]);
};
($name: ident: $( $css: expr => $variant: ident ),+,) => {
__define_css_keyword_enum__add_optional_traits!($name [ $( $css => $variant ),+ ] []);
};
($name: ident: $( $css: expr => $variant: ident ),+) => {
__define_css_keyword_enum__add_optional_traits!($name [ $( $css => $variant ),+ ] []);
};
}
#[cfg(feature = "servo")]
#[macro_export]
macro_rules! __define_css_keyword_enum__add_optional_traits {
($name: ident [ $( $css: expr => $variant: ident ),+ ]
[ $( $alias: expr => $alias_variant: ident),* ]) => {
__define_css_keyword_enum__actual! {
$name [ Deserialize, Serialize, MallocSizeOf ]
[ $( $css => $variant ),+ ]
[ $( $alias => $alias_variant ),* ]
}
};
}
#[cfg(not(feature = "servo"))]
#[macro_export]
macro_rules! __define_css_keyword_enum__add_optional_traits {
($name: ident [ $( $css: expr => $variant: ident ),+ ]
[ $( $alias: expr => $alias_variant: ident),* ]) => {
__define_css_keyword_enum__actual! {
$name [ MallocSizeOf ]
[ $( $css => $variant ),+ ]
[ $( $alias => $alias_variant ),* ]
}
};
}
#[macro_export]
macro_rules! __define_css_keyword_enum__actual {
($name: ident [ $( $derived_trait: ident),* ]
[ $( $css: expr => $variant: ident ),+ ]
[ $( $alias: expr => $alias_variant: ident ),* ]) => {
#[allow(non_camel_case_types, missing_docs)]
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq$(, $derived_trait )* )]
pub enum $name { pub enum $name {
$( $variant ),+ $($variant),+
} }
impl $name { impl $name {
@ -458,33 +401,40 @@ macro_rules! __define_css_keyword_enum__actual {
match *input.next()? { match *input.next()? {
Token::Ident(ref ident) => { Token::Ident(ref ident) => {
Self::from_ident(ident).map_err(|()| { Self::from_ident(ident).map_err(|()| {
location.new_unexpected_token_error(Token::Ident(ident.clone())) location.new_unexpected_token_error(
Token::Ident(ident.clone()),
)
}) })
} }
ref token => Err(location.new_unexpected_token_error(token.clone())) ref token => {
Err(location.new_unexpected_token_error(token.clone()))
}
} }
} }
/// Parse this property from an already-tokenized identifier. /// Parse this property from an already-tokenized identifier.
pub fn from_ident(ident: &str) -> Result<$name, ()> { pub fn from_ident(ident: &str) -> Result<$name, ()> {
match_ignore_ascii_case! { ident, match_ignore_ascii_case! { ident,
$( $css => Ok($name::$variant), )+ $($css => Ok($name::$variant),)+
$( $alias => Ok($name::$alias_variant), )* _ => Err(())
_ => Err(())
} }
} }
} }
impl $crate::ToCss for $name { impl $crate::ToCss for $name {
fn to_css<W>(&self, dest: &mut $crate::CssWriter<W>) -> ::std::fmt::Result fn to_css<W>(
where W: ::std::fmt::Write &self,
dest: &mut $crate::CssWriter<W>,
) -> ::std::fmt::Result
where
W: ::std::fmt::Write,
{ {
match *self { match *self {
$( $name::$variant => ::std::fmt::Write::write_str(dest, $css) ),+ $( $name::$variant => ::std::fmt::Write::write_str(dest, $css) ),+
} }
} }
} }
} };
} }
/// Helper types for the handling of specified values. /// Helper types for the handling of specified values.

View file

@ -10,14 +10,20 @@ use euclid::TypedSize2D;
#[allow(unused_imports)] use std::ascii::AsciiExt; #[allow(unused_imports)] use std::ascii::AsciiExt;
use std::fmt::{self, Write}; use std::fmt::{self, Write};
define_css_keyword_enum!(UserZoom: define_css_keyword_enum! {
"zoom" => Zoom, pub enum UserZoom {
"fixed" => Fixed); Zoom = "zoom",
Fixed = "fixed",
}
}
define_css_keyword_enum!(Orientation: define_css_keyword_enum! {
"auto" => Auto, pub enum Orientation {
"portrait" => Portrait, Auto = "auto",
"landscape" => Landscape); Portrait = "portrait",
Landscape = "landscape",
}
}
/// A set of viewport descriptors: /// A set of viewport descriptors:
/// ///