#![allow(dead_code)]
extern crate proc_macro;
use proc_macro::TokenStream;
use proc_macro2::{Ident, Punct, Span};
use quote::ToTokens;
use syn::{token::{Lt, Gt, Div, Eq, And, Semi, Pound, Colon, Sub}, LitStr, ExprBlock, LitInt, parse_macro_input, LitFloat};
mod parse;
mod gen;
mod impls;
struct Xml(Vec<Content>);
enum SimpleNameSeg {
Ident(Ident),
Minus(Sub),
}
#[derive(PartialEq)]
struct SimpleName(Vec<SimpleNameSeg>);
struct Name {
namespace: Option<(SimpleName, Colon)>,
name: SimpleName,
}
struct Tag {
lt: Lt,
name: Name,
attrs: Vec<Attr>,
tail: TagTail,
}
enum TagTail {
Simple {
slash: Div,
gt: Gt,
},
Complex {
gt: Gt,
inner: Xml,
lt: Lt,
slash: Div,
name2: Name,
gt2: Gt,
}
}
struct Attr {
name: Name,
eq: Eq,
value: Value,
}
enum Value {
Block(ExprBlock),
Str(LitStr),
}
enum Content {
Tag(Tag),
Escape {
amp: And,
escape: Escape,
semi: Semi,
},
Block(ExprBlock),
Punct(Punct),
Ident(Ident),
Str(LitStr),
Int(LitInt),
Float(LitFloat),
}
enum Escape {
Lt(Span),
Gt(Span),
Amp(Span),
Apos(Span),
Quot(Span),
X {
pound: Pound,
x: Ident,
value: u32
},
Int {
pound: Pound,
lit: LitInt,
}
}
#[proc_macro]
pub fn xml(input: TokenStream) -> TokenStream {
parse_macro_input!(input as Xml).into_token_stream().into()
}
#[proc_macro]
pub fn xml_tag(input: TokenStream) -> TokenStream {
parse_macro_input!(input as Tag).into_token_stream().into()
}