use crate::css::Css;
use crate::to_css::number_to_string;
use crate::value::FlexBasis;
#[derive(Clone, Debug, PartialEq)]
pub enum Flex {
None,
Auto,
Initial,
Number(f32),
Full {
grow: f32,
shrink: f32,
basis: FlexBasis,
},
}
impl Flex {
pub fn expand(self) -> (f32, f32, FlexBasis) {
match self {
Flex::None => (0.0, 0.0, FlexBasis::Auto),
Flex::Auto => (1.0, 1.0, FlexBasis::Auto),
Flex::Initial => (0.0, 1.0, FlexBasis::Auto),
Flex::Number(n) => (
n,
1.0,
FlexBasis::LengthPercentage(crate::data_type::Percentage(0.0).into()),
),
Flex::Full {
grow,
shrink,
basis,
} => (grow, shrink, basis),
}
}
}
impl Css {
pub fn flex(self, v: Flex) -> Self {
let (grow, shrink, basis) = v.expand();
self.push_raw("flex-grow", number_to_string(grow))
.push_raw("flex-shrink", number_to_string(shrink))
.push("flex-basis", basis)
}
}
#[cfg(test)]
mod tests {
use crate::ext::*;
use crate::value::FlexBasis;
use crate::Css;
use super::*;
#[test]
fn flex_none() {
let s = Css::new().flex(Flex::None);
assert_eq!(
s.to_string(),
"flex-grow: 0; flex-shrink: 0; flex-basis: auto;"
);
}
#[test]
fn flex_auto() {
let s = Css::new().flex(Flex::Auto);
assert_eq!(
s.to_string(),
"flex-grow: 1; flex-shrink: 1; flex-basis: auto;"
);
}
#[test]
fn flex_initial() {
let s = Css::new().flex(Flex::Initial);
assert_eq!(
s.to_string(),
"flex-grow: 0; flex-shrink: 1; flex-basis: auto;"
);
}
#[test]
fn flex_number() {
let s = Css::new().flex(Flex::Number(2.0));
assert_eq!(
s.to_string(),
"flex-grow: 2; flex-shrink: 1; flex-basis: 0%;"
);
}
#[test]
fn flex_full_triple() {
let s = Css::new().flex(Flex::Full {
grow: 1.5,
shrink: 0.5,
basis: FlexBasis::LengthPercentage(px(100).into()),
});
assert_eq!(
s.to_string(),
"flex-grow: 1.5; flex-shrink: 0.5; flex-basis: 100px;"
);
}
#[test]
fn flex_then_grow_override() {
let s = Css::new().flex(Flex::Auto).flex_grow(3.0);
assert_eq!(
s.to_string(),
"flex-shrink: 1; flex-basis: auto; flex-grow: 3;"
);
}
}