use alloc::string::{String, ToString};
use core::fmt;
use crate::corety::AzString;
use crate::{
format_rust_code::FormatAsRustCode,
props::{
basic::{
error::{InvalidValueErr, InvalidValueErrOwned},
length::{PercentageParseError, PercentageParseErrorOwned, PercentageValue},
pixel::{CssPixelValueParseError, CssPixelValueParseErrorOwned, PixelValue},
ColorU, CssDuration,
},
formatter::PrintAsCssValue,
macros::PixelValueTaker,
},
};
#[derive(Default, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
pub struct StyleTextColor {
pub inner: crate::props::basic::color::ColorU,
}
impl fmt::Debug for StyleTextColor {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.print_as_css_value())
}
}
impl StyleTextColor {
pub fn interpolate(&self, other: &Self, t: f32) -> Self {
Self {
inner: self.inner.interpolate(&other.inner, t),
}
}
}
impl PrintAsCssValue for StyleTextColor {
fn print_as_css_value(&self) -> String {
self.inner.to_hash()
}
}
#[derive(Debug, Default, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
pub enum StyleTextAlign {
Left,
Center,
Right,
Justify,
#[default]
Start,
End,
}
impl_option!(
StyleTextAlign,
OptionStyleTextAlign,
[Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash]
);
impl PrintAsCssValue for StyleTextAlign {
fn print_as_css_value(&self) -> String {
String::from(match self {
StyleTextAlign::Left => "left",
StyleTextAlign::Center => "center",
StyleTextAlign::Right => "right",
StyleTextAlign::Justify => "justify",
StyleTextAlign::Start => "start",
StyleTextAlign::End => "end",
})
}
}
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
pub struct StyleLetterSpacing {
pub inner: PixelValue,
}
impl fmt::Debug for StyleLetterSpacing {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.inner)
}
}
impl Default for StyleLetterSpacing {
fn default() -> Self {
Self {
inner: PixelValue::const_px(0),
}
}
}
impl_pixel_value!(StyleLetterSpacing);
impl PixelValueTaker for StyleLetterSpacing {
fn from_pixel_value(inner: PixelValue) -> Self {
Self { inner }
}
}
impl PrintAsCssValue for StyleLetterSpacing {
fn print_as_css_value(&self) -> String {
format!("{}", self.inner)
}
}
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
pub struct StyleWordSpacing {
pub inner: PixelValue,
}
impl fmt::Debug for StyleWordSpacing {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.inner)
}
}
impl Default for StyleWordSpacing {
fn default() -> Self {
Self {
inner: PixelValue::const_px(0),
}
}
}
impl_pixel_value!(StyleWordSpacing);
impl PixelValueTaker for StyleWordSpacing {
fn from_pixel_value(inner: PixelValue) -> Self {
Self { inner }
}
}
impl PrintAsCssValue for StyleWordSpacing {
fn print_as_css_value(&self) -> String {
format!("{}", self.inner)
}
}
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
pub struct StyleLineHeight {
pub inner: PercentageValue,
}
impl Default for StyleLineHeight {
fn default() -> Self {
Self {
inner: PercentageValue::const_new(120),
}
}
}
impl_percentage_value!(StyleLineHeight);
impl PrintAsCssValue for StyleLineHeight {
fn print_as_css_value(&self) -> String {
format!("{}", self.inner)
}
}
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
pub struct StyleTabSize {
pub inner: PixelValue, }
impl fmt::Debug for StyleTabSize {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.inner)
}
}
impl Default for StyleTabSize {
fn default() -> Self {
Self {
inner: PixelValue::em(8.0),
}
}
}
impl_pixel_value!(StyleTabSize);
impl PixelValueTaker for StyleTabSize {
fn from_pixel_value(inner: PixelValue) -> Self {
Self { inner }
}
}
impl PrintAsCssValue for StyleTabSize {
fn print_as_css_value(&self) -> String {
format!("{}", self.inner)
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
#[derive(Default)]
pub enum StyleWhiteSpace {
#[default]
Normal,
Pre,
Nowrap,
PreWrap,
PreLine,
BreakSpaces,
}
impl_option!(
StyleWhiteSpace,
OptionStyleWhiteSpace,
[Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash]
);
impl PrintAsCssValue for StyleWhiteSpace {
fn print_as_css_value(&self) -> String {
String::from(match self {
StyleWhiteSpace::Normal => "normal",
StyleWhiteSpace::Pre => "pre",
StyleWhiteSpace::Nowrap => "nowrap",
StyleWhiteSpace::PreWrap => "pre-wrap",
StyleWhiteSpace::PreLine => "pre-line",
StyleWhiteSpace::BreakSpaces => "break-spaces",
})
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
#[derive(Default)]
pub enum StyleHyphens {
None,
#[default]
Manual,
Auto,
}
impl_option!(
StyleHyphens,
OptionStyleHyphens,
[Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash]
);
impl PrintAsCssValue for StyleHyphens {
fn print_as_css_value(&self) -> String {
String::from(match self {
StyleHyphens::None => "none",
StyleHyphens::Manual => "manual",
StyleHyphens::Auto => "auto",
})
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
#[derive(Default)]
pub enum StyleLineBreak {
#[default]
Auto,
Loose,
Normal,
Strict,
Anywhere,
}
impl_option!(
StyleLineBreak,
OptionStyleLineBreak,
[Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash]
);
impl PrintAsCssValue for StyleLineBreak {
fn print_as_css_value(&self) -> String {
String::from(match self {
StyleLineBreak::Auto => "auto",
StyleLineBreak::Loose => "loose",
StyleLineBreak::Normal => "normal",
StyleLineBreak::Strict => "strict",
StyleLineBreak::Anywhere => "anywhere",
})
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
#[derive(Default)]
pub enum StyleWordBreak {
#[default]
Normal,
BreakAll,
KeepAll,
BreakWord,
}
impl_option!(
StyleWordBreak,
OptionStyleWordBreak,
[Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash]
);
impl PrintAsCssValue for StyleWordBreak {
fn print_as_css_value(&self) -> String {
String::from(match self {
StyleWordBreak::Normal => "normal",
StyleWordBreak::BreakAll => "break-all",
StyleWordBreak::KeepAll => "keep-all",
StyleWordBreak::BreakWord => "break-word",
})
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
#[derive(Default)]
pub enum StyleOverflowWrap {
#[default]
Normal,
Anywhere,
BreakWord,
}
impl_option!(
StyleOverflowWrap,
OptionStyleOverflowWrap,
[Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash]
);
impl PrintAsCssValue for StyleOverflowWrap {
fn print_as_css_value(&self) -> String {
String::from(match self {
StyleOverflowWrap::Normal => "normal",
StyleOverflowWrap::Anywhere => "anywhere",
StyleOverflowWrap::BreakWord => "break-word",
})
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
#[derive(Default)]
pub enum StyleTextAlignLast {
#[default]
Auto,
Start,
End,
Left,
Right,
Center,
Justify,
}
impl_option!(
StyleTextAlignLast,
OptionStyleTextAlignLast,
[Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash]
);
impl PrintAsCssValue for StyleTextAlignLast {
fn print_as_css_value(&self) -> String {
String::from(match self {
StyleTextAlignLast::Auto => "auto",
StyleTextAlignLast::Start => "start",
StyleTextAlignLast::End => "end",
StyleTextAlignLast::Left => "left",
StyleTextAlignLast::Right => "right",
StyleTextAlignLast::Center => "center",
StyleTextAlignLast::Justify => "justify",
})
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
#[derive(Default)]
pub enum StyleDirection {
#[default]
Ltr,
Rtl,
}
impl_option!(
StyleDirection,
OptionStyleDirection,
[Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash]
);
impl PrintAsCssValue for StyleDirection {
fn print_as_css_value(&self) -> String {
String::from(match self {
StyleDirection::Ltr => "ltr",
StyleDirection::Rtl => "rtl",
})
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
#[derive(Default)]
pub enum StyleUserSelect {
#[default]
Auto,
Text,
None,
All,
}
impl_option!(
StyleUserSelect,
OptionStyleUserSelect,
[Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash]
);
impl PrintAsCssValue for StyleUserSelect {
fn print_as_css_value(&self) -> String {
String::from(match self {
StyleUserSelect::Auto => "auto",
StyleUserSelect::Text => "text",
StyleUserSelect::None => "none",
StyleUserSelect::All => "all",
})
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
#[derive(Default)]
pub enum StyleTextDecoration {
#[default]
None,
Underline,
Overline,
LineThrough,
}
impl_option!(
StyleTextDecoration,
OptionStyleTextDecoration,
[Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash]
);
impl PrintAsCssValue for StyleTextDecoration {
fn print_as_css_value(&self) -> String {
String::from(match self {
StyleTextDecoration::None => "none",
StyleTextDecoration::Underline => "underline",
StyleTextDecoration::Overline => "overline",
StyleTextDecoration::LineThrough => "line-through",
})
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C, u8)]
#[derive(Default)]
pub enum StyleVerticalAlign {
#[default]
Baseline,
Top,
Middle,
Bottom,
Sub,
Superscript,
TextTop,
TextBottom,
Percentage(PercentageValue),
Length(PixelValue),
}
impl_option!(
StyleVerticalAlign,
OptionStyleVerticalAlign,
[Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash]
);
impl PrintAsCssValue for StyleVerticalAlign {
fn print_as_css_value(&self) -> String {
match self {
StyleVerticalAlign::Baseline => String::from("baseline"),
StyleVerticalAlign::Top => String::from("top"),
StyleVerticalAlign::Middle => String::from("middle"),
StyleVerticalAlign::Bottom => String::from("bottom"),
StyleVerticalAlign::Sub => String::from("sub"),
StyleVerticalAlign::Superscript => String::from("super"),
StyleVerticalAlign::TextTop => String::from("text-top"),
StyleVerticalAlign::TextBottom => String::from("text-bottom"),
StyleVerticalAlign::Percentage(p) => format!("{}%", p.normalized() * 100.0),
StyleVerticalAlign::Length(l) => l.print_as_css_value(),
}
}
}
impl crate::format_rust_code::FormatAsRustCode for StyleVerticalAlign {
fn format_as_rust_code(&self, indent: usize) -> String {
match self {
StyleVerticalAlign::Baseline => "StyleVerticalAlign::Baseline".to_string(),
StyleVerticalAlign::Top => "StyleVerticalAlign::Top".to_string(),
StyleVerticalAlign::Middle => "StyleVerticalAlign::Middle".to_string(),
StyleVerticalAlign::Bottom => "StyleVerticalAlign::Bottom".to_string(),
StyleVerticalAlign::Sub => "StyleVerticalAlign::Sub".to_string(),
StyleVerticalAlign::Superscript => "StyleVerticalAlign::Superscript".to_string(),
StyleVerticalAlign::TextTop => "StyleVerticalAlign::TextTop".to_string(),
StyleVerticalAlign::TextBottom => "StyleVerticalAlign::TextBottom".to_string(),
StyleVerticalAlign::Percentage(p) => format!("StyleVerticalAlign::Percentage(PercentageValue::new({}))", p.normalized() * 100.0),
StyleVerticalAlign::Length(l) => format!("StyleVerticalAlign::Length({})", l),
}
}
}
#[cfg(feature = "parser")]
use crate::props::basic::{
color::{parse_css_color, CssColorParseError, CssColorParseErrorOwned},
DurationParseError,
};
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleTextColorParseError<'a> {
ColorParseError(CssColorParseError<'a>),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleTextColorParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleTextColorParseError<'a>, {
ColorParseError(e) => format!("Invalid color: {}", e),
}}
#[cfg(feature = "parser")]
impl_from!(
CssColorParseError<'a>,
StyleTextColorParseError::ColorParseError
);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleTextColorParseErrorOwned {
ColorParseError(CssColorParseErrorOwned),
}
#[cfg(feature = "parser")]
impl<'a> StyleTextColorParseError<'a> {
pub fn to_contained(&self) -> StyleTextColorParseErrorOwned {
match self {
Self::ColorParseError(e) => {
StyleTextColorParseErrorOwned::ColorParseError(e.to_contained())
}
}
}
}
#[cfg(feature = "parser")]
impl StyleTextColorParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleTextColorParseError<'a> {
match self {
Self::ColorParseError(e) => StyleTextColorParseError::ColorParseError(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_text_color(input: &str) -> Result<StyleTextColor, StyleTextColorParseError<'_>> {
parse_css_color(input)
.map(|inner| StyleTextColor { inner })
.map_err(StyleTextColorParseError::ColorParseError)
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleTextAlignParseError<'a> {
InvalidValue(InvalidValueErr<'a>),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleTextAlignParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleTextAlignParseError<'a>, {
InvalidValue(e) => format!("Invalid text-align value: \"{}\"", e.0),
}}
#[cfg(feature = "parser")]
impl_from!(InvalidValueErr<'a>, StyleTextAlignParseError::InvalidValue);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleTextAlignParseErrorOwned {
InvalidValue(InvalidValueErrOwned),
}
#[cfg(feature = "parser")]
impl<'a> StyleTextAlignParseError<'a> {
pub fn to_contained(&self) -> StyleTextAlignParseErrorOwned {
match self {
Self::InvalidValue(e) => StyleTextAlignParseErrorOwned::InvalidValue(e.to_contained()),
}
}
}
#[cfg(feature = "parser")]
impl StyleTextAlignParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleTextAlignParseError<'a> {
match self {
Self::InvalidValue(e) => StyleTextAlignParseError::InvalidValue(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_text_align(input: &str) -> Result<StyleTextAlign, StyleTextAlignParseError<'_>> {
match input.trim() {
"left" => Ok(StyleTextAlign::Left),
"center" => Ok(StyleTextAlign::Center),
"right" => Ok(StyleTextAlign::Right),
"justify" => Ok(StyleTextAlign::Justify),
"start" => Ok(StyleTextAlign::Start),
"end" => Ok(StyleTextAlign::End),
other => Err(StyleTextAlignParseError::InvalidValue(InvalidValueErr(
other,
))),
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleLetterSpacingParseError<'a> {
PixelValue(CssPixelValueParseError<'a>),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleLetterSpacingParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleLetterSpacingParseError<'a>, {
PixelValue(e) => format!("Invalid letter-spacing value: {}", e),
}}
#[cfg(feature = "parser")]
impl_from!(
CssPixelValueParseError<'a>,
StyleLetterSpacingParseError::PixelValue
);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleLetterSpacingParseErrorOwned {
PixelValue(CssPixelValueParseErrorOwned),
}
#[cfg(feature = "parser")]
impl<'a> StyleLetterSpacingParseError<'a> {
pub fn to_contained(&self) -> StyleLetterSpacingParseErrorOwned {
match self {
Self::PixelValue(e) => StyleLetterSpacingParseErrorOwned::PixelValue(e.to_contained()),
}
}
}
#[cfg(feature = "parser")]
impl StyleLetterSpacingParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleLetterSpacingParseError<'a> {
match self {
Self::PixelValue(e) => StyleLetterSpacingParseError::PixelValue(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_letter_spacing(
input: &str,
) -> Result<StyleLetterSpacing, StyleLetterSpacingParseError<'_>> {
crate::props::basic::pixel::parse_pixel_value(input)
.map(|inner| StyleLetterSpacing { inner })
.map_err(StyleLetterSpacingParseError::PixelValue)
}
#[derive(Default, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
pub struct StyleTextIndent {
pub inner: PixelValue,
pub each_line: bool,
pub hanging: bool,
}
impl fmt::Debug for StyleTextIndent {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.print_as_css_value())
}
}
impl StyleTextIndent {
#[inline]
pub const fn zero() -> Self {
Self { inner: crate::props::basic::pixel::PixelValue::zero(), each_line: false, hanging: false }
}
#[inline]
pub const fn const_px(value: isize) -> Self {
Self { inner: crate::props::basic::pixel::PixelValue::const_px(value), each_line: false, hanging: false }
}
#[inline]
pub const fn const_em(value: isize) -> Self {
Self { inner: crate::props::basic::pixel::PixelValue::const_em(value), each_line: false, hanging: false }
}
#[inline]
pub const fn const_pt(value: isize) -> Self {
Self { inner: crate::props::basic::pixel::PixelValue::const_pt(value), each_line: false, hanging: false }
}
#[inline]
pub const fn const_percent(value: isize) -> Self {
Self { inner: crate::props::basic::pixel::PixelValue::const_percent(value), each_line: false, hanging: false }
}
#[inline]
pub const fn const_in(value: isize) -> Self {
Self { inner: crate::props::basic::pixel::PixelValue::const_in(value), each_line: false, hanging: false }
}
#[inline]
pub const fn const_cm(value: isize) -> Self {
Self { inner: crate::props::basic::pixel::PixelValue::const_cm(value), each_line: false, hanging: false }
}
#[inline]
pub const fn const_mm(value: isize) -> Self {
Self { inner: crate::props::basic::pixel::PixelValue::const_mm(value), each_line: false, hanging: false }
}
#[inline]
pub const fn const_from_metric(metric: crate::props::basic::length::SizeMetric, value: isize) -> Self {
Self { inner: crate::props::basic::pixel::PixelValue::const_from_metric(metric, value), each_line: false, hanging: false }
}
#[inline]
pub fn px(value: f32) -> Self {
Self { inner: crate::props::basic::pixel::PixelValue::px(value), each_line: false, hanging: false }
}
#[inline]
pub fn em(value: f32) -> Self {
Self { inner: crate::props::basic::pixel::PixelValue::em(value), each_line: false, hanging: false }
}
#[inline]
pub fn pt(value: f32) -> Self {
Self { inner: crate::props::basic::pixel::PixelValue::pt(value), each_line: false, hanging: false }
}
#[inline]
pub fn percent(value: f32) -> Self {
Self { inner: crate::props::basic::pixel::PixelValue::percent(value), each_line: false, hanging: false }
}
#[inline]
pub fn from_metric(metric: crate::props::basic::length::SizeMetric, value: f32) -> Self {
Self { inner: crate::props::basic::pixel::PixelValue::from_metric(metric, value), each_line: false, hanging: false }
}
#[inline]
pub fn interpolate(&self, other: &Self, t: f32) -> Self {
StyleTextIndent { inner: self.inner.interpolate(&other.inner, t), each_line: self.each_line, hanging: self.hanging }
}
}
impl PrintAsCssValue for StyleTextIndent {
fn print_as_css_value(&self) -> String {
let mut s = self.inner.to_string();
if self.hanging {
s.push_str(" hanging");
}
if self.each_line {
s.push_str(" each-line");
}
s
}
}
impl crate::format_rust_code::FormatAsRustCode for StyleTextIndent {
fn format_as_rust_code(&self, _tabs: usize) -> String {
format!(
"StyleTextIndent {{ inner: {}, each_line: {}, hanging: {} }}",
self.inner.format_as_rust_code(0), self.each_line, self.hanging
)
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleTextIndentParseError<'a> {
PixelValue(CssPixelValueParseError<'a>),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleTextIndentParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleTextIndentParseError<'a>, {
PixelValue(e) => format!("Invalid text-indent value: {}", e),
}}
#[cfg(feature = "parser")]
impl_from!(
CssPixelValueParseError<'a>,
StyleTextIndentParseError::PixelValue
);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleTextIndentParseErrorOwned {
PixelValue(CssPixelValueParseErrorOwned),
}
#[cfg(feature = "parser")]
impl<'a> StyleTextIndentParseError<'a> {
pub fn to_contained(&self) -> StyleTextIndentParseErrorOwned {
match self {
Self::PixelValue(e) => StyleTextIndentParseErrorOwned::PixelValue(e.to_contained()),
}
}
}
#[cfg(feature = "parser")]
impl StyleTextIndentParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleTextIndentParseError<'a> {
match self {
Self::PixelValue(e) => StyleTextIndentParseError::PixelValue(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_text_indent(input: &str) -> Result<StyleTextIndent, StyleTextIndentParseError<'_>> {
let mut each_line = false;
let mut hanging = false;
let mut pixel_part: Option<&str> = None;
for token in input.split_whitespace() {
match token {
"each-line" => each_line = true,
"hanging" => hanging = true,
_ => {
pixel_part = Some(token);
}
}
}
let pixel_str = pixel_part.unwrap_or("0px");
crate::props::basic::pixel::parse_pixel_value(pixel_str)
.map(|inner| StyleTextIndent { inner, each_line, hanging })
.map_err(StyleTextIndentParseError::PixelValue)
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
pub struct StyleInitialLetter {
pub size: u32,
pub sink: crate::corety::OptionU32,
}
impl FormatAsRustCode for StyleInitialLetter {
fn format_as_rust_code(&self, _tabs: usize) -> String {
format!("{:?}", self)
}
}
impl PrintAsCssValue for StyleInitialLetter {
fn print_as_css_value(&self) -> String {
if let crate::corety::OptionU32::Some(sink) = self.sink {
format!("{} {}", self.size, sink)
} else {
format!("{}", self.size)
}
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleInitialLetterParseError<'a> {
InvalidFormat(&'a str),
InvalidSize(&'a str),
InvalidSink(&'a str),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleInitialLetterParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleInitialLetterParseError<'a>, {
InvalidFormat(e) => format!("Invalid initial-letter format: {}", e),
InvalidSize(e) => format!("Invalid initial-letter size: {}", e),
InvalidSink(e) => format!("Invalid initial-letter sink: {}", e),
}}
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleInitialLetterParseErrorOwned {
InvalidFormat(AzString),
InvalidSize(AzString),
InvalidSink(AzString),
}
#[cfg(feature = "parser")]
impl<'a> StyleInitialLetterParseError<'a> {
pub fn to_contained(&self) -> StyleInitialLetterParseErrorOwned {
match self {
Self::InvalidFormat(s) => {
StyleInitialLetterParseErrorOwned::InvalidFormat(s.to_string().into())
}
Self::InvalidSize(s) => StyleInitialLetterParseErrorOwned::InvalidSize(s.to_string().into()),
Self::InvalidSink(s) => StyleInitialLetterParseErrorOwned::InvalidSink(s.to_string().into()),
}
}
}
#[cfg(feature = "parser")]
impl StyleInitialLetterParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleInitialLetterParseError<'a> {
match self {
Self::InvalidFormat(s) => StyleInitialLetterParseError::InvalidFormat(s.as_str()),
Self::InvalidSize(s) => StyleInitialLetterParseError::InvalidSize(s.as_str()),
Self::InvalidSink(s) => StyleInitialLetterParseError::InvalidSink(s.as_str()),
}
}
}
#[cfg(feature = "parser")]
impl From<StyleInitialLetterParseError<'_>> for StyleInitialLetterParseErrorOwned {
fn from(e: StyleInitialLetterParseError) -> Self {
match e {
StyleInitialLetterParseError::InvalidFormat(s) => {
StyleInitialLetterParseErrorOwned::InvalidFormat(s.to_string().into())
}
StyleInitialLetterParseError::InvalidSize(s) => {
StyleInitialLetterParseErrorOwned::InvalidSize(s.to_string().into())
}
StyleInitialLetterParseError::InvalidSink(s) => {
StyleInitialLetterParseErrorOwned::InvalidSink(s.to_string().into())
}
}
}
}
#[cfg(feature = "parser")]
impl_display! { StyleInitialLetterParseErrorOwned, {
InvalidFormat(e) => format!("Invalid initial-letter format: {}", e),
InvalidSize(e) => format!("Invalid initial-letter size: {}", e),
InvalidSink(e) => format!("Invalid initial-letter sink: {}", e),
}}
#[cfg(feature = "parser")]
pub fn parse_style_initial_letter<'a>(
input: &'a str,
) -> Result<StyleInitialLetter, StyleInitialLetterParseError<'a>> {
let input = input.trim();
let parts: Vec<&str> = input.split_whitespace().collect();
if parts.is_empty() {
return Err(StyleInitialLetterParseError::InvalidFormat(input));
}
let size = parts[0]
.parse::<u32>()
.map_err(|_| StyleInitialLetterParseError::InvalidSize(parts[0]))?;
if size == 0 {
return Err(StyleInitialLetterParseError::InvalidSize(parts[0]));
}
let sink = if parts.len() > 1 {
crate::corety::OptionU32::Some(
parts[1]
.parse::<u32>()
.map_err(|_| StyleInitialLetterParseError::InvalidSink(parts[1]))?,
)
} else {
crate::corety::OptionU32::None
};
Ok(StyleInitialLetter { size, sink })
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
pub struct StyleLineClamp {
pub max_lines: usize,
}
impl FormatAsRustCode for StyleLineClamp {
fn format_as_rust_code(&self, _tabs: usize) -> String {
format!("{:?}", self)
}
}
impl PrintAsCssValue for StyleLineClamp {
fn print_as_css_value(&self) -> String {
format!("{}", self.max_lines)
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleLineClampParseError<'a> {
InvalidValue(&'a str),
ZeroValue,
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleLineClampParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleLineClampParseError<'a>, {
InvalidValue(e) => format!("Invalid line-clamp value: {}", e),
ZeroValue => format!("line-clamp cannot be zero"),
}}
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleLineClampParseErrorOwned {
InvalidValue(AzString),
ZeroValue,
}
#[cfg(feature = "parser")]
impl<'a> StyleLineClampParseError<'a> {
pub fn to_contained(&self) -> StyleLineClampParseErrorOwned {
match self {
Self::InvalidValue(s) => StyleLineClampParseErrorOwned::InvalidValue(s.to_string().into()),
Self::ZeroValue => StyleLineClampParseErrorOwned::ZeroValue,
}
}
}
#[cfg(feature = "parser")]
impl StyleLineClampParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleLineClampParseError<'a> {
match self {
Self::InvalidValue(s) => StyleLineClampParseError::InvalidValue(s.as_str()),
Self::ZeroValue => StyleLineClampParseError::ZeroValue,
}
}
}
#[cfg(feature = "parser")]
impl From<StyleLineClampParseError<'_>> for StyleLineClampParseErrorOwned {
fn from(e: StyleLineClampParseError) -> Self {
e.to_contained()
}
}
#[cfg(feature = "parser")]
impl_display! { StyleLineClampParseErrorOwned, {
InvalidValue(e) => format!("Invalid line-clamp value: {}", e),
ZeroValue => format!("line-clamp cannot be zero"),
}}
#[cfg(feature = "parser")]
pub fn parse_style_line_clamp<'a>(
input: &'a str,
) -> Result<StyleLineClamp, StyleLineClampParseError<'a>> {
let input = input.trim();
let max_lines = input
.parse::<usize>()
.map_err(|_| StyleLineClampParseError::InvalidValue(input))?;
if max_lines == 0 {
return Err(StyleLineClampParseError::ZeroValue);
}
Ok(StyleLineClamp { max_lines })
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
#[derive(Default)]
pub struct StyleHangingPunctuation {
pub first: bool,
pub force_end: bool,
pub allow_end: bool,
pub last: bool,
}
impl StyleHangingPunctuation {
pub fn is_enabled(&self) -> bool {
self.first || self.force_end || self.allow_end || self.last
}
}
impl FormatAsRustCode for StyleHangingPunctuation {
fn format_as_rust_code(&self, _tabs: usize) -> String {
format!("{:?}", self)
}
}
impl PrintAsCssValue for StyleHangingPunctuation {
fn print_as_css_value(&self) -> String {
if !self.is_enabled() {
return "none".to_string();
}
let mut parts = alloc::vec::Vec::new();
if self.first { parts.push("first"); }
if self.force_end { parts.push("force-end"); }
if self.allow_end { parts.push("allow-end"); }
if self.last { parts.push("last"); }
parts.join(" ")
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleHangingPunctuationParseError<'a> {
InvalidValue(&'a str),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleHangingPunctuationParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleHangingPunctuationParseError<'a>, {
InvalidValue(e) => format!("Invalid hanging-punctuation value: {}", e),
}}
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleHangingPunctuationParseErrorOwned {
InvalidValue(AzString),
}
#[cfg(feature = "parser")]
impl<'a> StyleHangingPunctuationParseError<'a> {
pub fn to_contained(&self) -> StyleHangingPunctuationParseErrorOwned {
match self {
Self::InvalidValue(s) => {
StyleHangingPunctuationParseErrorOwned::InvalidValue(s.to_string().into())
}
}
}
}
#[cfg(feature = "parser")]
impl StyleHangingPunctuationParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleHangingPunctuationParseError<'a> {
match self {
Self::InvalidValue(s) => StyleHangingPunctuationParseError::InvalidValue(s.as_str()),
}
}
}
#[cfg(feature = "parser")]
impl From<StyleHangingPunctuationParseError<'_>> for StyleHangingPunctuationParseErrorOwned {
fn from(e: StyleHangingPunctuationParseError) -> Self {
e.to_contained()
}
}
#[cfg(feature = "parser")]
impl_display! { StyleHangingPunctuationParseErrorOwned, {
InvalidValue(e) => format!("Invalid hanging-punctuation value: {}", e),
}}
#[cfg(feature = "parser")]
pub fn parse_style_hanging_punctuation<'a>(
input: &'a str,
) -> Result<StyleHangingPunctuation, StyleHangingPunctuationParseError<'a>> {
let input = input.trim();
if input.eq_ignore_ascii_case("none") {
return Ok(StyleHangingPunctuation::default());
}
let mut first = false;
let mut force_end = false;
let mut allow_end = false;
let mut last = false;
for token in input.split_whitespace() {
match token.to_lowercase().as_str() {
"first" => first = true,
"force-end" => force_end = true,
"allow-end" => allow_end = true,
"last" => last = true,
_ => return Err(StyleHangingPunctuationParseError::InvalidValue(input)),
}
}
if force_end && allow_end {
return Err(StyleHangingPunctuationParseError::InvalidValue(input));
}
Ok(StyleHangingPunctuation { first, force_end, allow_end, last })
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C, u8)]
#[derive(Default)]
pub enum StyleTextCombineUpright {
#[default]
None,
All,
Digits(u8),
}
impl FormatAsRustCode for StyleTextCombineUpright {
fn format_as_rust_code(&self, _tabs: usize) -> String {
format!("{:?}", self)
}
}
impl PrintAsCssValue for StyleTextCombineUpright {
fn print_as_css_value(&self) -> String {
match self {
Self::None => "none".to_string(),
Self::All => "all".to_string(),
Self::Digits(n) => format!("digits {}", n),
}
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleTextCombineUprightParseError<'a> {
InvalidValue(&'a str),
InvalidDigits(&'a str),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleTextCombineUprightParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleTextCombineUprightParseError<'a>, {
InvalidValue(e) => format!("Invalid text-combine-upright value: {}", e),
InvalidDigits(e) => format!("Invalid text-combine-upright digits: {}", e),
}}
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleTextCombineUprightParseErrorOwned {
InvalidValue(AzString),
InvalidDigits(AzString),
}
#[cfg(feature = "parser")]
impl<'a> StyleTextCombineUprightParseError<'a> {
pub fn to_contained(&self) -> StyleTextCombineUprightParseErrorOwned {
match self {
Self::InvalidValue(s) => {
StyleTextCombineUprightParseErrorOwned::InvalidValue(s.to_string().into())
}
Self::InvalidDigits(s) => {
StyleTextCombineUprightParseErrorOwned::InvalidDigits(s.to_string().into())
}
}
}
}
#[cfg(feature = "parser")]
impl StyleTextCombineUprightParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleTextCombineUprightParseError<'a> {
match self {
Self::InvalidValue(s) => StyleTextCombineUprightParseError::InvalidValue(s.as_str()),
Self::InvalidDigits(s) => StyleTextCombineUprightParseError::InvalidDigits(s.as_str()),
}
}
}
#[cfg(feature = "parser")]
impl From<StyleTextCombineUprightParseError<'_>> for StyleTextCombineUprightParseErrorOwned {
fn from(e: StyleTextCombineUprightParseError) -> Self {
e.to_contained()
}
}
#[cfg(feature = "parser")]
impl_display! { StyleTextCombineUprightParseErrorOwned, {
InvalidValue(e) => format!("Invalid text-combine-upright value: {}", e),
InvalidDigits(e) => format!("Invalid text-combine-upright digits: {}", e),
}}
#[cfg(feature = "parser")]
pub fn parse_style_text_combine_upright<'a>(
input: &'a str,
) -> Result<StyleTextCombineUpright, StyleTextCombineUprightParseError<'a>> {
let trimmed = input.trim();
if trimmed.eq_ignore_ascii_case("none") {
Ok(StyleTextCombineUpright::None)
} else if trimmed.eq_ignore_ascii_case("all") {
Ok(StyleTextCombineUpright::All)
} else if trimmed.starts_with("digits") {
let parts: Vec<&str> = trimmed.split_whitespace().collect();
if parts.len() == 2 {
let n = parts[1]
.parse::<u8>()
.map_err(|_| StyleTextCombineUprightParseError::InvalidDigits(input))?;
if (2..=4).contains(&n) {
Ok(StyleTextCombineUpright::Digits(n))
} else {
Err(StyleTextCombineUprightParseError::InvalidDigits(input))
}
} else {
Ok(StyleTextCombineUpright::Digits(2))
}
} else {
Err(StyleTextCombineUprightParseError::InvalidValue(input))
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleWordSpacingParseError<'a> {
PixelValue(CssPixelValueParseError<'a>),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleWordSpacingParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleWordSpacingParseError<'a>, {
PixelValue(e) => format!("Invalid word-spacing value: {}", e),
}}
#[cfg(feature = "parser")]
impl_from!(
CssPixelValueParseError<'a>,
StyleWordSpacingParseError::PixelValue
);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleWordSpacingParseErrorOwned {
PixelValue(CssPixelValueParseErrorOwned),
}
#[cfg(feature = "parser")]
impl<'a> StyleWordSpacingParseError<'a> {
pub fn to_contained(&self) -> StyleWordSpacingParseErrorOwned {
match self {
Self::PixelValue(e) => StyleWordSpacingParseErrorOwned::PixelValue(e.to_contained()),
}
}
}
#[cfg(feature = "parser")]
impl StyleWordSpacingParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleWordSpacingParseError<'a> {
match self {
Self::PixelValue(e) => StyleWordSpacingParseError::PixelValue(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_word_spacing(
input: &str,
) -> Result<StyleWordSpacing, StyleWordSpacingParseError<'_>> {
crate::props::basic::pixel::parse_pixel_value(input)
.map(|inner| StyleWordSpacing { inner })
.map_err(StyleWordSpacingParseError::PixelValue)
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleLineHeightParseError {
Percentage(PercentageParseError),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleLineHeightParseError);
#[cfg(feature = "parser")]
impl_display! { StyleLineHeightParseError, {
Percentage(e) => format!("Invalid line-height value: {}", e),
}}
#[cfg(feature = "parser")]
impl_from!(PercentageParseError, StyleLineHeightParseError::Percentage);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
pub enum StyleLineHeightParseErrorOwned {
Percentage(PercentageParseErrorOwned),
}
#[cfg(feature = "parser")]
impl StyleLineHeightParseError {
pub fn to_contained(&self) -> StyleLineHeightParseErrorOwned {
match self {
Self::Percentage(e) => StyleLineHeightParseErrorOwned::Percentage(e.to_contained()),
}
}
}
#[cfg(feature = "parser")]
impl StyleLineHeightParseErrorOwned {
pub fn to_shared(&self) -> StyleLineHeightParseError {
match self {
Self::Percentage(e) => StyleLineHeightParseError::Percentage(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_line_height(input: &str) -> Result<StyleLineHeight, StyleLineHeightParseError> {
if let Ok(inner) = crate::props::basic::length::parse_percentage_value(input) {
return Ok(StyleLineHeight { inner });
}
if let Ok(px) = crate::props::basic::pixel::parse_pixel_value(input) {
if px.metric == crate::props::basic::length::SizeMetric::Px {
let px_val = px.number.get();
return Ok(StyleLineHeight {
inner: crate::props::basic::length::PercentageValue::new(-px_val * 100.0),
});
}
}
Err(StyleLineHeightParseError::Percentage(
crate::props::basic::length::PercentageParseError::InvalidUnit("".to_string().into()),
))
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleTabSizeParseError<'a> {
PixelValue(CssPixelValueParseError<'a>),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleTabSizeParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleTabSizeParseError<'a>, {
PixelValue(e) => format!("Invalid tab-size value: {}", e),
}}
#[cfg(feature = "parser")]
impl_from!(
CssPixelValueParseError<'a>,
StyleTabSizeParseError::PixelValue
);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleTabSizeParseErrorOwned {
PixelValue(CssPixelValueParseErrorOwned),
}
#[cfg(feature = "parser")]
impl<'a> StyleTabSizeParseError<'a> {
pub fn to_contained(&self) -> StyleTabSizeParseErrorOwned {
match self {
Self::PixelValue(e) => StyleTabSizeParseErrorOwned::PixelValue(e.to_contained()),
}
}
}
#[cfg(feature = "parser")]
impl StyleTabSizeParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleTabSizeParseError<'a> {
match self {
Self::PixelValue(e) => StyleTabSizeParseError::PixelValue(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_tab_size(input: &str) -> Result<StyleTabSize, StyleTabSizeParseError<'_>> {
if let Ok(number) = input.trim().parse::<f32>() {
Ok(StyleTabSize {
inner: PixelValue::em(number),
})
} else {
crate::props::basic::pixel::parse_pixel_value(input)
.map(|v| StyleTabSize { inner: v })
.map_err(StyleTabSizeParseError::PixelValue)
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleWhiteSpaceParseError<'a> {
InvalidValue(InvalidValueErr<'a>),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleWhiteSpaceParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleWhiteSpaceParseError<'a>, {
InvalidValue(e) => format!("Invalid white-space value: \"{}\"", e.0),
}}
#[cfg(feature = "parser")]
impl_from!(InvalidValueErr<'a>, StyleWhiteSpaceParseError::InvalidValue);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleWhiteSpaceParseErrorOwned {
InvalidValue(InvalidValueErrOwned),
}
#[cfg(feature = "parser")]
impl<'a> StyleWhiteSpaceParseError<'a> {
pub fn to_contained(&self) -> StyleWhiteSpaceParseErrorOwned {
match self {
Self::InvalidValue(e) => StyleWhiteSpaceParseErrorOwned::InvalidValue(e.to_contained()),
}
}
}
#[cfg(feature = "parser")]
impl StyleWhiteSpaceParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleWhiteSpaceParseError<'a> {
match self {
Self::InvalidValue(e) => StyleWhiteSpaceParseError::InvalidValue(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_white_space(input: &str) -> Result<StyleWhiteSpace, StyleWhiteSpaceParseError<'_>> {
match input.trim() {
"normal" => Ok(StyleWhiteSpace::Normal),
"pre" => Ok(StyleWhiteSpace::Pre),
"nowrap" | "no-wrap" => Ok(StyleWhiteSpace::Nowrap),
"pre-wrap" => Ok(StyleWhiteSpace::PreWrap),
"pre-line" => Ok(StyleWhiteSpace::PreLine),
"break-spaces" => Ok(StyleWhiteSpace::BreakSpaces),
other => Err(StyleWhiteSpaceParseError::InvalidValue(InvalidValueErr(
other,
))),
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleHyphensParseError<'a> {
InvalidValue(InvalidValueErr<'a>),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleHyphensParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleHyphensParseError<'a>, {
InvalidValue(e) => format!("Invalid hyphens value: \"{}\"", e.0),
}}
#[cfg(feature = "parser")]
impl_from!(InvalidValueErr<'a>, StyleHyphensParseError::InvalidValue);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleHyphensParseErrorOwned {
InvalidValue(InvalidValueErrOwned),
}
#[cfg(feature = "parser")]
impl<'a> StyleHyphensParseError<'a> {
pub fn to_contained(&self) -> StyleHyphensParseErrorOwned {
match self {
Self::InvalidValue(e) => StyleHyphensParseErrorOwned::InvalidValue(e.to_contained()),
}
}
}
#[cfg(feature = "parser")]
impl StyleHyphensParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleHyphensParseError<'a> {
match self {
Self::InvalidValue(e) => StyleHyphensParseError::InvalidValue(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_hyphens(input: &str) -> Result<StyleHyphens, StyleHyphensParseError<'_>> {
match input.trim() {
"none" => Ok(StyleHyphens::None),
"manual" => Ok(StyleHyphens::Manual),
"auto" => Ok(StyleHyphens::Auto),
other => Err(StyleHyphensParseError::InvalidValue(InvalidValueErr(other))),
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleLineBreakParseError<'a> {
InvalidValue(InvalidValueErr<'a>),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleLineBreakParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleLineBreakParseError<'a>, {
InvalidValue(e) => format!("Invalid line-break value: \"{}\"", e.0),
}}
#[cfg(feature = "parser")]
impl_from!(InvalidValueErr<'a>, StyleLineBreakParseError::InvalidValue);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleLineBreakParseErrorOwned {
InvalidValue(InvalidValueErrOwned),
}
#[cfg(feature = "parser")]
impl<'a> StyleLineBreakParseError<'a> {
pub fn to_contained(&self) -> StyleLineBreakParseErrorOwned {
match self {
Self::InvalidValue(e) => StyleLineBreakParseErrorOwned::InvalidValue(e.to_contained()),
}
}
}
#[cfg(feature = "parser")]
impl StyleLineBreakParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleLineBreakParseError<'a> {
match self {
Self::InvalidValue(e) => StyleLineBreakParseError::InvalidValue(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_line_break(input: &str) -> Result<StyleLineBreak, StyleLineBreakParseError<'_>> {
match input.trim() {
"auto" => Ok(StyleLineBreak::Auto),
"loose" => Ok(StyleLineBreak::Loose),
"normal" => Ok(StyleLineBreak::Normal),
"strict" => Ok(StyleLineBreak::Strict),
"anywhere" => Ok(StyleLineBreak::Anywhere),
other => Err(StyleLineBreakParseError::InvalidValue(InvalidValueErr(other))),
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleWordBreakParseError<'a> {
InvalidValue(InvalidValueErr<'a>),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleWordBreakParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleWordBreakParseError<'a>, {
InvalidValue(e) => format!("Invalid word-break value: \"{}\"", e.0),
}}
#[cfg(feature = "parser")]
impl_from!(InvalidValueErr<'a>, StyleWordBreakParseError::InvalidValue);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleWordBreakParseErrorOwned {
InvalidValue(InvalidValueErrOwned),
}
#[cfg(feature = "parser")]
impl<'a> StyleWordBreakParseError<'a> {
pub fn to_contained(&self) -> StyleWordBreakParseErrorOwned {
match self {
Self::InvalidValue(e) => StyleWordBreakParseErrorOwned::InvalidValue(e.to_contained()),
}
}
}
#[cfg(feature = "parser")]
impl StyleWordBreakParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleWordBreakParseError<'a> {
match self {
Self::InvalidValue(e) => StyleWordBreakParseError::InvalidValue(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_word_break(input: &str) -> Result<StyleWordBreak, StyleWordBreakParseError<'_>> {
match input.trim() {
"normal" => Ok(StyleWordBreak::Normal),
"break-all" => Ok(StyleWordBreak::BreakAll),
"keep-all" => Ok(StyleWordBreak::KeepAll),
"break-word" => Ok(StyleWordBreak::BreakWord),
other => Err(StyleWordBreakParseError::InvalidValue(InvalidValueErr(other))),
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleOverflowWrapParseError<'a> {
InvalidValue(InvalidValueErr<'a>),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleOverflowWrapParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleOverflowWrapParseError<'a>, {
InvalidValue(e) => format!("Invalid overflow-wrap value: \"{}\"", e.0),
}}
#[cfg(feature = "parser")]
impl_from!(InvalidValueErr<'a>, StyleOverflowWrapParseError::InvalidValue);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleOverflowWrapParseErrorOwned {
InvalidValue(InvalidValueErrOwned),
}
#[cfg(feature = "parser")]
impl<'a> StyleOverflowWrapParseError<'a> {
pub fn to_contained(&self) -> StyleOverflowWrapParseErrorOwned {
match self {
Self::InvalidValue(e) => StyleOverflowWrapParseErrorOwned::InvalidValue(e.to_contained()),
}
}
}
#[cfg(feature = "parser")]
impl StyleOverflowWrapParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleOverflowWrapParseError<'a> {
match self {
Self::InvalidValue(e) => StyleOverflowWrapParseError::InvalidValue(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_overflow_wrap(input: &str) -> Result<StyleOverflowWrap, StyleOverflowWrapParseError<'_>> {
match input.trim() {
"normal" => Ok(StyleOverflowWrap::Normal),
"anywhere" => Ok(StyleOverflowWrap::Anywhere),
"break-word" => Ok(StyleOverflowWrap::BreakWord),
other => Err(StyleOverflowWrapParseError::InvalidValue(InvalidValueErr(other))),
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleTextAlignLastParseError<'a> {
InvalidValue(InvalidValueErr<'a>),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleTextAlignLastParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleTextAlignLastParseError<'a>, {
InvalidValue(e) => format!("Invalid text-align-last value: \"{}\"", e.0),
}}
#[cfg(feature = "parser")]
impl_from!(InvalidValueErr<'a>, StyleTextAlignLastParseError::InvalidValue);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleTextAlignLastParseErrorOwned {
InvalidValue(InvalidValueErrOwned),
}
#[cfg(feature = "parser")]
impl<'a> StyleTextAlignLastParseError<'a> {
pub fn to_contained(&self) -> StyleTextAlignLastParseErrorOwned {
match self {
Self::InvalidValue(e) => StyleTextAlignLastParseErrorOwned::InvalidValue(e.to_contained()),
}
}
}
#[cfg(feature = "parser")]
impl StyleTextAlignLastParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleTextAlignLastParseError<'a> {
match self {
Self::InvalidValue(e) => StyleTextAlignLastParseError::InvalidValue(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_text_align_last(input: &str) -> Result<StyleTextAlignLast, StyleTextAlignLastParseError<'_>> {
match input.trim() {
"auto" => Ok(StyleTextAlignLast::Auto),
"start" => Ok(StyleTextAlignLast::Start),
"end" => Ok(StyleTextAlignLast::End),
"left" => Ok(StyleTextAlignLast::Left),
"right" => Ok(StyleTextAlignLast::Right),
"center" => Ok(StyleTextAlignLast::Center),
"justify" => Ok(StyleTextAlignLast::Justify),
other => Err(StyleTextAlignLastParseError::InvalidValue(InvalidValueErr(other))),
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleDirectionParseError<'a> {
InvalidValue(InvalidValueErr<'a>),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleDirectionParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleDirectionParseError<'a>, {
InvalidValue(e) => format!("Invalid direction value: \"{}\"", e.0),
}}
#[cfg(feature = "parser")]
impl_from!(InvalidValueErr<'a>, StyleDirectionParseError::InvalidValue);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleDirectionParseErrorOwned {
InvalidValue(InvalidValueErrOwned),
}
#[cfg(feature = "parser")]
impl<'a> StyleDirectionParseError<'a> {
pub fn to_contained(&self) -> StyleDirectionParseErrorOwned {
match self {
Self::InvalidValue(e) => StyleDirectionParseErrorOwned::InvalidValue(e.to_contained()),
}
}
}
#[cfg(feature = "parser")]
impl StyleDirectionParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleDirectionParseError<'a> {
match self {
Self::InvalidValue(e) => StyleDirectionParseError::InvalidValue(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_direction(input: &str) -> Result<StyleDirection, StyleDirectionParseError<'_>> {
match input.trim() {
"ltr" => Ok(StyleDirection::Ltr),
"rtl" => Ok(StyleDirection::Rtl),
other => Err(StyleDirectionParseError::InvalidValue(InvalidValueErr(
other,
))),
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleUserSelectParseError<'a> {
InvalidValue(InvalidValueErr<'a>),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleUserSelectParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleUserSelectParseError<'a>, {
InvalidValue(e) => format!("Invalid user-select value: \"{}\"", e.0),
}}
#[cfg(feature = "parser")]
impl_from!(InvalidValueErr<'a>, StyleUserSelectParseError::InvalidValue);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleUserSelectParseErrorOwned {
InvalidValue(InvalidValueErrOwned),
}
#[cfg(feature = "parser")]
impl<'a> StyleUserSelectParseError<'a> {
pub fn to_contained(&self) -> StyleUserSelectParseErrorOwned {
match self {
Self::InvalidValue(e) => StyleUserSelectParseErrorOwned::InvalidValue(e.to_contained()),
}
}
}
#[cfg(feature = "parser")]
impl StyleUserSelectParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleUserSelectParseError<'a> {
match self {
Self::InvalidValue(e) => StyleUserSelectParseError::InvalidValue(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_user_select(input: &str) -> Result<StyleUserSelect, StyleUserSelectParseError<'_>> {
match input.trim() {
"auto" => Ok(StyleUserSelect::Auto),
"text" => Ok(StyleUserSelect::Text),
"none" => Ok(StyleUserSelect::None),
"all" => Ok(StyleUserSelect::All),
other => Err(StyleUserSelectParseError::InvalidValue(InvalidValueErr(
other,
))),
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleTextDecorationParseError<'a> {
InvalidValue(InvalidValueErr<'a>),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleTextDecorationParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleTextDecorationParseError<'a>, {
InvalidValue(e) => format!("Invalid text-decoration value: \"{}\"", e.0),
}}
#[cfg(feature = "parser")]
impl_from!(
InvalidValueErr<'a>,
StyleTextDecorationParseError::InvalidValue
);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleTextDecorationParseErrorOwned {
InvalidValue(InvalidValueErrOwned),
}
#[cfg(feature = "parser")]
impl<'a> StyleTextDecorationParseError<'a> {
pub fn to_contained(&self) -> StyleTextDecorationParseErrorOwned {
match self {
Self::InvalidValue(e) => {
StyleTextDecorationParseErrorOwned::InvalidValue(e.to_contained())
}
}
}
}
#[cfg(feature = "parser")]
impl StyleTextDecorationParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleTextDecorationParseError<'a> {
match self {
Self::InvalidValue(e) => StyleTextDecorationParseError::InvalidValue(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_text_decoration(
input: &str,
) -> Result<StyleTextDecoration, StyleTextDecorationParseError<'_>> {
match input.trim() {
"none" => Ok(StyleTextDecoration::None),
"underline" => Ok(StyleTextDecoration::Underline),
"overline" => Ok(StyleTextDecoration::Overline),
"line-through" => Ok(StyleTextDecoration::LineThrough),
other => Err(StyleTextDecorationParseError::InvalidValue(
InvalidValueErr(other),
)),
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleVerticalAlignParseError<'a> {
InvalidValue(InvalidValueErr<'a>),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleVerticalAlignParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleVerticalAlignParseError<'a>, {
InvalidValue(e) => format!("Invalid vertical-align value: \"{}\"", e.0),
}}
#[cfg(feature = "parser")]
impl_from!(
InvalidValueErr<'a>,
StyleVerticalAlignParseError::InvalidValue
);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleVerticalAlignParseErrorOwned {
InvalidValue(InvalidValueErrOwned),
}
#[cfg(feature = "parser")]
impl<'a> StyleVerticalAlignParseError<'a> {
pub fn to_contained(&self) -> StyleVerticalAlignParseErrorOwned {
match self {
Self::InvalidValue(e) => {
StyleVerticalAlignParseErrorOwned::InvalidValue(e.to_contained())
}
}
}
}
#[cfg(feature = "parser")]
impl StyleVerticalAlignParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleVerticalAlignParseError<'a> {
match self {
Self::InvalidValue(e) => StyleVerticalAlignParseError::InvalidValue(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_vertical_align(
input: &str,
) -> Result<StyleVerticalAlign, StyleVerticalAlignParseError<'_>> {
match input.trim() {
"baseline" => Ok(StyleVerticalAlign::Baseline),
"top" => Ok(StyleVerticalAlign::Top),
"middle" => Ok(StyleVerticalAlign::Middle),
"bottom" => Ok(StyleVerticalAlign::Bottom),
"sub" => Ok(StyleVerticalAlign::Sub),
"super" => Ok(StyleVerticalAlign::Superscript),
"text-top" => Ok(StyleVerticalAlign::TextTop),
"text-bottom" => Ok(StyleVerticalAlign::TextBottom),
other if other.ends_with('%') => {
let num_str = other.trim_end_matches('%').trim();
match num_str.parse::<f32>() {
Ok(val) => Ok(StyleVerticalAlign::Percentage(PercentageValue::new(val))),
Err(_) => Err(StyleVerticalAlignParseError::InvalidValue(InvalidValueErr(other))),
}
}
other => match crate::props::basic::pixel::parse_pixel_value(other) {
Ok(pv) => Ok(StyleVerticalAlign::Length(pv)),
Err(_) => Err(StyleVerticalAlignParseError::InvalidValue(InvalidValueErr(
other,
))),
},
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
pub struct CaretColor {
pub inner: ColorU,
}
impl Default for CaretColor {
fn default() -> Self {
Self {
inner: ColorU::BLACK,
}
}
}
impl PrintAsCssValue for CaretColor {
fn print_as_css_value(&self) -> String {
self.inner.to_hash()
}
}
impl crate::format_rust_code::FormatAsRustCode for CaretColor {
fn format_as_rust_code(&self, _tabs: usize) -> String {
format!(
"CaretColor {{ inner: {} }}",
crate::format_rust_code::format_color_value(&self.inner)
)
}
}
#[cfg(feature = "parser")]
pub fn parse_caret_color(input: &str) -> Result<CaretColor, CssColorParseError<'_>> {
parse_css_color(input).map(|inner| CaretColor { inner })
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
pub struct CaretAnimationDuration {
pub inner: CssDuration,
}
impl Default for CaretAnimationDuration {
fn default() -> Self {
Self {
inner: CssDuration { inner: 500 },
} }
}
impl PrintAsCssValue for CaretAnimationDuration {
fn print_as_css_value(&self) -> String {
self.inner.print_as_css_value()
}
}
impl crate::format_rust_code::FormatAsRustCode for CaretAnimationDuration {
fn format_as_rust_code(&self, _tabs: usize) -> String {
format!(
"CaretAnimationDuration {{ inner: {} }}",
self.inner.format_as_rust_code(0)
)
}
}
#[cfg(feature = "parser")]
pub fn parse_caret_animation_duration(
input: &str,
) -> Result<CaretAnimationDuration, DurationParseError<'_>> {
use crate::props::basic::parse_duration;
parse_duration(input).map(|inner| CaretAnimationDuration { inner })
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
pub struct CaretWidth {
pub inner: PixelValue,
}
impl Default for CaretWidth {
fn default() -> Self {
Self {
inner: PixelValue::px(2.0), }
}
}
impl PrintAsCssValue for CaretWidth {
fn print_as_css_value(&self) -> String {
self.inner.print_as_css_value()
}
}
impl crate::format_rust_code::FormatAsRustCode for CaretWidth {
fn format_as_rust_code(&self, _tabs: usize) -> String {
format!(
"CaretWidth {{ inner: {} }}",
self.inner.format_as_rust_code(0)
)
}
}
#[cfg(feature = "parser")]
pub fn parse_caret_width(input: &str) -> Result<CaretWidth, CssPixelValueParseError<'_>> {
use crate::props::basic::pixel::parse_pixel_value;
parse_pixel_value(input).map(|inner| CaretWidth { inner })
}
impl From<StyleUserSelect> for crate::props::property::CssProperty {
fn from(value: StyleUserSelect) -> Self {
use crate::props::property::CssProperty;
CssProperty::user_select(value)
}
}
impl From<StyleTextDecoration> for crate::props::property::CssProperty {
fn from(value: StyleTextDecoration) -> Self {
use crate::props::property::CssProperty;
CssProperty::text_decoration(value)
}
}
#[cfg(all(test, feature = "parser"))]
mod tests {
use super::*;
use crate::props::basic::{color::ColorU, length::PercentageValue, pixel::PixelValue};
#[test]
fn test_parse_style_text_color() {
assert_eq!(
parse_style_text_color("red").unwrap().inner,
ColorU::new_rgb(255, 0, 0)
);
assert_eq!(
parse_style_text_color("#aabbcc").unwrap().inner,
ColorU::new_rgb(170, 187, 204)
);
assert!(parse_style_text_color("not-a-color").is_err());
}
#[test]
fn test_parse_style_text_align() {
assert_eq!(
parse_style_text_align("left").unwrap(),
StyleTextAlign::Left
);
assert_eq!(
parse_style_text_align("center").unwrap(),
StyleTextAlign::Center
);
assert_eq!(
parse_style_text_align("right").unwrap(),
StyleTextAlign::Right
);
assert_eq!(
parse_style_text_align("justify").unwrap(),
StyleTextAlign::Justify
);
assert_eq!(
parse_style_text_align("start").unwrap(),
StyleTextAlign::Start
);
assert_eq!(parse_style_text_align("end").unwrap(), StyleTextAlign::End);
assert!(parse_style_text_align("middle").is_err());
}
#[test]
fn test_parse_spacing() {
assert_eq!(
parse_style_letter_spacing("2px").unwrap().inner,
PixelValue::px(2.0)
);
assert_eq!(
parse_style_letter_spacing("-0.1em").unwrap().inner,
PixelValue::em(-0.1)
);
assert_eq!(
parse_style_word_spacing("0.5em").unwrap().inner,
PixelValue::em(0.5)
);
}
#[test]
fn test_parse_line_height() {
assert_eq!(
parse_style_line_height("1.5").unwrap().inner,
PercentageValue::new(150.0)
);
assert_eq!(
parse_style_line_height("120%").unwrap().inner,
PercentageValue::new(120.0)
);
assert_eq!(
parse_style_line_height("20px").unwrap().inner,
PercentageValue::new(-20.0 * 100.0)
);
}
#[test]
fn test_parse_tab_size() {
assert_eq!(
parse_style_tab_size("4").unwrap().inner,
PixelValue::em(4.0)
);
assert_eq!(
parse_style_tab_size("20px").unwrap().inner,
PixelValue::px(20.0)
);
}
#[test]
fn test_parse_white_space() {
assert_eq!(
parse_style_white_space("normal").unwrap(),
StyleWhiteSpace::Normal
);
assert_eq!(
parse_style_white_space("pre").unwrap(),
StyleWhiteSpace::Pre
);
assert_eq!(
parse_style_white_space("nowrap").unwrap(),
StyleWhiteSpace::Nowrap
);
assert_eq!(
parse_style_white_space("pre-wrap").unwrap(),
StyleWhiteSpace::PreWrap
);
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
#[derive(Default)]
pub enum StyleUnicodeBidi {
#[default]
Normal,
Embed,
Isolate,
BidiOverride,
IsolateOverride,
Plaintext,
}
impl_option!(
StyleUnicodeBidi,
OptionStyleUnicodeBidi,
[Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash]
);
impl PrintAsCssValue for StyleUnicodeBidi {
fn print_as_css_value(&self) -> String {
String::from(match self {
StyleUnicodeBidi::Normal => "normal",
StyleUnicodeBidi::Embed => "embed",
StyleUnicodeBidi::Isolate => "isolate",
StyleUnicodeBidi::BidiOverride => "bidi-override",
StyleUnicodeBidi::IsolateOverride => "isolate-override",
StyleUnicodeBidi::Plaintext => "plaintext",
})
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleUnicodeBidiParseError<'a> {
InvalidValue(InvalidValueErr<'a>),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleUnicodeBidiParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleUnicodeBidiParseError<'a>, {
InvalidValue(e) => format!("Invalid unicode-bidi value: \"{}\"", e.0),
}}
#[cfg(feature = "parser")]
impl_from!(InvalidValueErr<'a>, StyleUnicodeBidiParseError::InvalidValue);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleUnicodeBidiParseErrorOwned {
InvalidValue(InvalidValueErrOwned),
}
#[cfg(feature = "parser")]
impl<'a> StyleUnicodeBidiParseError<'a> {
pub fn to_contained(&self) -> StyleUnicodeBidiParseErrorOwned {
match self {
Self::InvalidValue(e) => StyleUnicodeBidiParseErrorOwned::InvalidValue(e.to_contained()),
}
}
}
#[cfg(feature = "parser")]
impl StyleUnicodeBidiParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleUnicodeBidiParseError<'a> {
match self {
Self::InvalidValue(e) => StyleUnicodeBidiParseError::InvalidValue(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_unicode_bidi(input: &str) -> Result<StyleUnicodeBidi, StyleUnicodeBidiParseError<'_>> {
match input.trim() {
"normal" => Ok(StyleUnicodeBidi::Normal),
"embed" => Ok(StyleUnicodeBidi::Embed),
"isolate" => Ok(StyleUnicodeBidi::Isolate),
"bidi-override" => Ok(StyleUnicodeBidi::BidiOverride),
"isolate-override" => Ok(StyleUnicodeBidi::IsolateOverride),
"plaintext" => Ok(StyleUnicodeBidi::Plaintext),
other => Err(StyleUnicodeBidiParseError::InvalidValue(InvalidValueErr(other))),
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
#[derive(Default)]
pub enum StyleTextBoxTrim {
#[default]
None,
TrimStart,
TrimEnd,
TrimBoth,
}
impl_option!(
StyleTextBoxTrim,
OptionStyleTextBoxTrim,
[Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash]
);
impl PrintAsCssValue for StyleTextBoxTrim {
fn print_as_css_value(&self) -> String {
String::from(match self {
StyleTextBoxTrim::None => "none",
StyleTextBoxTrim::TrimStart => "trim-start",
StyleTextBoxTrim::TrimEnd => "trim-end",
StyleTextBoxTrim::TrimBoth => "trim-both",
})
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleTextBoxTrimParseError<'a> {
InvalidValue(InvalidValueErr<'a>),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleTextBoxTrimParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleTextBoxTrimParseError<'a>, {
InvalidValue(e) => format!("Invalid text-box-trim value: \"{}\"", e.0),
}}
#[cfg(feature = "parser")]
impl_from!(InvalidValueErr<'a>, StyleTextBoxTrimParseError::InvalidValue);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleTextBoxTrimParseErrorOwned {
InvalidValue(InvalidValueErrOwned),
}
#[cfg(feature = "parser")]
impl<'a> StyleTextBoxTrimParseError<'a> {
pub fn to_contained(&self) -> StyleTextBoxTrimParseErrorOwned {
match self {
Self::InvalidValue(e) => StyleTextBoxTrimParseErrorOwned::InvalidValue(e.to_contained()),
}
}
}
#[cfg(feature = "parser")]
impl StyleTextBoxTrimParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleTextBoxTrimParseError<'a> {
match self {
Self::InvalidValue(e) => StyleTextBoxTrimParseError::InvalidValue(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_text_box_trim(input: &str) -> Result<StyleTextBoxTrim, StyleTextBoxTrimParseError<'_>> {
match input.trim() {
"none" => Ok(StyleTextBoxTrim::None),
"trim-start" => Ok(StyleTextBoxTrim::TrimStart),
"trim-end" => Ok(StyleTextBoxTrim::TrimEnd),
"trim-both" => Ok(StyleTextBoxTrim::TrimBoth),
other => Err(StyleTextBoxTrimParseError::InvalidValue(InvalidValueErr(other))),
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
#[derive(Default)]
pub enum StyleTextBoxEdge {
#[default]
Auto,
TextEdge,
CapHeight,
ExHeight,
}
impl_option!(
StyleTextBoxEdge,
OptionStyleTextBoxEdge,
[Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash]
);
impl PrintAsCssValue for StyleTextBoxEdge {
fn print_as_css_value(&self) -> String {
String::from(match self {
StyleTextBoxEdge::Auto => "auto",
StyleTextBoxEdge::TextEdge => "text",
StyleTextBoxEdge::CapHeight => "cap",
StyleTextBoxEdge::ExHeight => "ex",
})
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleTextBoxEdgeParseError<'a> {
InvalidValue(InvalidValueErr<'a>),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleTextBoxEdgeParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleTextBoxEdgeParseError<'a>, {
InvalidValue(e) => format!("Invalid text-box-edge value: \"{}\"", e.0),
}}
#[cfg(feature = "parser")]
impl_from!(InvalidValueErr<'a>, StyleTextBoxEdgeParseError::InvalidValue);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleTextBoxEdgeParseErrorOwned {
InvalidValue(InvalidValueErrOwned),
}
#[cfg(feature = "parser")]
impl<'a> StyleTextBoxEdgeParseError<'a> {
pub fn to_contained(&self) -> StyleTextBoxEdgeParseErrorOwned {
match self {
Self::InvalidValue(e) => StyleTextBoxEdgeParseErrorOwned::InvalidValue(e.to_contained()),
}
}
}
#[cfg(feature = "parser")]
impl StyleTextBoxEdgeParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleTextBoxEdgeParseError<'a> {
match self {
Self::InvalidValue(e) => StyleTextBoxEdgeParseError::InvalidValue(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_text_box_edge(input: &str) -> Result<StyleTextBoxEdge, StyleTextBoxEdgeParseError<'_>> {
match input.trim() {
"auto" => Ok(StyleTextBoxEdge::Auto),
"text" => Ok(StyleTextBoxEdge::TextEdge),
"cap" => Ok(StyleTextBoxEdge::CapHeight),
"ex" => Ok(StyleTextBoxEdge::ExHeight),
other => Err(StyleTextBoxEdgeParseError::InvalidValue(InvalidValueErr(other))),
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
#[derive(Default)]
pub enum StyleDominantBaseline {
#[default]
Auto,
TextBottom,
Alphabetic,
Ideographic,
Middle,
Central,
Mathematical,
Hanging,
TextTop,
}
impl_option!(
StyleDominantBaseline,
OptionStyleDominantBaseline,
[Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash]
);
impl PrintAsCssValue for StyleDominantBaseline {
fn print_as_css_value(&self) -> String {
String::from(match self {
StyleDominantBaseline::Auto => "auto",
StyleDominantBaseline::TextBottom => "text-bottom",
StyleDominantBaseline::Alphabetic => "alphabetic",
StyleDominantBaseline::Ideographic => "ideographic",
StyleDominantBaseline::Middle => "middle",
StyleDominantBaseline::Central => "central",
StyleDominantBaseline::Mathematical => "mathematical",
StyleDominantBaseline::Hanging => "hanging",
StyleDominantBaseline::TextTop => "text-top",
})
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleDominantBaselineParseError<'a> {
InvalidValue(InvalidValueErr<'a>),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleDominantBaselineParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleDominantBaselineParseError<'a>, {
InvalidValue(e) => format!("Invalid dominant-baseline value: \"{}\"", e.0),
}}
#[cfg(feature = "parser")]
impl_from!(InvalidValueErr<'a>, StyleDominantBaselineParseError::InvalidValue);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleDominantBaselineParseErrorOwned {
InvalidValue(InvalidValueErrOwned),
}
#[cfg(feature = "parser")]
impl<'a> StyleDominantBaselineParseError<'a> {
pub fn to_contained(&self) -> StyleDominantBaselineParseErrorOwned {
match self {
Self::InvalidValue(e) => StyleDominantBaselineParseErrorOwned::InvalidValue(e.to_contained()),
}
}
}
#[cfg(feature = "parser")]
impl StyleDominantBaselineParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleDominantBaselineParseError<'a> {
match self {
Self::InvalidValue(e) => StyleDominantBaselineParseError::InvalidValue(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_dominant_baseline(input: &str) -> Result<StyleDominantBaseline, StyleDominantBaselineParseError<'_>> {
match input.trim() {
"auto" => Ok(StyleDominantBaseline::Auto),
"text-bottom" => Ok(StyleDominantBaseline::TextBottom),
"alphabetic" => Ok(StyleDominantBaseline::Alphabetic),
"ideographic" => Ok(StyleDominantBaseline::Ideographic),
"middle" => Ok(StyleDominantBaseline::Middle),
"central" => Ok(StyleDominantBaseline::Central),
"mathematical" => Ok(StyleDominantBaseline::Mathematical),
"hanging" => Ok(StyleDominantBaseline::Hanging),
"text-top" => Ok(StyleDominantBaseline::TextTop),
other => Err(StyleDominantBaselineParseError::InvalidValue(InvalidValueErr(other))),
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
#[derive(Default)]
pub enum StyleAlignmentBaseline {
#[default]
Baseline,
TextBottom,
Alphabetic,
Ideographic,
Middle,
Central,
Mathematical,
TextTop,
}
impl_option!(
StyleAlignmentBaseline,
OptionStyleAlignmentBaseline,
[Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash]
);
impl PrintAsCssValue for StyleAlignmentBaseline {
fn print_as_css_value(&self) -> String {
String::from(match self {
StyleAlignmentBaseline::Baseline => "baseline",
StyleAlignmentBaseline::TextBottom => "text-bottom",
StyleAlignmentBaseline::Alphabetic => "alphabetic",
StyleAlignmentBaseline::Ideographic => "ideographic",
StyleAlignmentBaseline::Middle => "middle",
StyleAlignmentBaseline::Central => "central",
StyleAlignmentBaseline::Mathematical => "mathematical",
StyleAlignmentBaseline::TextTop => "text-top",
})
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleAlignmentBaselineParseError<'a> {
InvalidValue(InvalidValueErr<'a>),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleAlignmentBaselineParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleAlignmentBaselineParseError<'a>, {
InvalidValue(e) => format!("Invalid alignment-baseline value: \"{}\"", e.0),
}}
#[cfg(feature = "parser")]
impl_from!(InvalidValueErr<'a>, StyleAlignmentBaselineParseError::InvalidValue);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleAlignmentBaselineParseErrorOwned {
InvalidValue(InvalidValueErrOwned),
}
#[cfg(feature = "parser")]
impl<'a> StyleAlignmentBaselineParseError<'a> {
pub fn to_contained(&self) -> StyleAlignmentBaselineParseErrorOwned {
match self {
Self::InvalidValue(e) => StyleAlignmentBaselineParseErrorOwned::InvalidValue(e.to_contained()),
}
}
}
#[cfg(feature = "parser")]
impl StyleAlignmentBaselineParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleAlignmentBaselineParseError<'a> {
match self {
Self::InvalidValue(e) => StyleAlignmentBaselineParseError::InvalidValue(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_alignment_baseline(input: &str) -> Result<StyleAlignmentBaseline, StyleAlignmentBaselineParseError<'_>> {
match input.trim() {
"baseline" => Ok(StyleAlignmentBaseline::Baseline),
"text-bottom" => Ok(StyleAlignmentBaseline::TextBottom),
"alphabetic" => Ok(StyleAlignmentBaseline::Alphabetic),
"ideographic" => Ok(StyleAlignmentBaseline::Ideographic),
"middle" => Ok(StyleAlignmentBaseline::Middle),
"central" => Ok(StyleAlignmentBaseline::Central),
"mathematical" => Ok(StyleAlignmentBaseline::Mathematical),
"text-top" => Ok(StyleAlignmentBaseline::TextTop),
other => Err(StyleAlignmentBaselineParseError::InvalidValue(InvalidValueErr(other))),
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
#[derive(Default)]
pub enum StyleInitialLetterAlign {
#[default]
Auto,
Alphabetic,
Hanging,
Ideographic,
}
impl_option!(
StyleInitialLetterAlign,
OptionStyleInitialLetterAlign,
[Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash]
);
impl PrintAsCssValue for StyleInitialLetterAlign {
fn print_as_css_value(&self) -> String {
String::from(match self {
StyleInitialLetterAlign::Auto => "auto",
StyleInitialLetterAlign::Alphabetic => "alphabetic",
StyleInitialLetterAlign::Hanging => "hanging",
StyleInitialLetterAlign::Ideographic => "ideographic",
})
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleInitialLetterAlignParseError<'a> {
InvalidValue(InvalidValueErr<'a>),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleInitialLetterAlignParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleInitialLetterAlignParseError<'a>, {
InvalidValue(e) => format!("Invalid initial-letter-align value: \"{}\"", e.0),
}}
#[cfg(feature = "parser")]
impl_from!(InvalidValueErr<'a>, StyleInitialLetterAlignParseError::InvalidValue);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleInitialLetterAlignParseErrorOwned {
InvalidValue(InvalidValueErrOwned),
}
#[cfg(feature = "parser")]
impl<'a> StyleInitialLetterAlignParseError<'a> {
pub fn to_contained(&self) -> StyleInitialLetterAlignParseErrorOwned {
match self {
Self::InvalidValue(e) => StyleInitialLetterAlignParseErrorOwned::InvalidValue(e.to_contained()),
}
}
}
#[cfg(feature = "parser")]
impl StyleInitialLetterAlignParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleInitialLetterAlignParseError<'a> {
match self {
Self::InvalidValue(e) => StyleInitialLetterAlignParseError::InvalidValue(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_initial_letter_align(input: &str) -> Result<StyleInitialLetterAlign, StyleInitialLetterAlignParseError<'_>> {
match input.trim() {
"auto" => Ok(StyleInitialLetterAlign::Auto),
"alphabetic" => Ok(StyleInitialLetterAlign::Alphabetic),
"hanging" => Ok(StyleInitialLetterAlign::Hanging),
"ideographic" => Ok(StyleInitialLetterAlign::Ideographic),
other => Err(StyleInitialLetterAlignParseError::InvalidValue(InvalidValueErr(other))),
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C)]
#[derive(Default)]
pub enum StyleInitialLetterWrap {
#[default]
None,
First,
All,
Grid,
}
impl_option!(
StyleInitialLetterWrap,
OptionStyleInitialLetterWrap,
[Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash]
);
impl PrintAsCssValue for StyleInitialLetterWrap {
fn print_as_css_value(&self) -> String {
String::from(match self {
StyleInitialLetterWrap::None => "none",
StyleInitialLetterWrap::First => "first",
StyleInitialLetterWrap::All => "all",
StyleInitialLetterWrap::Grid => "grid",
})
}
}
#[cfg(feature = "parser")]
#[derive(Clone, PartialEq)]
pub enum StyleInitialLetterWrapParseError<'a> {
InvalidValue(InvalidValueErr<'a>),
}
#[cfg(feature = "parser")]
impl_debug_as_display!(StyleInitialLetterWrapParseError<'a>);
#[cfg(feature = "parser")]
impl_display! { StyleInitialLetterWrapParseError<'a>, {
InvalidValue(e) => format!("Invalid initial-letter-wrap value: \"{}\"", e.0),
}}
#[cfg(feature = "parser")]
impl_from!(InvalidValueErr<'a>, StyleInitialLetterWrapParseError::InvalidValue);
#[cfg(feature = "parser")]
#[derive(Debug, Clone, PartialEq)]
#[repr(C, u8)]
pub enum StyleInitialLetterWrapParseErrorOwned {
InvalidValue(InvalidValueErrOwned),
}
#[cfg(feature = "parser")]
impl<'a> StyleInitialLetterWrapParseError<'a> {
pub fn to_contained(&self) -> StyleInitialLetterWrapParseErrorOwned {
match self {
Self::InvalidValue(e) => StyleInitialLetterWrapParseErrorOwned::InvalidValue(e.to_contained()),
}
}
}
#[cfg(feature = "parser")]
impl StyleInitialLetterWrapParseErrorOwned {
pub fn to_shared<'a>(&'a self) -> StyleInitialLetterWrapParseError<'a> {
match self {
Self::InvalidValue(e) => StyleInitialLetterWrapParseError::InvalidValue(e.to_shared()),
}
}
}
#[cfg(feature = "parser")]
pub fn parse_style_initial_letter_wrap(input: &str) -> Result<StyleInitialLetterWrap, StyleInitialLetterWrapParseError<'_>> {
match input.trim() {
"none" => Ok(StyleInitialLetterWrap::None),
"first" => Ok(StyleInitialLetterWrap::First),
"all" => Ok(StyleInitialLetterWrap::All),
"grid" => Ok(StyleInitialLetterWrap::Grid),
other => Err(StyleInitialLetterWrapParseError::InvalidValue(InvalidValueErr(other))),
}
}