boilerplate_macros/
lib.rs1use {
2 self::{
3 boilerplate::Boilerplate, implementation::Implementation, source::Source, template::Template,
4 },
5 boilerplate_parser::Token,
6 darling::FromDeriveInput,
7 new_mime_guess::Mime,
8 proc_macro2::{Span, TokenStream},
9 quote::{quote, ToTokens, TokenStreamExt},
10 std::path::Path,
11 syn::{parse_macro_input, DeriveInput, Generics, Ident, LitStr},
12};
13
14mod boilerplate;
15mod implementation;
16mod source;
17mod template;
18
19#[proc_macro]
20pub fn boilerplate(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
21 let template = parse_macro_input!(input as LitStr);
22 let src = template.value();
23
24 let Implementation { body, text } = Implementation::parse(&src, false, true);
25
26 quote! {
27 {
28 extern crate alloc;
29
30 use ::core::fmt::Write;
31
32 let boilerplate_text = &[ #(#text),* ];
33 let mut boilerplate_output = alloc::string::String::new();
34
35 #body
36
37 boilerplate_output
38 }
39 }
40 .into()
41}
42
43#[allow(non_snake_case)]
44#[proc_macro_derive(Boilerplate, attributes(boilerplate))]
45pub fn Boilerplate(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
46 let derive_input = parse_macro_input!(item as DeriveInput);
47
48 Boilerplate::from_derive_input(&derive_input)
49 .expect("Failed to parse derive input")
50 .impls()
51 .into()
52}