use cssparser::{Parser, match_ignore_ascii_case};
use typed_builder::TypedBuilder;
use crate::layout::style::{
CssDescriptorKind, CssToken, FromCss, MakeComputed, ParseResult, declare_enum_from_css_impl,
tw::TailwindPropertyParser,
};
#[derive(Debug, Clone, Copy, PartialEq, Default, TypedBuilder)]
#[non_exhaustive]
#[builder(field_defaults(default))]
pub struct TextWrap {
pub mode: TextWrapMode,
pub style: TextWrapStyle,
}
impl MakeComputed for TextWrap {}
impl TailwindPropertyParser for TextWrap {
fn parse_tw(token: &str) -> Option<Self> {
match_ignore_ascii_case! {token,
"wrap" => Some(TextWrap {
mode: TextWrapMode::Wrap,
style: TextWrapStyle::default(),
}),
"nowrap" => Some(TextWrap {
mode: TextWrapMode::NoWrap,
style: TextWrapStyle::default(),
}),
"balance" => Some(TextWrap {
mode: TextWrapMode::default(),
style: TextWrapStyle::Balance,
}),
"pretty" => Some(TextWrap {
mode: TextWrapMode::default(),
style: TextWrapStyle::Pretty,
}),
_ => None,
}
}
}
impl<'i> FromCss<'i> for TextWrap {
fn from_css(input: &mut Parser<'i, '_>) -> ParseResult<'i, Self> {
let mut mode = None;
let mut style = TextWrapStyle::default();
while !input.is_exhausted() {
if let Ok(parsed) = input.try_parse(TextWrapMode::from_css) {
mode = Some(parsed);
continue;
}
if let Ok(parsed) = input.try_parse(TextWrapStyle::from_css) {
style = parsed;
continue;
}
return Err(input.new_error_for_next_token());
}
Ok(TextWrap {
mode: mode.unwrap_or_default(),
style,
})
}
const VALID_TOKENS: &'static [CssToken] = &[
CssToken::Descriptor(CssDescriptorKind::TextWrapMode),
CssToken::Descriptor(CssDescriptorKind::TextWrapStyle),
];
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
#[non_exhaustive]
pub enum TextWrapMode {
#[default]
Wrap,
NoWrap,
}
impl From<TextWrapMode> for parley::TextWrapMode {
fn from(value: TextWrapMode) -> Self {
match value {
TextWrapMode::Wrap => parley::TextWrapMode::Wrap,
TextWrapMode::NoWrap => parley::TextWrapMode::NoWrap,
}
}
}
declare_enum_from_css_impl!(
TextWrapMode,
"wrap" => TextWrapMode::Wrap,
"nowrap" => TextWrapMode::NoWrap,
);
#[derive(Debug, Clone, Copy, PartialEq, Default)]
#[non_exhaustive]
pub enum TextWrapStyle {
#[default]
Auto,
Balance,
Pretty,
}
declare_enum_from_css_impl!(
TextWrapStyle,
"auto" => TextWrapStyle::Auto,
"balance" => TextWrapStyle::Balance,
"pretty" => TextWrapStyle::Pretty,
);