maud/maud_macros/src/ast.rs
2018-06-16 20:49:46 +12:00

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,
}