1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
pub mod attribute;
pub mod instance;
pub mod object;
use crate::{Result, TailwindBuilder};
use std::{
cmp::Ordering,
collections::{BTreeSet, HashSet},
fmt::{Debug, Display, Formatter, Write},
hash::{Hash, Hasher},
};
use tailwind_error::nom::{bytes::complete::tag, IResult};
pub type ParsedItem<'a> = IResult<&'a str, Box<dyn TailwindInstance>>;
pub type ParsedList<'a> = IResult<&'a str, HashSet<Box<dyn TailwindInstance>>>;
#[allow(unused_variables)]
pub trait TailwindInstance: Display {
#[inline]
fn id(&self) -> String {
format!("{}", self)
}
fn inlineable(&self) -> bool {
true
}
fn boxed(self) -> Box<dyn TailwindInstance>
where
Self: Sized,
Self: 'static,
{
Box::new(self)
}
fn selectors(&self, ctx: &TailwindBuilder) -> String {
format!(".{}", self.id())
}
fn attributes(&self, ctx: &TailwindBuilder) -> BTreeSet<CssAttribute> {
Default::default()
}
fn write_css(&self, f: &mut (dyn Write), ctx: &TailwindBuilder) -> Result<()> {
writeln!(f, "{} {{", self.selectors(ctx))?;
for item in self.attributes(ctx) {
writeln!(f, "{:indent$}{}", item.to_string(), indent = 4)?
}
writeln!(f, "}}")?;
Ok(())
}
#[track_caller]
fn build_css(&self, ctx: &TailwindBuilder) {
panic!("TODO: build css AST")
}
}
#[derive(Clone)]
pub struct CssAttribute {
key: String,
value: String,
}
#[derive(Debug)]
pub struct TailwindObject {
pub id: String,
pub attributes: BTreeSet<CssAttribute>,
}