1#![warn(
4 clippy::all,
5 clippy::pedantic,
6 clippy::nursery,
7 clippy::perf,
8 clippy::cargo,
9 clippy::alloc_instead_of_core,
10 clippy::std_instead_of_alloc,
11 clippy::std_instead_of_core,
12 clippy::get_unwrap,
13 clippy::panic_in_result_fn,
14 clippy::pub_without_shorthand,
15 clippy::redundant_type_annotations,
16 clippy::todo,
17 clippy::undocumented_unsafe_blocks
18)]
19
20mod declare_new_fns;
21use declare_new_fns::DeclareNewFns;
22mod path_ext;
23use proc_macro2::TokenStream;
24use syn::{spanned::Spanned, Path, TraitBound, TypeParamBound};
25
26#[proc_macro]
27pub fn declare_new_fns(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
28 let input: DeclareNewFns = syn::parse_macro_input!(input);
29 TokenStream::try_from(input)
30 .unwrap_or_else(syn::Error::into_compile_error)
31 .into()
32}
33
34fn stringify_basic_path(path: &Path) -> syn::Result<String> {
35 path.segments
36 .iter()
37 .map(|x| x.ident.to_string())
38 .reduce(|mut acc, curr| {
39 acc.push_str("::");
40 acc.push_str(&curr);
41 acc
42 })
43 .ok_or_else(|| syn::Error::new(path.span(), "empty path"))
44}
45
46fn type_param_bound_select_trait(bound: &mut TypeParamBound) -> Option<&mut TraitBound> {
47 if let TypeParamBound::Trait(trait_bound) = bound {
48 Some(trait_bound)
49 } else {
50 None
51 }
52}