1use proc_macro_error::proc_macro_error;
2use quote::quote;
3
4mod debug;
5mod display;
6mod generics;
7mod syntax;
8
9#[proc_macro_error]
10#[proc_macro_derive(Debug, attributes(fmt, debug))]
11pub fn debug(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
12 debug::debug(item, &use_rt())
13}
14
15#[proc_macro_error]
16#[proc_macro_derive(Display, attributes(fmt, display))]
17pub fn display(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
18 display::display(item, &use_rt())
19}
20
21#[proc_macro_error]
22#[proc_macro_derive(Fmt, attributes(fmt, debug, display))]
23pub fn fmt(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
24 let use_rt = use_rt();
25 let mut stream = debug::debug(item.clone(), &use_rt);
26 stream.extend(display::display(item, &use_rt));
27 stream
28}
29
30fn use_rt() -> proc_macro2::TokenStream {
31 match proc_macro_crate::crate_name("fmt-derive").unwrap_or_else(|err| {
32 proc_macro_error::abort_call_site!(
33 "{}", err;
34 help = "The `fmt-derive` crate must be used directly.";
35 note = "Did you accidentally import `fmt-derive-proc` instead?"
36 )
37 }) {
38 proc_macro_crate::FoundCrate::Itself => quote!(
39 use crate::_rt;
40 ),
41 proc_macro_crate::FoundCrate::Name(name) => {
42 let ident = syn::Ident::new(&name, proc_macro2::Span::call_site());
43 quote!( use ::#ident::_rt; )
44 }
45 }
46}