#![warn(unused_must_use)]
macro_rules! impl_rect_shorthand {
($T:ident, $V:ty) => {
impl $T {
pub fn parse(input: &mut $crate::css_parser::Parser) -> $crate::Result<Self> {
let r = $crate::css_values::rect::Rect::<$V>::parse(input)?;
Ok(Self {
top: r.top,
right: r.right,
bottom: r.bottom,
left: r.left,
})
}
pub fn to_css(
&self,
dest: &mut $crate::printer::Printer,
) -> ::core::result::Result<(), $crate::PrintErr> {
$crate::css_values::rect::Rect::<&$V> {
top: &self.top,
right: &self.right,
bottom: &self.bottom,
left: &self.left,
}
.to_css(dest)
}
}
$crate::impl_parse_tocss_via_inherent!($T);
};
}
macro_rules! define_rect_shorthand {
(
$(#[$meta:meta])*
$name:ident, $inner:ty,
top: $top_id:ident,
right: $right_id:ident,
bottom: $bottom_id:ident,
left: $left_id:ident
$(, fallbacks)?
) => {
$(#[$meta])*
#[derive(Clone, PartialEq)]
pub struct $name {
pub top: $inner,
pub right: $inner,
pub bottom: $inner,
pub left: $inner,
}
impl $name {
pub const PROPERTY_FIELD_MAP: &[(&str, $crate::properties::PropertyIdTag)] = &[
("top", $crate::properties::PropertyIdTag::$top_id),
("right", $crate::properties::PropertyIdTag::$right_id),
("bottom", $crate::properties::PropertyIdTag::$bottom_id),
("left", $crate::properties::PropertyIdTag::$left_id),
];
}
impl $crate::properties::margin_padding::RectShorthand for $name {
type Value = $inner;
}
impl_rect_shorthand!($name, $inner);
};
}
macro_rules! impl_size_shorthand {
($T:ident, $V:ty, $start:ident, $end:ident) => {
impl $T {
pub fn parse(input: &mut $crate::css_parser::Parser) -> $crate::Result<Self> {
let s = $crate::css_values::size::Size2D::<$V>::parse(input)?;
Ok(Self {
$start: s.a,
$end: s.b,
})
}
pub fn to_css(
&self,
dest: &mut $crate::printer::Printer,
) -> ::core::result::Result<(), $crate::PrintErr> {
self.$start.to_css(dest)?;
if self.$start != self.$end {
dest.write_str(b" ")?;
self.$end.to_css(dest)?;
}
Ok(())
}
}
$crate::impl_parse_tocss_via_inherent!($T);
};
}
pub mod align;
pub mod animation;
pub mod background;
pub mod border;
pub mod border_image;
pub mod border_radius;
pub mod box_shadow;
pub mod display;
pub mod effects;
pub mod flex;
pub mod font;
pub mod grid;
pub mod list;
pub mod margin_padding;
pub mod masking;
pub mod outline;
pub mod overflow;
pub mod position;
pub mod prefix_handler;
pub mod shape;
pub mod size;
pub mod svg;
pub mod text;
pub mod transform;
pub mod transition;
pub mod ui;
pub mod css_modules;
pub mod custom;
pub mod properties_generated;
mod properties_impl;
pub use self::custom::CustomPropertyName;
pub use self::properties_generated::{Property, PropertyId, PropertyIdTag};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, crate::DefineEnumProperty)]
pub enum CSSWideKeyword {
Initial,
Inherit,
Unset,
Revert,
RevertLayer,
}
mod generic_registrations {
use super::*;
use crate::css_values;
use crate::impl_parse_tocss_via_inherent;
use crate::properties::border::GenericBorder;
impl_parse_tocss_via_inherent!(
css_values::alpha::AlphaValue,
css_values::image::Image,
css_values::length::LengthPercentage,
css_values::easing::EasingFunction,
css_values::time::Time,
css_values::position::Position,
css_values::position::HorizontalPosition,
css_values::position::VerticalPosition,
css_values::percentage::NumberOrPercentage,
);
impl crate::generics::Parse for css_values::length::Length {
#[inline]
fn parse(input: &mut crate::css_parser::Parser) -> crate::css_parser::CssResult<Self> {
css_values::length::Length::parse(input)
}
}
impl crate::generics::ParseWithOptions for css_values::length::Length {
#[inline]
fn parse_with_options(
input: &mut crate::css_parser::Parser,
_o: &crate::css_parser::ParserOptions,
) -> crate::css_parser::CssResult<Self> {
css_values::length::Length::parse(input)
}
}
impl crate::generics::Parse for css_values::color::CssColor {
#[inline]
fn parse(input: &mut crate::css_parser::Parser) -> crate::css_parser::CssResult<Self> {
css_values::color::CssColor::parse(input)
}
}
impl crate::generics::ParseWithOptions for css_values::color::CssColor {
#[inline]
fn parse_with_options(
input: &mut crate::css_parser::Parser,
_o: &crate::css_parser::ParserOptions,
) -> crate::css_parser::CssResult<Self> {
css_values::color::CssColor::parse(input)
}
}
impl_parse_tocss_via_inherent!(
align::Gap,
align::JustifyContent,
align::JustifyItems,
align::JustifySelf,
align::PlaceContent,
align::PlaceItems,
align::PlaceSelf,
background::Background,
background::BackgroundPosition,
background::BackgroundRepeat,
background::BackgroundSize,
border_image::BorderImage,
border_image::BorderImageRepeat,
border_image::BorderImageSlice,
border_image::BorderImageSideWidth,
border_radius::BorderRadius,
box_shadow::BoxShadow,
css_modules::Composes,
display::Display,
flex::Flex,
flex::FlexFlow,
font::Font,
font::FontFamily,
font::FontStretch,
font::FontStyle,
font::FontWeight,
font::LineHeight,
masking::Mask,
masking::MaskBorder,
overflow::Overflow,
position::Position,
size::AspectRatio,
size::BoxSizing,
size::MaxSize,
size::Size,
text::TextShadow,
transform::Rotate,
transform::Scale,
transform::TransformList,
transform::Translate,
transition::Transition,
ui::ColorScheme,
properties_generated::PropertyId,
);
impl<S, const P: u8> crate::generics::Parse for GenericBorder<S, P>
where
GenericBorder<S, P>: GenericBorderImpl,
{
#[inline]
fn parse(input: &mut crate::css_parser::Parser) -> crate::css_parser::CssResult<Self> {
<Self as GenericBorderImpl>::parse(input)
}
}
impl<S, const P: u8> crate::generics::ParseWithOptions for GenericBorder<S, P>
where
GenericBorder<S, P>: GenericBorderImpl,
{
#[inline]
fn parse_with_options(
input: &mut crate::css_parser::Parser,
_o: &crate::css_parser::ParserOptions,
) -> crate::css_parser::CssResult<Self> {
<Self as GenericBorderImpl>::parse(input)
}
}
impl<S, const P: u8> crate::generics::ToCss for GenericBorder<S, P>
where
GenericBorder<S, P>: GenericBorderImpl,
{
#[inline]
fn to_css(
&self,
dest: &mut crate::printer::Printer,
) -> ::core::result::Result<(), crate::PrintErr> {
<Self as GenericBorderImpl>::to_css(self, dest)
}
}
pub(crate) trait GenericBorderImpl: Sized {
fn parse(input: &mut crate::css_parser::Parser) -> crate::css_parser::CssResult<Self>;
fn to_css(
&self,
dest: &mut crate::printer::Printer,
) -> ::core::result::Result<(), crate::PrintErr>;
}
}
pub(crate) use generic_registrations::GenericBorderImpl;