Crate proc_macro_crate[−][src]
Providing support for $crate
in procedural macros.
Introduction
In macro_rules!
$crate
is used to get the path of the crate where a macro is declared in. In
procedural macros there is currently no easy way to get this path. A common hack is to import the
desired crate with a know name and use this. However, with rust edition 2018 and dropping
extern crate
declarations from lib.rs
, people start to rename crates in Cargo.toml
directly.
However, this breaks importing the crate, as the proc-macro developer does not know the renamed
name of the crate that should be imported.
This crate provides a way to get the name of a crate, even if it renamed in Cargo.toml
. For this
purpose a single function crate_name
is provided. This function needs to be called in the context
of a proc-macro with the name of the desired crate. CARGO_MANIFEST_DIR
will be used to find the
current active Cargo.toml
and this Cargo.toml
is searched for the desired crate.
Example
use quote::quote; use syn::Ident; use proc_macro2::Span; use proc_macro_crate::{crate_name, FoundCrate}; fn import_my_crate() { let found_crate = crate_name("my-crate").expect("my-crate is present in `Cargo.toml`"); match found_crate { FoundCrate::Itself => quote!( crate::Something ), FoundCrate::Name(name) => { let ident = Ident::new(&name, Span::call_site()); quote!( #ident::Something ) } }; }
License
Licensed under either of
at your option.
Enums
Error | Error type used by this crate. |
FoundCrate | The crate as found by |
Functions
crate_name | Find the crate name for the given |