use proc_macro_crate::{FoundCrate, crate_name};
use proc_macro2::TokenStream;
use quote::{format_ident, quote};
pub(crate) fn core() -> TokenStream {
resolve("keelson-core", "core")
}
pub(crate) fn exec() -> TokenStream {
resolve("keelson-exec", "exec")
}
fn resolve(direct: &str, facade_module: &str) -> TokenStream {
match crate_name(direct) {
Ok(FoundCrate::Itself) => return quote!(crate),
Ok(FoundCrate::Name(name)) => {
let ident = format_ident!("{}", name);
return quote!(::#ident);
}
Err(_) => {}
}
if let Ok(found) = crate_name("keelson") {
let facade = match found {
FoundCrate::Itself => format_ident!("keelson"),
FoundCrate::Name(name) => format_ident!("{}", name),
};
let module = format_ident!("{}", facade_module);
return quote!(::#facade::#module);
}
let ident = format_ident!("{}", direct.replace('-', "_"));
quote!(::#ident)
}