Rust Base64标签化编解码宏库tagged-base64-macros的使用,支持类型安全的高效数据转换

Rust Base64标签化编解码宏库tagged-base64-macros的使用,支持类型安全的高效数据转换

安装

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

cargo add tagged-base64-macros

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

tagged-base64-macros = "0.4.0"

使用示例

这是一个完整的示例demo,展示如何使用tagged-base64-macros进行类型安全的Base64编码和解码:

use tagged_base64_macros::{tagged_base64_encode, tagged_base64_decode};

// 定义自定义类型
#[derive(Debug, PartialEq)]
struct MyData {
    id: u32,
    name: String,
}

// 为自定义类型实现编码和解码
impl MyData {
    fn encode(&self) -> String {
        format!("{}:{}", self.id, self.name)
    }
    
    fn decode(s: &str) -> Result<Self, String> {
        let parts: Vec<&str> = s.splitn(2, ':').collect();
        if parts.len() != 2 {
            return Err("Invalid format".to_string());
        }
        let id = parts[0].parse().map_err(|_| "Invalid ID".to_string())?;
        Ok(MyData {
            id,
            name: parts[1].to_string(),
        })
    }
}

// 使用宏进行编码
#[tagged_base64_encode]
fn encode_my_data(data: &MyData) -> String {
    data.encode()
}

// 使用宏进行解码
#[tagged_base64_decode]
fn decode_my_data(encoded: &str) -> Result<MyData, String> {
    MyData::decode(encoded)
}

fn main() {
    let data = MyData {
        id: 42,
        name: "Test".to_string(),
    };
    
    // 编码
    let encoded = encode_my_data(&data);
    println!("Encoded: {}", encoded);
    
    // 解码
    let decoded = decode_my_data(&encoded).unwrap();
    println!("Decoded: {:?}", decoded);
    
    assert_eq!(data, decoded);
}

完整示例代码

use tagged_base64_macros::{tagged_base64_encode, tagged_base64_decode};

// 自定义数据结构
#[derive(Debug, PartialEq)]
struct UserProfile {
    user_id: u64,
    username: String,
    is_admin: bool,
}

// 实现自定义编解码逻辑
impl UserProfile {
    // 将结构体编码为字符串
    fn to_string(&self) -> String {
        format!("{}|{}|{}", self.user_id, self.username, self.is_admin)
    }
    
    // 从字符串解码为结构体
    fn from_str(s: &str) -> Result<Self, String> {
        let parts: Vec<&str> = s.split('|').collect();
        if parts.len() != 3 {
            return Err("格式错误: 需要3个部分".to_string());
        }
        
        let user_id = parts[0].parse().map_err(|_| "无效的用户ID".to_string())?;
        let is_admin = parts[2].parse().map_err(|_| "无效的管理员标志".to_string())?;
        
        Ok(UserProfile {
            user_id,
            username: parts[1].to_string(),
            is_admin,
        })
    }
}

// 使用宏定义Base64编码函数
#[tagged_base64_encode]
fn encode_profile(profile: &UserProfile) -> String {
    profile.to_string()
}

// 使用宏定义Base64解码函数
#[tagged_base64_decode]
fn decode_profile(encoded: &str) -> Result<UserProfile, String> {
    UserProfile::from_str(encoded)
}

fn main() {
    // 创建示例数据
    let profile = UserProfile {
        user_id: 12345,
        username: "rustacean".to_string(),
        is_admin: true,
    };
    
    // 编码测试
    let encoded = encode_profile(&profile);
    println!("编码结果: {}", encoded);
    
    // 解码测试
    match decode_profile(&encoded) {
        Ok(decoded) => {
            println!("解码结果: {:?}", decoded);
            assert_eq!(profile, decoded);
        }
        Err(e) => eprintln!("解码错误: {}", e),
    }
}

特性

  1. 类型安全:通过宏系统确保编码和解码过程的类型安全
  2. 高效转换:优化的Base64编解码实现
  3. 自定义支持:可以轻松为自定义类型实现编解码
  4. 错误处理:提供清晰的错误处理机制

许可证

MIT License


1 回复

Rust Base64标签化编解码宏库tagged-base64-macros的使用

简介

tagged-base64-macros是一个Rust宏库,提供了类型安全的Base64编码/解码功能。它通过宏为不同类型的数据生成特定的编解码实现,确保在编译期就能捕获类型不匹配的错误,同时保持高效的运行时性能。

主要特性

  • 类型安全的Base64编解码
  • 编译期错误检查
  • 零成本抽象
  • 支持自定义标签
  • 高效的数据转换

安装

在Cargo.toml中添加依赖:

[dependencies]
tagged-base64-macros = "0.1"

完整示例

下面是一个完整的使用示例,展示了基本用法、自定义标签、错误处理和组合使用:

use tagged_base64_macros::{tagged_base64, impl_tagged_base64};

// 1. 基本用法 - 用户ID类型
#[tagged_base64("USER")]
struct UserId([u8; 16]);

// 2. 自定义标签 - API密钥类型
#[tagged_base64("API_KEY")]
struct ApiKey(String);

// 3. 为现有类型实现标签化Base64
struct SessionToken(String);
impl_tagged_base64!("SESSION", SessionToken);

// 4. 组合使用 - 请求结构体
#[tagged_base64("REQUEST")]
struct Request {
    user_id: UserId,
    action: String,
}

fn main() {
    // 1. 基本用法示例
    let user_id = UserId([0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 
                          0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF]);
    let encoded_user = user_id.to_tagged_base64();
    println!("Encoded User ID: {}", encoded_user);
    
    let decoded_user = UserId::from_tagged_base64(&encoded_user).unwrap();
    assert_eq!(user_id.0, decoded_user.0);

    // 2. 自定义标签示例
    let api_key = ApiKey("my-secret-key-123".to_string());
    let encoded_key = api_key.to_tagged_base64();
    println!("Encoded API Key: {}", encoded_key);
    
    let decoded_key = ApiKey::from_tagged_base64(&encoded_key).unwrap();
    assert_eq!(api_key.0, decoded_key.0);

    // 3. 现有类型实现示例
    let token = SessionToken("random-session-token".to_string());
    let encoded_token = token.to_tagged_base64();
    println!("Encoded Session Token: {}", encoded_token);

    // 4. 组合使用示例
    let request = Request {
        user_id: UserId([0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
                         0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x00]),
        action: "create".to_string(),
    };
    // 注意: 需要为Request实现Serialize/Deserialize才能完整编解码
    
    // 5. 错误处理示例
    let invalid_input = "WRONG_TAG:bm90LXZhbGlk";
    match UserId::from_tagged_base64(invalid_input) {
        Ok(_) => println!("Valid ID"),
        Err(e) => println!("Error decoding: {}", e),
    }
}

注意事项

  1. 标签是大小写敏感的
  2. 编码后的字符串格式为"TAG:base64data"
  3. 解码时会严格检查标签匹配
  4. 底层使用Rust标准库的Base64实现

这个库特别适合需要确保数据完整性和类型安全的场景,如API通信、配置存储等。通过编译期检查避免了运行时因类型不匹配导致的错误。

回到顶部