bitwarden_error_macro/
attribute.rs

1use darling::{ast::NestedMeta, FromMeta};
2use quote::format_ident;
3
4use crate::args::{BitwardenErrorArgs, BitwardenErrorType};
5
6pub(crate) fn bitwarden_error(
7    args: proc_macro::TokenStream,
8    item: proc_macro::TokenStream,
9) -> proc_macro::TokenStream {
10    let attr_args = match NestedMeta::parse_meta_list(args.into()) {
11        Ok(v) => v,
12        Err(e) => {
13            return proc_macro::TokenStream::from(darling::Error::from(e).write_errors());
14        }
15    };
16
17    let args = match BitwardenErrorArgs::from_list(&attr_args) {
18        Ok(params) => params,
19        Err(error) => {
20            return proc_macro::TokenStream::from(error.write_errors());
21        }
22    };
23
24    let input = syn::parse_macro_input!(item as syn::DeriveInput);
25    let type_identifier = &input.ident;
26    let export_as_identifier = &args
27        .export_as
28        .as_ref()
29        .map(|export_as| format_ident!("{}", export_as))
30        .unwrap_or(input.ident.clone());
31
32    match args.error_type {
33        BitwardenErrorType::Basic => crate::basic::attribute::bitwarden_error_basic(
34            &input,
35            type_identifier,
36            export_as_identifier,
37        ),
38        BitwardenErrorType::Flat => crate::flat::attribute::bitwarden_error_flat(
39            &input,
40            type_identifier,
41            export_as_identifier,
42        ),
43        BitwardenErrorType::Full => crate::full::attribute::bitwarden_error_full(
44            &input,
45            type_identifier,
46            export_as_identifier,
47        ),
48    }
49}