1use self::entry::parse_entry;
2use self::string::parse_str;
3use crate::entry::{EntryDebug, EntryOptions};
4use proc_macro::TokenStream;
5use syn::{parse_macro_input, Error, ItemFn, LitStr};
6
7mod entry;
8mod string;
9
10#[proc_macro_attribute]
26pub fn main(arg: TokenStream, item: TokenStream) -> TokenStream {
27 let item = parse_macro_input!(item as ItemFn);
28 let mut options = EntryOptions::default();
29 let parser = syn::meta::parser(|m| {
30 if m.path.is_ident("debug_extension") {
31 options.debug = Some(EntryDebug::Extension(m.value()?.parse()?));
32 } else if m.path.is_ident("debug_writer") {
33 options.debug = Some(EntryDebug::Writer(m.value()?.parse()?));
34 } else if m.path.is_ident("no_ph") {
35 options.no_ph = true;
36 } else {
37 return Err(m.error("unknown option"));
38 }
39
40 Ok(())
41 });
42
43 parse_macro_input!(arg with parser);
44
45 parse_entry(item, options)
46 .unwrap_or_else(Error::into_compile_error)
47 .into()
48}
49
50#[proc_macro]
52pub fn str(arg: TokenStream) -> TokenStream {
53 let arg = parse_macro_input!(arg as LitStr);
54
55 parse_str(arg)
56 .unwrap_or_else(Error::into_compile_error)
57 .into()
58}