hydracache-macros 0.12.0

Procedural macros for HydraCache.
Documentation
use proc_macro2::{Span, TokenStream as TokenStream2};
use proc_macro_crate::{crate_name, FoundCrate};
use quote::quote;

pub(crate) fn cache_entity_trait_path() -> TokenStream2 {
    crate_name("hydracache-db")
        .map(|found| cache_entity_path_for("hydracache_db", found))
        .or_else(|_| {
            crate_name("hydracache-sqlx")
                .map(|found| cache_entity_path_for("hydracache_sqlx", found))
        })
        .unwrap_or_else(|_| quote!(::hydracache_db::CacheEntity))
}

fn cache_entity_path_for(default_name: &str, found: FoundCrate) -> TokenStream2 {
    let crate_name = match found {
        FoundCrate::Itself => default_name.to_owned(),
        FoundCrate::Name(name) => name,
    };
    let ident = syn::Ident::new(&crate_name.replace('-', "_"), Span::call_site());

    quote!(::#ident::CacheEntity)
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn resolves_cache_entity_path_for_current_crate() {
        assert_eq!(
            cache_entity_path_for("hydracache_db", FoundCrate::Itself).to_string(),
            ":: hydracache_db :: CacheEntity"
        );
    }

    #[test]
    fn resolves_cache_entity_path_for_renamed_crate() {
        assert_eq!(
            cache_entity_path_for("hydracache_db", FoundCrate::Name("cache-db".to_owned()))
                .to_string(),
            ":: cache_db :: CacheEntity"
        );
    }
}