1use proc_macro2::TokenStream;
2use proc_macro_crate::{crate_name, FoundCrate};
3use quote::{format_ident, quote};
4use zvariant_utils::{case, def_attrs};
5
6pub fn zvariant_path() -> TokenStream {
7 if let Ok(FoundCrate::Name(name)) = crate_name("zvariant") {
8 let ident = format_ident!("{}", name);
9 quote! { ::#ident }
10 } else if let Ok(FoundCrate::Name(name)) = crate_name("zbus") {
11 let ident = format_ident!("{}", name);
12 quote! { ::#ident::zvariant }
13 } else {
14 quote! { ::zvariant }
15 }
16}
17
18pub fn rename_identifier(
19 ident: String,
20 span: proc_macro2::Span,
21 rename_attr: Option<String>,
22 rename_all_attr: Option<&str>,
23) -> Result<String, syn::Error> {
24 if let Some(name) = rename_attr {
25 Ok(name)
26 } else {
27 match rename_all_attr {
28 Some("lowercase") => Ok(ident.to_ascii_lowercase()),
29 Some("UPPERCASE") => Ok(ident.to_ascii_uppercase()),
30 Some("PascalCase") => Ok(case::pascal_or_camel_case(&ident, true)),
31 Some("camelCase") => Ok(case::pascal_or_camel_case(&ident, false)),
32 Some("snake_case") => Ok(case::snake_or_kebab_case(&ident, true)),
33 Some("kebab-case") => Ok(case::snake_or_kebab_case(&ident, false)),
34 None => Ok(ident),
35 Some(other) => Err(syn::Error::new(
36 span,
37 format!("invalid `rename_all` attribute value {other}"),
38 )),
39 }
40 }
41}
42
43def_attrs! {
44 crate zbus, zvariant;
45
46 pub StructAttributes("struct") { signature str, rename_all str, deny_unknown_fields none };
48 pub FieldAttributes("field") { rename str };
50 pub EnumAttributes("enum") { signature str, rename_all str };
52 pub VariantAttributes("variant") { rename str };
54}