use proc_macro2::Span;
use syn::{Block, Expr, Ident, Local, Pat, Path};
pub struct TeksiRoot {
pub ctx: Option<Ident>,
pub root: TeksiElement,
}
pub struct TeksiElement {
pub type_path: Path,
pub has_explicit_ctor: bool,
pub args: Vec<Expr>,
pub body: Vec<BodyItem>,
pub head_span: Span,
pub args_close: Option<Span>,
pub body_close: Option<Span>,
}
#[allow(clippy::large_enum_variant)]
pub enum BodyItem {
Property(TeksiProperty),
Child(TeksiElement),
ExprChild { expr: Expr, span: Span },
Binding { name: Ident, element: TeksiElement },
Escape { expr: Expr, span: Span },
Let(Local),
Rust {
block: Block,
span: Span,
shape: RustShape,
},
If(TeksiIf),
Match(TeksiMatch),
For(TeksiFor),
Spread { expr: Expr, span: Span },
}
pub struct TeksiIf {
pub cond: Expr,
pub then: TeksiElement,
pub else_branch: Option<Box<TeksiElse>>,
pub span: Span,
pub body_close: Span,
}
#[allow(clippy::large_enum_variant)]
pub enum TeksiElse {
ElseIf(TeksiIf),
Element {
element: TeksiElement,
body_close: Span,
},
}
pub struct TeksiMatch {
pub scrutinee: Expr,
pub arms: Vec<TeksiMatchArm>,
pub span: Span,
pub body_close: Span,
}
pub struct TeksiMatchArm {
pub pat: Pat,
pub guard: Option<(syn::Token![if], Expr)>,
pub element: TeksiElement,
}
pub struct TeksiFor {
pub pat: Pat,
pub iter: Expr,
pub lets: Vec<Local>,
pub element: TeksiElement,
pub span: Span,
pub body_close: Span,
}
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum RustShape {
Expression,
SideEffect,
}
pub struct TeksiProperty {
pub name: Ident,
pub args: Vec<PropArg>,
}
pub enum PropArg {
Expr(Expr),
Element(TeksiElement),
Escape(Expr),
Binding { name: Ident, element: TeksiElement },
}