#[derive(Debug, Clone, PartialEq)]
pub enum Value {
Color(Color),
Length(Length),
LengthSet(Vec<Length>),
Keyword(String),
Auto,
Number(f64),
FontFamilyList(Vec<String>),
Border {
width: Length,
color: Color,
},
SideSet(Vec<SideValue>),
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum SideValue {
Length(Length),
Auto,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Color {
pub r: u8,
pub g: u8,
pub b: u8,
pub a: u8,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Length {
Px(f64),
Percent(f64),
}
impl Color {
pub const fn rgba(r: u8, g: u8, b: u8, a: u8) -> Self {
Self { r, g, b, a }
}
pub const fn rgb(r: u8, g: u8, b: u8) -> Self {
Self::rgba(r, g, b, 0xff)
}
}
impl Length {
pub fn as_px(self) -> Option<f64> {
match self {
Self::Px(v) => Some(v),
Self::Percent(_) => None,
}
}
}
pub fn expand_sides(set: &[Length]) -> Option<[Length; 4]> {
match set.len() {
1 => Some([set[0]; 4]),
2 => Some([set[0], set[1], set[0], set[1]]),
3 => Some([set[0], set[1], set[2], set[1]]),
4 => Some([set[0], set[1], set[2], set[3]]),
_ => None,
}
}
pub fn expand_side_set(set: &[SideValue]) -> Option<[SideValue; 4]> {
match set.len() {
1 => Some([set[0]; 4]),
2 => Some([set[0], set[1], set[0], set[1]]),
3 => Some([set[0], set[1], set[2], set[1]]),
4 => Some([set[0], set[1], set[2], set[3]]),
_ => None,
}
}