dyn_slice_macros/
lib.rs

1//! Proc macros for the dyn-slice crate
2
3#![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}