11个不稳定版本
0.6.3 | 2021年1月5日 |
---|---|
0.6.2 | 2020年12月29日 |
0.6.1 | 2020年9月7日 |
0.5.0 | 2019年9月28日 |
0.3.0 | 2019年2月21日 |
#507 在 过程宏 中
33,496 每月下载量
用于 241 个crate(7个直接使用)
23KB
236 行
find-crate
从当前的 Cargo.toml
中查找crate名称。
在编写声明性宏时,表示当前crate的 $crate
非常有用,但过程宏没有这个功能。如果你知道想要使用的crate的当前名称,你可以做与 $crate
相同的事情。这个crate提供了使这变得容易的特性。
用法
将此添加到你的 Cargo.toml
[dependencies]
find-crate = "0.5"
编译器支持:需要rustc 1.31+
示例
find_crate
从当前的 Cargo.toml
获取crate名称。
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;)
}
正如这个示例所示,它很容易处理proc-macro从多个crate导出的情况。
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;)
}
使用 Manifest
来搜索多个crate。它比逐个使用 find_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
}
默认情况下,它将从 dependencies
和 dev-dependencies
中进行搜索。此外,find_crate
和 Manifest::new
读取 Cargo.toml
,并在 CARGO_MANIFEST_DIR
中将其作为清单。
替代方案
如果你编写类似于函数的过程宏,你可以将其与声明性宏结合使用,以支持crate重命名和宏重导出。
本软件包旨在提供更强大的功能,例如支持多个软件包名称和版本。对于一般用途,proc-macro-crate,它提供了一个更简单的API,可能更容易使用。
许可
您可以选择在Apache License, Version 2.0或MIT许可下获得许可。
除非您明确说明,否则根据Apache-2.0许可定义的,您有意提交给作品的内容将如上所述双重许可,不附加任何额外条款或条件。
依赖
~235–485KB
~11K SLoC