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 进程宏
598,734 每月下载量
用于 1,374 个crates(70个直接使用)
175KB
3.5K SLoC
litrs
: 解析和检查Rust字面量
litrs
提供了解析Rust字面量的功能,即Rust编程语言中表示固定值的令牌。例如:27
,"crab"
,bool
。这特别适用于进程宏,但也可以在进程宏之外使用。
为什么选择这个库?遗憾的是,编译器附带的 proc_macro
API 没有提供检查字面量的简单方法。主要有两个库用于此目的:syn
和 literalext
。后者已弃用。而且 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.0或MIT许可证的许可。除非您明确表示,否则您提交给本项目以供包含的任何有意贡献,根据Apache-2.0许可证定义,应作为上述双许可,不附加任何额外条款或条件。
依赖项
~72KB