Crate find_crate[−][src]
Find the crate name from the current Cargo.toml
.
When writing declarative macros, $crate
representing the current crate is
very useful, but procedural macros do not have this. If you know the current
name of the crate you want to use, you can do the same thing as $crate
.
This crate provides the features to make it easy.
Examples
find_crate
gets the crate name from the current Cargo.toml
.
use find_crate::find_crate; use proc_macro2::{Ident, Span, TokenStream}; use quote::quote; fn import() -> TokenStream { let name = find_crate(|s| s == "foo").unwrap().name; let name = Ident::new(&name, Span::call_site()); // If your proc-macro crate is 2018 edition, use `quote!(use #name as _foo;)` instead. quote!(extern crate #name as _foo;) }
As in this example, it is easy to handle cases where proc-macro is exported from multiple crates.
use find_crate::find_crate; use proc_macro2::{Ident, Span, TokenStream}; use quote::quote; fn import() -> TokenStream { let name = find_crate(|s| s == "foo" || s == "foo-core").unwrap().name; let name = Ident::new(&name, Span::call_site()); // If your proc-macro crate is 2018 edition, use `quote!(use #name as _foo;)` instead. quote!(extern crate #name as _foo;) }
Using Manifest
to search for multiple crates. It is much more efficient
than using find_crate
for each crate.
use find_crate::Manifest; use proc_macro2::{Ident, Span, TokenStream}; use quote::{format_ident, quote}; const CRATE_NAMES: &[&[&str]] = &[ &["foo", "foo-core"], &["bar", "bar-util", "bar-core"], &["baz"], ]; fn imports() -> TokenStream { let mut tts = TokenStream::new(); let manifest = Manifest::new().unwrap(); for names in CRATE_NAMES { let name = manifest.find(|s| names.iter().any(|x| s == *x)).unwrap().name; let name = Ident::new(&name, Span::call_site()); let import_name = format_ident!("_{}", names[0]); // If your proc-macro crate is 2018 edition, use `quote!(use #name as #import_name;)` instead. tts.extend(quote!(extern crate #name as #import_name;)); } tts }
By default it will be searched from dependencies
and dev-dependencies
.
Also, find_crate
and Manifest::new
read Cargo.toml
in
CARGO_MANIFEST_DIR
as manifest.
Alternatives
If you write function-like procedural macros, you can combine it with declarative macros to support both crate renaming and macro re-exporting.
This crate is intended to provide more powerful features such as support for multiple crate names and versions. For general purposes, proc-macro-crate, which provides a simpler API, may be easier to use.
Structs
Manifest | The manifest of cargo. |
Package | The package data. This has information on the current package name, original package name, and specified version. |
Enums
Dependencies | The kind of dependencies to be searched. |
Error | An error that occurred when getting manifest. |
Functions
find_crate | Find the crate name from the current |