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宏扩展库,提供了高级过程宏和代码生成功能,可以显著简化重复性代码的编写。

主要功能

  1. 高级派生宏:扩展标准derive宏的功能
  2. 属性宏:提供更灵活的代码转换能力
  3. 代码生成:减少样板代码的编写

安装

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!("这是一个测试函数"),
        }
    }
}
回到顶部