bitwarden_error_macro/
attribute.rs1use 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}