fmt_derive_proc/
lib.rs

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}