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过程宏

Download history 14044/week @ 2024-03-14 16536/week @ 2024-03-21 12585/week @ 2024-03-28 10010/week @ 2024-04-04 9848/week @ 2024-04-11 10045/week @ 2024-04-18 10339/week @ 2024-04-25 12485/week @ 2024-05-02 13353/week @ 2024-05-09 10543/week @ 2024-05-16 9753/week @ 2024-05-23 9495/week @ 2024-05-30 8900/week @ 2024-06-06 7938/week @ 2024-06-13 8587/week @ 2024-06-20 6921/week @ 2024-06-27

33,496 每月下载量
用于 241 个crate(7个直接使用)

Apache-2.0 OR MIT

23KB
236

find-crate

crates.io docs.rs license rustc build status

从当前的 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
}

默认情况下,它将从 dependenciesdev-dependencies 中进行搜索。此外,find_crateManifest::new 读取 Cargo.toml,并在 CARGO_MANIFEST_DIR 中将其作为清单。

替代方案

如果你编写类似于函数的过程宏,你可以将其与声明性宏结合使用,以支持crate重命名和宏重导出。

本软件包旨在提供更强大的功能,例如支持多个软件包名称和版本。对于一般用途,proc-macro-crate,它提供了一个更简单的API,可能更容易使用。

许可

您可以选择在Apache License, Version 2.0MIT许可下获得许可。

除非您明确说明,否则根据Apache-2.0许可定义的,您有意提交给作品的内容将如上所述双重许可,不附加任何额外条款或条件。

依赖

~235–485KB
~11K SLoC