Rust宏扩展库deluxe-macros的使用,提供高级过程宏和代码生成功能
Rust宏扩展库deluxe-macros的使用,提供高级过程宏和代码生成功能
deluxe-macros是一个Rust宏扩展库,提供高级过程宏和代码生成功能。它可以帮助开发者简化代码,提供更强大的元编程能力。
安装
在项目目录中运行以下Cargo命令:
cargo add deluxe-macros
或者在你的Cargo.toml中添加以下行:
deluxe-macros = "0.5.0"
功能示例
deluxe-macros提供了多种高级宏功能,以下是一个完整的使用示例:
use deluxe_macros::ParseAttributes;
#[derive(ParseAttributes)]
#[deluxe(default)] // 使用默认属性解析
struct MyConfig {
#[deluxe(default = 42)] // 设置默认值
count: u32,
#[deluxe(default = "hello".to_string())] // 复杂默认值表达式
message: String,
#[deluxe(default = true)] // 布尔值默认值
enabled: bool,
#[deluxe(default)] // 使用类型的默认实现
timeout: std::time::Duration,
}
fn main() {
// 使用默认值创建实例
let config = MyConfig::default();
println!("Count: {}", config.count); // 输出: 42
println!("Message: {}", config.message); // 输出: hello
println!("Enabled: {}", config.enabled); // 输出: true
println!("Timeout: {:?}", config.timeout); // 输出: 0ns
}
完整示例代码
deluxe-macros还支持更复杂的自定义属性解析和代码生成。下面是一个完整的示例,展示如何自定义解析逻辑:
use deluxe_macros::{ParseAttributes, ParseMetaItem};
use syn::parse::Parse;
use proc_macro2::TokenStream;
// 自定义元项类型
struct Range {
min: i64,
max: i64,
}
impl Parse for Range {
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
let content;
syn::parenthesized!(content in input);
let min: syn::LitInt = content.parse()?;
let _: syn::Token![,] = content.parse()?;
let max: syn::LitInt = content.parse()?;
Ok(Self {
min: min.base10_parse()?,
max: max.base10_parse()?,
})
}
}
#[derive(ParseAttributes)]
struct ValidatedConfig {
#[deluxe(parse_with = "Range::parse", default = "Range { min: 0, max: 100 }")]
range: Range,
#[deluxe(rename = "user_name")] // 支持属性重命名
name: String,
#[deluxe(skip)] // 跳过某个字段的解析
internal_id: u64,
}
fn main() {
// 模拟从属性解析
let config = ValidatedConfig {
range: Range { min: 10, max: 20 },
name: "example".to_string(),
internal_id: 0,
};
println!("Range: {}-{}", config.range.min, config.range.max);
println!("Name: {}", config.name);
}
deluxe-macros提供了强大的属性解析和代码生成能力,可以显著简化Rust中元编程和配置处理的复杂度。通过自定义解析逻辑和灵活的默认值设置,开发者可以创建更清晰、更可维护的代码结构。
完整示例demo
// 示例1:基本使用
use deluxe_macros::ParseAttributes;
#[derive(ParseAttributes, Debug)]
#[deluxe(default)]
struct BasicConfig {
#[deluxe(default = 100)]
limit: usize,
#[deluxe(default = "127.0.0.1".to_string())]
host: String,
#[deluxe(default = vec![1, 2, 3])]
values: Vec<i32>,
}
// 示例2:自定义解析器
use syn::{parse::Parse, parse_macro_input};
use proc_macro2::TokenStream;
struct PortRange {
start: u16,
end: u16,
}
impl Parse for PortRange {
fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
let content;
syn::parenthesized!(content in input);
let start: syn::LitInt = content.parse()?;
let _: syn::Token![,] = content.parse()?;
let end: syn::LitInt = content.parse()?;
Ok(Self {
start: start.base10_parse()?,
end: end.base10_parse()?,
})
}
}
#[derive(ParseAttributes, Debug)]
struct NetworkConfig {
#[deluxe(parse_with = "PortRange::parse", default = "PortRange { start: 8000, end: 9000 }")]
ports: PortRange,
#[deluxe(default = false)]
ssl_enabled: bool,
#[deluxe(rename = "timeout_ms")]
timeout: u64,
}
fn main() {
// 基本使用示例
let basic = BasicConfig::default();
println!("BasicConfig: {:?}", basic);
// 自定义解析器示例
let network = NetworkConfig {
ports: PortRange { start: 8080, end: 8090 },
ssl_enabled: true,
timeout: 5000,
};
println!("NetworkConfig: {:?}", network);
}
1 回复
deluxe-macros: Rust高级过程宏和代码生成库
deluxe-macros
是一个功能强大的Rust宏扩展库,提供了高级过程宏和代码生成功能,可以显著简化重复性代码的编写。
主要功能
- 高级派生宏:扩展标准
derive
宏的功能 - 属性宏:提供更灵活的代码转换能力
- 代码生成:减少样板代码的编写
安装
在Cargo.toml
中添加依赖:
[dependencies]
deluxe = "0.8.0"
使用示例
1. 扩展的派生宏
use deluxe::ParseAttributes;
#[derive(ParseAttributes)]
struct MyStruct {
#[deluxe(default = 42)] // 提供默认值
field1: i32,
#[deluxe(rename = "another_name")] // 字段重命名
field2: String,
}
2. 自定义属性处理
use deluxe::{ParseAttributes, ParseMetaItem};
#[derive(ParseAttributes)]
#[deluxe(allow_unknown_fields)] // 允许未知字段
struct Config {
#[deluxe(default)]
timeout: u64,
#[deluxe(flatten)] // 展开嵌套结构
nested: NestedConfig,
}
#[derive(ParseAttributes)]
struct NestedConfig {
path: String,
}
3. 代码生成宏
use deluxe::ExtractAttributes;
#[derive(ExtractAttributes)]
#[deluxe(attributes(my_attr))] // 指定要提取的属性
enum MyAttr {
#[deluxe(expect = "value")] // 期望特定格式
Value(String),
Flag, // 标志属性
}
// 使用自定义属性
#[my_attr(Flag)]
#[my_attr(value = "example")]
fn my_function() {}
4. 高级解析功能
use deluxe::{ParseAttributes, ParseMetaItem};
#[derive(ParseAttributes)]
struct Options {
#[deluxe(parse_meta_item)] // 自定义解析逻辑
mode: Mode,
}
#[derive(ParseMetaItem)]
enum Mode {
Fast,
Slow,
Custom { speed: u32 },
}
高级用法
条件编译支持
#[derive极速模式
Slow, // 慢速模式
Custom { speed: u32 }, // 自定义速度
}
完整示例:配置解析系统
use deluxe::{ParseAttributes, ParseMetaItem};
use serde::{Serialize, Deserialize};
// 主配置结构
#[derive(ParseAttributes, Serialize, Deserialize, Debug)]
#[deluxe(allow_unknown_fields)] // 允许未知配置字段
struct AppConfig {
#[deluxe(default = "localhost")] // 默认主机名
host: String,
#[deluxe(default = 8080)] // 默认端口
port: u16,
#[deluxe(flatten)] // 展开日志配置
logging: LogConfig,
#[deluxe(nested)] // 嵌套数据库配置
database: DbConfig,
#[deluxe(parse_meta_item)] // 自定义解析运行模式
mode: RunMode,
}
// 日志配置
#[derive(ParseAttributes, Serialize, Deserialize, Debug)]
struct LogConfig {
#[deluxe(default = "info")] // 默认日志级别
level: String,
#[deluxe(default = "app.log")] // 默认日志文件
file: String,
#[deluxe(default = true)] // 默认启用控制台输出
console: bool,
}
// 数据库配置
#[derive(ParseAttributes, Serialize, Deserialize, Debug)]
struct DbConfig {
url: String,
#[deluxe(default = 5)] // 默认连接池大小
pool_size: u32,
#[deluxe(default, feature = "redis")] // 条件编译的Redis配置
redis_url: Option<String>,
}
// 运行模式枚举
#[derive(ParseMetaItem, Serialize, Deserialize, Debug)]
enum RunMode {
Development, // 开发模式
Production, // 生产模式
Testing, // 测试模式
}
fn main() {
// 示例配置
let config = r#"
host = "example.com"
port = 9090
logging.level = "debug"
database.url = "postgres://user:pass@localhost/db"
mode = "Production"
"#;
// 解析TOML配置
let app_config: AppConfig = toml::from_str(config).unwrap();
println!("{:#?}", app_config);
}
完整示例:自定义属性处理
use deluxe::ExtractAttributes;
// 定义可提取的属性
#[derive(ExtractAttributes)]
#[deluxe(attributes(my_macro))] // 指定要处理的属性名
enum MyMacroAttr {
#[deluxe(expect = "desc")] // 期望desc="..."格式
Description(String),
#[deluxe(expect = "author")] // 期望author="..."格式
Author(String),
#[deluxe(expect = "version")] // 期望version=...格式
Version(u32),
Async, // 标志属性
Test, // 标志属性
}
// 使用自定义属性
#[my_macro(
desc = "这是一个示例函数",
author = "Rust开发者",
version = 1,
async,
test
)]
fn sample_function() {
// 函数实现
}
// 宏处理器实现
fn process_attributes(attrs: Vec<MyMacroAttr>) {
for attr in attrs {
match attr {
MyMacroAttr::Description(desc) => println!("描述: {}", desc),
MyMacroAttr::Author(author) => println!("作者: {}", author),
MyMacroAttr::Version(ver) => println!("版本: {}", ver),
MyMacroAttr::Async => println!("这是一个异步函数"),
MyMacroAttr::Test => println!("这是一个测试函数"),
}
}
}