easy_macros_attributes_macros/
lib.rs

1mod data;
2mod fields_get_attributes;
3mod fields_with_attributes;
4mod get_attributes;
5mod has_attributes;
6
7use always_context::always_context;
8use anyhow_result::anyhow_result;
9use helpers::find_crate_list;
10use proc_macro::TokenStream;
11use quote::quote;
12
13fn crate_missing_panic(crate_name: &str, for_macro: &str) -> ! {
14    panic!(
15        "Using {for_macro} requires `{crate_name}` (or `easy-macros` crate) to be present in dependencies! You can add it with `{crate_name} = \"*\"` in your Cargo.toml dependencies or with `cargo add {crate_name}` command."
16    );
17}
18
19fn root_macros_crate(required_by: &str) -> proc_macro2::TokenStream {
20    if let Some(found) = find_crate_list(&[
21        ("easy-macros", quote! {}),
22        ("easy-macros-attributes", quote! {}),
23        ("easy-macros-attributes-macros", quote! {}),
24    ]) {
25        found
26    } else {
27        crate_missing_panic("easy-macros-attributes", required_by);
28    }
29}
30
31fn context_crate(required_by: &str) -> proc_macro2::TokenStream {
32    if let Some(found) = find_crate_list(&[
33        ("easy-macros", quote! {}),
34        ("easy-macros-helpers", quote! {}),
35        ("easy-macros-attributes", quote! {::helpers}),
36    ]) {
37        found
38    } else {
39        crate_missing_panic("easy-macros-helpers", required_by);
40    }
41}
42
43#[always_context]
44#[proc_macro]
45#[anyhow_result]
46pub fn has_attributes(item: TokenStream) -> anyhow::Result<TokenStream> {
47    has_attributes::has_attributes(item)
48}
49
50// fn find_unknown(attr_template:&syn::Attribute,attr:syn::)
51
52//Allow for only one unknown inside of attribute
53// __unknown__ - unknown mark
54//Example: #[attribute__unknown__]
55//Example: #[attri__unknown__bute]
56//Example: #[__unknown__attribute]
57//Example: #[attribute(__unknown__)]
58//Example: #[attribute(name=__unknown__)]
59//Example: #[attribute = __unknown__]
60
61#[always_context]
62#[proc_macro]
63#[anyhow_result]
64pub fn get_attributes(item: TokenStream) -> anyhow::Result<TokenStream> {
65    get_attributes::get_attributes(item)
66}
67
68#[always_context]
69#[proc_macro]
70#[anyhow_result]
71pub fn fields_with_attributes(item: TokenStream) -> anyhow::Result<TokenStream> {
72    fields_with_attributes::fields_with_attributes(item)
73}
74
75#[always_context]
76#[no_context]
77#[proc_macro]
78#[anyhow_result]
79/// Debug version of `fields_with_attributes!` that panics with the result.
80#[doc(hidden)]
81pub fn fields_with_attributes_debug(item: TokenStream) -> anyhow::Result<TokenStream> {
82    let result = fields_with_attributes::fields_with_attributes(item)?;
83    panic!("{result}",);
84}
85
86#[always_context]
87#[proc_macro]
88#[anyhow_result]
89pub fn fields_get_attributes(item: TokenStream) -> anyhow::Result<TokenStream> {
90    fields_get_attributes::fields_get_attributes(item)
91}
92
93#[always_context]
94#[no_context]
95#[proc_macro]
96#[anyhow_result]
97/// Debug version of `fields_get_attributes!` that panics with the result.
98#[doc(hidden)]
99pub fn fields_get_attributes_debug(item: TokenStream) -> anyhow::Result<TokenStream> {
100    let result = fields_get_attributes::fields_get_attributes(item)?;
101    panic!("{result}",);
102}