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
use proc_macro2::TokenStream; use quote::quote; use yarte_dom::DOMFmt; use super::{CodeGen, EachCodeGen, IfElseCodeGen, HIR}; pub struct HTMLCodeGen; impl EachCodeGen for HTMLCodeGen {} impl IfElseCodeGen for HTMLCodeGen {} impl CodeGen for HTMLCodeGen { fn gen(&mut self, v: Vec<HIR>) -> TokenStream { gen(self, v) } } pub struct HTMLMinCodeGen; impl EachCodeGen for HTMLMinCodeGen {} impl IfElseCodeGen for HTMLMinCodeGen {} impl CodeGen for HTMLMinCodeGen { fn gen(&mut self, v: Vec<HIR>) -> TokenStream { let dom: DOMFmt = v.into(); gen(self, dom.0) } } fn gen<C>(codegen: &mut C, v: Vec<HIR>) -> TokenStream where C: CodeGen + EachCodeGen + IfElseCodeGen, { let mut tokens = TokenStream::new(); for i in v { use HIR::*; tokens.extend(match i { Local(a) => quote!(#a), Lit(a) => quote!(_fmt.write_str(#a)?;), Safe(a) => quote!(::std::fmt::Display::fmt(&(#a), _fmt)?;), Expr(a) => quote!(::yarte::Render::render(&(#a), _fmt)?;), Each(a) => codegen.gen_each(*a), IfElse(a) => codegen.gen_if_else(*a), }) } tokens }