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),
}
}
特性
- 类型安全:通过宏系统确保编码和解码过程的类型安全
- 高效转换:优化的Base64编解码实现
- 自定义支持:可以轻松为自定义类型实现编解码
- 错误处理:提供清晰的错误处理机制
许可证
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),
}
}
注意事项
- 标签是大小写敏感的
- 编码后的字符串格式为
"TAG:base64data"
- 解码时会严格检查标签匹配
- 底层使用Rust标准库的Base64实现
这个库特别适合需要确保数据完整性和类型安全的场景,如API通信、配置存储等。通过编译期检查避免了运行时因类型不匹配导致的错误。