use proc_macro::TokenStream;
use syn::{
self,
parse_macro_input,
AttributeArgs
};
#[proc_macro_attribute]
pub fn mod_use(args: TokenStream, input: TokenStream) -> TokenStream
{
let args = parse_macro_input!(args as AttributeArgs);
let tss = args
.into_iter()
.filter_map(|arg| {
match arg
{
syn::NestedMeta::Meta(syn::Meta::Path(path)) =>
{
path
.get_ident()
.map(|module_name| format!("mod {module_name}; use {module_name}::*;", module_name = module_name))
},
_ => None
}
})
.chain(std::iter::once(input.to_string()))
.collect::<Vec<_>>();
let r = tss.join("\n");
if cfg!(feature = "print")
{
eprintln!("[(proc-macro)retrieve::mod_use+print]\n{}", r);
}
r.parse::<TokenStream>().expect("TokenStream parse error.")
}
#[proc_macro_attribute]
pub fn pub_mod_use(args: TokenStream, input: TokenStream) -> TokenStream
{
let args = parse_macro_input!(args as AttributeArgs);
let tss = args
.into_iter()
.filter_map(|arg| {
match arg
{
syn::NestedMeta::Meta(syn::Meta::Path(path)) =>
{
path
.get_ident()
.map(|module_name| format!("pub mod {module_name}; use {module_name}::*;", module_name = module_name))
},
_ => None
}
})
.chain(std::iter::once(input.to_string()))
.collect::<Vec<_>>();
let r = tss.join("\n");
if cfg!(feature = "print")
{
eprintln!("[(proc-macro)retrieve::pub_mod_use+print]\n{}", r);
}
r.parse::<TokenStream>().expect("TokenStream parse error.")
}
#[proc_macro_attribute]
pub fn mod_pub_use(args: TokenStream, input: TokenStream) -> TokenStream
{
let args = parse_macro_input!(args as AttributeArgs);
let tss = args
.into_iter()
.filter_map(|arg| {
match arg
{
syn::NestedMeta::Meta(syn::Meta::Path(path)) =>
{
path
.get_ident()
.map(|module_name| format!("mod {module_name}; pub use {module_name}::*;", module_name = module_name))
},
_ => None
}
})
.chain(std::iter::once(input.to_string()))
.collect::<Vec<_>>();
let r = tss.join("\n");
if cfg!(feature = "print")
{
eprintln!("[(proc-macro)retrieve::mod_pub_use+print]\n{}", r);
}
r.parse::<TokenStream>().expect("TokenStream parse error.")
}
#[proc_macro_attribute]
pub fn pub_mod_pub_use(args: TokenStream, input: TokenStream) -> TokenStream
{
let args = parse_macro_input!(args as AttributeArgs);
let tss = args
.into_iter()
.filter_map(|arg| {
match arg
{
syn::NestedMeta::Meta(syn::Meta::Path(path)) =>
{
path
.get_ident()
.map(|module_name| format!("pub mod {module_name}; pub use {module_name}::*;", module_name = module_name))
},
_ => None
}
})
.chain(std::iter::once(input.to_string()))
.collect::<Vec<_>>();
let r = tss.join("\n");
if cfg!(feature = "print")
{
eprintln!("[(proc-macro)retrieve::pub_mod_pub_use+print]\n{}", r);
}
r.parse::<TokenStream>().expect("TokenStream parse error.")
}
#[proc_macro_attribute]
pub fn pub_mod(args: TokenStream, input: TokenStream) -> TokenStream
{
let args = parse_macro_input!(args as AttributeArgs);
let tss = args
.into_iter()
.filter_map(|arg| {
match arg
{
syn::NestedMeta::Meta(syn::Meta::Path(path)) =>
{
path
.get_ident()
.map(|module_name| format!("pub mod {module_name};", module_name = module_name))
},
_ => None
}
})
.chain(std::iter::once(input.to_string()))
.collect::<Vec<_>>();
let r = tss.join("\n");
if cfg!(feature = "print")
{
eprintln!("[(proc-macro)retrieve::pub_mod+print]\n{}", r);
}
r.parse::<TokenStream>().expect("TokenStream parse error.")
}
#[proc_macro_attribute]
pub fn r#mod(args: TokenStream, input: TokenStream) -> TokenStream
{
let args = parse_macro_input!(args as AttributeArgs);
let tss = args
.into_iter()
.filter_map(|arg| {
match arg
{
syn::NestedMeta::Meta(syn::Meta::Path(path)) =>
{
path
.get_ident()
.map(|module_name| format!("mod {module_name};", module_name = module_name))
},
_ => None
}
})
.chain(std::iter::once(input.to_string()))
.collect::<Vec<_>>();
let r = tss.join("\n");
if cfg!(feature = "print")
{
eprintln!("[(proc-macro)retrieve::r#mod+print]\n{}", r);
}
r.parse::<TokenStream>().expect("TokenStream parse error.")
}