Rust宏派生库fax_derive的使用:简化代码生成与自定义派生宏开发

Rust宏派生库fax_derive的使用:简化代码生成与自定义派生宏开发

安装

在项目目录中运行以下Cargo命令:

cargo add fax_derive

或者在Cargo.toml中添加以下行:

fax_derive = "0.1.0"

基本使用

fax_derive是一个Rust宏派生库,主要用于简化代码生成和自定义派生宏的开发。它通常用于PDF处理相关的开发中。

示例Demo

以下是使用fax_derive的完整示例:

// 首先需要在Cargo.toml中添加依赖
// fax_derive = "0.1.0"

// 引入必要的库
use fax_derive::FaxDerive;

// 定义一个结构体并使用FaxDerive派生宏
#[derive(FaxDerive)]
struct PdfDocument {
    version: String,
    pages: Vec<PdfPage>,
}

// 另一个结构体
#[derive(FaxDerive)]
struct PdfPage {
    number: u32,
    content: Vec<u8>,
}

fn main() {
    // 使用自动生成的代码
    let doc = PdfDocument {
        version: "1.7".to_string(),
        pages: vec![
            PdfPage {
                number: 1,
                content: vec![1, 2, 3],
            },
            PdfPage {
                number: 2,
                content: vec![4, 5, 6],
            },
        ],
    };
    
    // 这里可以使用FaxDerive自动生成的方法
    println!("PDF version: {}", doc.version);
    println!("Total pages: {}", doc.pages.len());
}

完整示例代码

// 引入必要的库
use fax_derive::FaxDerive;

// PDF文档结构体
#[derive(FaxDerive)]
struct PdfDocument {
    // PDF版本号
    version: String,
    // 包含的页面列表
    pages: Vec<PdfPage>,
}

// PDF页面结构体
#[derive(FaxDerive)]
struct PdfPage {
    // 页码
    number: u32,
    // 页面内容
    content: Vec<u8>,
}

fn main() {
    // 创建PDF文档实例
    let doc = PdfDocument {
        version: "1.7".to_string(),
        pages: vec![
            PdfPage {
                number: 1,
                content: vec![1, 2, 3],
            },
            PdfPage {
                number: 2,
                content: vec![4, 5, 6],
            },
        ],
    };
    
    // 使用FaxDerive自动生成的代码
    println!("PDF版本: {}", doc.version);
    println!("总页数: {}", doc.pages.len());
    
    // 访问页面内容
    for page in doc.pages {
        println!("第{}页内容长度: {}", page.number, page.content.len());
    }
}

许可证

该项目使用MIT许可证。


1 回复

以下是基于提供内容整理的fax_derive完整示例demo:

内容中提供的示例回顾

基本用法

// 示例1: 基础派生
#[derive(FaxDerive)]
struct MyStruct {
    field1: i32,
    field2: String,
}

// 示例2: 自定义trait实现
#[fax_derive(
    Debug, 
    Clone,
    custom_impl = "impl MyTrait for #name { fn method(&self) { /* 实现 */ } }"
)]
struct CustomStruct {
    value: String
}

// 示例3: 自动生成Display实现
#[fax_derive(Display(format = "Struct({field1}, {field2})"))]
struct FormattedStruct {
    field1: i32,
    field2: String
}

高级用法

// 示例4: 组合派生+默认实现
#[fax_derive(
    Debug, Serialize, Deserialize,
    custom_impl = "impl Default for #name {
        fn default() -> Self { Self { id: 0, name: \"default\".to_string() } }
    }"
)]
struct User {
    id: u64,
    name: String
}

// 示例5: 条件编译
#[fax_derive(
    Debug,
    #[cfg(feature = "serialize")] Serialize,
    #[cfg(feature = "deserialize")] Deserialize
)]
struct Config {
    setting1: bool,
    setting2: i32
}

// 示例6: 构建器模式
#[fax_derive(
    Builder,
    custom_impl = "impl #name { pub fn builder() -> #nameBuilder { #nameBuilder::default() } }"
)]
struct Product {
    #[builder(default = "100")] 
    id: u64,
    #[builder(default = r#""Unnamed".to_string()"#)]
    name: String
}

完整示例Demo

// Cargo.toml
/*
[dependencies]
fax_derive = "0.1.0"
serde = { version = "1.0", features = ["derive"], optional = true }
*/

use fax_derive::FaxDerive;

// 1. 基本结构体派生
#[derive(FaxDerive)]
struct Person {
    name: String,
    age: u8,
}

// 2. 自定义序列化配置
#[fax_derive(
    Debug,
    Clone,
    #[cfg(feature = "serde")]
    Serialize,
    #[cfg(feature = "serde")] 
    Deserialize,
    Display(format = "Person: {name} ({age} years old)")
)]
struct DisplayPerson {
    name: String,
    age: u8,
}

// 3. 带构建器的复杂结构
#[fax_derive(
    Builder,
    custom_impl = r#"
        impl #name {
            pub fn new() -> #nameBuilder {
                #nameBuilder::default()
            }
        }
    "#
)]
struct InventoryItem {
    #[builder(default = "0")]
    id: u64,
    #[builder(default = r#""Unspecified".to_string()"#)]
    name: String,
    #[builder(default = "0.0")]
    price: f64,
    #[builder(default = "false")]
    in_stock: bool,
}

// 4. 自定义派生宏开发
mod my_macros {
    use fax_derive::macro_export;
    
    #[macro_export]
    macro_rules! json_derive {
        ($item:item) => {
            fax_derive::generate_derive! {
                $item,
                traits = [Debug, Clone],
                custom_code = {
                    impl JsonConvert for #name {
                        fn to_json(&self) -> String {
                            serde_json::to_string(self).unwrap()
                        }
                    }
                }
            }
        }
    }
}

// 使用自定义宏
#[derive(Debug)]
struct MyTrait;

#[my_macros::json_derive]
struct JsonData {
    uid: String,
    value: i32,
}

fn main() {
    // 测试生成的代码
    let person = DisplayPerson {
        name: "Alice".into(),
        age: 30
    };
    println!("{}", person);  // 使用自动生成的Display实现
    
    let item = InventoryItem::new()
        .id(42)
        .name("Rust Book".into())
        .price(39.99)
        .build();
    println!("{:?}", item);  // 使用自动生成的Debug实现
}

关键功能说明

  1. 自动trait实现:通过#[derive(FaxDerive)]自动生成常见trait
  2. 条件编译:通过#[cfg]实现按需生成代码
  3. 构建器模式:通过Builder派生自动生成流畅接口
  4. 自定义代码注入:使用custom_impl直接插入Rust代码
  5. 宏开发支持:通过generate_derive!宏简化自定义派生宏创建

实际应用建议

  1. 使用cargo expand查看生成的代码
  2. 在复杂场景中组合多个派生属性
  3. 通过feature flags控制不同环境下的代码生成
  4. 对性能敏感类型谨慎使用重型派生

这个库特别适合需要大量相似结构体的项目,能显著减少重复代码量。

回到顶部