90 lines
1.5 KiB
Rust
90 lines
1.5 KiB
Rust
use proc_macro::{Span, TokenStream};
|
|
|
|
#[derive(Debug)]
|
|
pub enum Markup {
|
|
Block(Block),
|
|
Literal {
|
|
content: String,
|
|
span: Span,
|
|
},
|
|
Symbol {
|
|
symbol: TokenStream,
|
|
},
|
|
Splice {
|
|
expr: TokenStream,
|
|
},
|
|
Element {
|
|
name: TokenStream,
|
|
attrs: Attrs,
|
|
body: ElementBody,
|
|
},
|
|
Let {
|
|
tokens: TokenStream,
|
|
},
|
|
Special {
|
|
segments: Vec<Special>,
|
|
},
|
|
Match {
|
|
at_span: Span,
|
|
head: TokenStream,
|
|
arms: Vec<MatchArm>,
|
|
arms_span: Span,
|
|
},
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub struct Attrs {
|
|
pub classes_static: Vec<ClassOrId>,
|
|
pub classes_toggled: Vec<(ClassOrId, Toggler)>,
|
|
pub ids: Vec<ClassOrId>,
|
|
pub attrs: Vec<Attribute>,
|
|
}
|
|
|
|
pub type ClassOrId = TokenStream;
|
|
|
|
#[derive(Debug)]
|
|
pub enum ElementBody {
|
|
Void { semi_span: Span },
|
|
Block { block: Block },
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub struct Block {
|
|
pub markups: Vec<Markup>,
|
|
pub outer_span: Span,
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub struct Special {
|
|
pub at_span: Span,
|
|
pub head: TokenStream,
|
|
pub body: Block,
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub struct Attribute {
|
|
pub name: TokenStream,
|
|
pub attr_type: AttrType,
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub enum AttrType {
|
|
Normal {
|
|
value: Markup,
|
|
},
|
|
Empty {
|
|
toggler: Option<Toggler>,
|
|
},
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub struct Toggler {
|
|
pub cond: TokenStream,
|
|
pub cond_span: Span,
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub struct MatchArm {
|
|
pub head: TokenStream,
|
|
pub body: Block,
|
|
}
|