zvariant_derive/
utils.rs

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    /// Attributes defined on structures.
47    pub StructAttributes("struct") { signature str, rename_all str, deny_unknown_fields none };
48    /// Attributes defined on fields.
49    pub FieldAttributes("field") { rename str };
50    /// Attributes defined on enumerations.
51    pub EnumAttributes("enum") { signature str, rename_all str };
52    /// Attributes defined on variants.
53    pub VariantAttributes("variant") { rename str };
54}