#proc-macro #literals #type #procedural #string #parser

litrs

解析和检查Rust字面量(即在Rust编程语言中表示固定值的令牌)。特别适用于进程宏,但也可以在进程宏之外使用。

9个版本

0.4.1 2023年10月18日
0.4.0 2023年3月5日
0.3.0 2022年12月19日
0.2.3 2021年6月9日
0.1.1 2021年5月25日

#5 in 进程宏

Download history 50547/week @ 2024-04-26 66256/week @ 2024-05-03 73465/week @ 2024-05-10 79389/week @ 2024-05-17 79243/week @ 2024-05-24 86187/week @ 2024-05-31 79803/week @ 2024-06-07 92750/week @ 2024-06-14 89562/week @ 2024-06-21 98625/week @ 2024-06-28 103681/week @ 2024-07-05 114314/week @ 2024-07-12 120290/week @ 2024-07-19 133181/week @ 2024-07-26 161706/week @ 2024-08-02 164642/week @ 2024-08-09

598,734 每月下载量
用于 1,374 个crates(70个直接使用)

MIT/Apache

175KB
3.5K SLoC

litrs: 解析和检查Rust字面量

CI status of main Crates.io Version docs.rs

litrs 提供了解析Rust字面量的功能,即Rust编程语言中表示固定值的令牌。例如:27"crab"bool。这特别适用于进程宏,但也可以在进程宏之外使用。

为什么选择这个库?遗憾的是,编译器附带的 proc_macro API 没有提供检查字面量的简单方法。主要有两个库用于此目的:synliteralext。后者已弃用。而且 syn 有时对于手头的任务来说过于强大,尤其是在开发类似函数的进程宏(例如 foo!(..))时。这个crate是一个轻量级的替代品。此外,在字面量方面,litrs 相比 syn 提供了更多的灵活性和一些额外的功能。

我对社区反馈很感兴趣!如果您考虑使用这个库,请在此问题中发表您的意见。

示例

在进程宏中

use std::convert::TryFrom;
use proc_macro::TokenStream;
use litrs::Literal;

#[proc_macro]
pub fn foo(input: TokenStream) -> TokenStream {
    // Please do proper error handling in your real code!
    let first_token = input.into_iter().next().expect("no input");

    // `try_from` will return an error if the token is not a literal.
    match Literal::try_from(first_token) {
        // Convenient methods to produce decent errors via `compile_error!`.
        Err(e) => return e.to_compile_error(),

        // You can now inspect your literal!
        Ok(Literal::Integer(i)) => {
            println!("Got an integer specified in base {:?}", i.base());

            let value = i.value::<u64>().expect("integer literal too large");
            println!("Is your integer even? {}", value % 2 == 0);
        }
        Ok(other) => {
            println!("Got a non-integer literal");
        }
    }

    TokenStream::new() // dummy output
}

如果您期望特定的字面量类型,您也可以使用此方法,如果令牌不是浮点字面量,则会返回错误。

FloatLit::try_from(first_token)

&str 解析

在进程宏之外的环境中,您可能希望直接解析字符串。

use litrs::{FloatLit, Literal};

let lit = Literal::parse("'🦀'").expect("failed to parse literal");
let float_lit = FloatLit::parse("2.7e3").expect("failed to parse as float literal");

请参阅文档examples/目录以获取更多示例和信息。



许可证

根据您的选择,该项目受Apache License, Version 2.0MIT许可证的许可。除非您明确表示,否则您提交给本项目以供包含的任何有意贡献,根据Apache-2.0许可证定义,应作为上述双许可,不附加任何额外条款或条件。

依赖项

~72KB