1#![allow(unknown_lints, clippy::match_on_vec_items)]
2use proc_macro2::TokenStream;
3use quote::quote;
4
5use yarte_hir::{Each, IfElse, HIR};
6
7#[cfg(feature = "bytes-buf")]
8mod attr_b;
9#[cfg(feature = "bytes-buf")]
10mod bytes;
11#[cfg(feature = "fixed")]
12mod fixed;
13mod fmt;
14mod fn_fmt;
15mod html;
16mod text;
17pub mod wasm;
18#[cfg(feature = "bytes-buf")]
19mod write_b;
20
21pub use self::{fmt::FmtCodeGen, fn_fmt::FnFmtCodeGen, html::HTMLCodeGen, text::TextCodeGen};
22
23#[cfg(any(feature = "wasm-app", feature = "wasm-server"))]
24pub use wasm::*;
25
26#[cfg(feature = "bytes-buf")]
27pub use self::attr_b::AttrBCodeGen;
28#[cfg(all(feature = "bytes-buf", feature = "html-min"))]
29pub use self::bytes::html_min::HTMLMinBytesCodeGen;
30#[cfg(feature = "bytes-buf")]
31pub use self::bytes::{BytesCodeGen, HTMLBytesCodeGen, TextBytesCodeGen};
32#[cfg(all(feature = "fixed", feature = "html-min"))]
33pub use self::fixed::html_min::HTMLMinFixedCodeGen;
34#[cfg(feature = "fixed")]
35pub use self::fixed::{FixedCodeGen, HTMLFixedCodeGen, TextFixedCodeGen};
36#[cfg(feature = "html-min")]
37pub use self::html::html_min::HTMLMinCodeGen;
38#[cfg(feature = "bytes-buf")]
39pub use self::write_b::WriteBCodeGen;
40
41pub trait CodeGen {
42 fn gen(&mut self, v: Vec<HIR>) -> TokenStream;
43}
44
45pub trait EachCodeGen: CodeGen {
46 fn gen_each(&mut self, Each { args, body, expr }: Each) -> TokenStream {
47 let body = self.gen(body);
48 quote!(for #expr in #args { #body })
49 }
50}
51
52pub trait IfElseCodeGen: CodeGen {
53 fn gen_if_else(&mut self, IfElse { ifs, if_else, els }: IfElse) -> TokenStream {
54 let mut tokens = TokenStream::new();
55
56 let (args, body) = ifs;
57 let body = self.gen(body);
58 tokens.extend(quote!(if #args { #body }));
59
60 for (args, body) in if_else {
61 let body = self.gen(body);
62 tokens.extend(quote!(else if #args { #body }));
63 }
64
65 if let Some(body) = els {
66 let body = self.gen(body);
67 tokens.extend(quote!(else { #body }));
68 }
69
70 tokens
71 }
72}