boilerplate_macros/
lib.rs

1use {
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}