tailwind_css_fixes/modules/transition/ease/
mod.rs

1use super::*;
2use crate::StandardValue;
3
4#[doc=include_str!("readme.md")]
5#[derive(Clone, Debug)]
6pub struct TailwindEase {
7    kind: StandardValue,
8}
9crate::macros::sealed::keyword_instance!(TailwindEase => "transition-timing-function",
10    {
11        "ease-in" => "in",
12        "ease-in-out" => "in-out",
13        "ease-out" => "out",
14    }
15);
16
17impl Display for TailwindEase {
18    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
19        write!(f, "ease-{}", self.kind)
20    }
21}
22
23impl TailwindEase {
24    /// https://tailwindcss.com/docs/transition-timing-function
25    pub fn parse(pattern: &[&str], arbitrary: &TailwindArbitrary) -> Result<Self> {
26        let value = &StandardValue::parser("ease", &|s| Self::check_valid(s).is_ok())(pattern, arbitrary)?.to_string();
27        Ok(TailwindEase::from(value))
28    }
29    
30    /// https://tailwindcss.com/docs/transition-timing-function#arbitrary-values
31    pub fn parse_arbitrary(arbitrary: &TailwindArbitrary) -> Result<Self> {
32        StandardValue::parse_arbitrary(arbitrary).map(|kind| Self { kind })
33    }
34    
35    /// Returns Ok(keyword) if valid, Err otherwise.
36    /// https://developer.mozilla.org/en-US/docs/Web/CSS/transition-timing-function#syntax
37    pub fn check_valid(mode: &str) -> Result<&str> {
38        let set = BTreeSet::from_iter(vec![
39            "",
40            "in",
41            "in-out",
42            "out",
43            "inherit",
44            "initial",
45            "linear",
46            "revert",
47            "step-end",
48            "step-start",
49            "unset",
50        ]);
51        if set.contains(mode) {
52            Ok(mode)
53        } else {
54            syntax_error!("Invalid ease keyword: {}", mode)
55        }
56    }
57}