Rust矩阵标识符验证库ruma-identifiers-validation的使用:高效处理Matrix协议中的房间ID、用户ID等标识符验证
Rust矩阵标识符验证库ruma-identifiers-validation的使用:高效处理Matrix协议中的房间ID、用户ID等标识符验证
安装
在项目目录中运行以下Cargo命令:
cargo add ruma-identifiers-validation
或者在Cargo.toml中添加以下行:
ruma-identifiers-validation = "0.10.1"
示例代码
以下是使用ruma-identifiers-validation库验证Matrix协议中房间ID和用户ID的完整示例:
use ruma_identifiers_validation::{RoomIdValidation, UserIdValidation};
fn main() {
// 验证用户ID
let user_id = "@alice:matrix.org";
match UserIdValidation::validate(user_id) {
Ok(_) => println!("用户ID {} 是有效的", user_id),
Err(e) => println!("用户ID验证失败: {}", e),
}
// 验证房间ID
let room_id = "!room123:matrix.org";
match RoomIdValidation::validate(room_id) {
Ok(_) => println!("房间ID {} 是有效的", room_id),
Err(e) => println!("房间ID验证失败: {}", e),
}
// 更复杂的示例 - 批量验证
let identifiers = vec![
"@bob:example.com",
"!invalid-room",
"@invalid:user:domain",
"!room456:example.com",
];
for id in identifiers {
if id.starts_with('@') {
match UserIdValidation::validate(id) {
Ok(_) => println!("✅ 有效的用户ID: {}", id),
Err(_) => println!("❌ 无效的用户ID: {}", id),
}
} else if id.starts_with('!') {
match RoomIdValidation::validate(id) {
Ok(_) => println!("✅ 有效的房间ID: {}", id),
Err(_) => println!("❌ 无效的房间ID: {}", id),
}
} else {
println!("⚠️ 未知标识符格式: {}", id);
}
}
}
完整示例代码
下面是一个更完整的示例,展示如何在实际应用中使用ruma-identifiers-validation库:
use ruma_identifiers_validation::{RoomIdValidation, UserIdValidation};
use std::io;
fn main() {
println!("Matrix标识符验证工具");
println!("请选择操作:");
println!("1. 验证单个用户ID");
println!("2. 验证单个房间ID");
println!("3. 批量验证标识符");
println!("4. 退出");
loop {
let mut choice = String::new();
io::stdin()
.read_line(&mut choice)
.expect("读取输入失败");
match choice.trim() {
"1" => validate_user_id(),
"2" => validate_room_id(),
"3" => batch_validate(),
"4" => break,
_ => println!("无效的选择,请重新输入"),
}
}
}
fn validate_user_id() {
println!("请输入要验证的用户ID (格式: @username:domain.com):");
let mut user_id = String::new();
io::stdin()
.read_line(&mut user_id)
.expect("读取输入失败");
let user_id = user_id.trim();
match UserIdValidation::validate(user_id) {
Ok(_) => println!("✅ 用户ID {} 有效", user_id),
Err(e) => println!("❌ 验证失败: {}", e),
}
}
fn validate_room_id() {
println!("请输入要验证的房间ID (格式: !roomid:domain.com):");
let mut room_id = String::new();
io::stdin()
.read_line(&mut room_id)
.expect("读取输入失败");
let room_id = room_id.trim();
match RoomIdValidation::validate(room_id) {
Ok(_) => println!("✅ 房间ID {} 有效", room_id),
Err(e) => println!("❌ 验证失败: {}", e),
}
}
fn batch_validate() {
println!("请输入要验证的标识符列表,用逗号分隔:");
let mut input = String::new();
io::stdin()
.read_line(&mut input)
.expect("读取输入失败");
let identifiers: Vec<&str> = input.split(',').map(|s| s.trim()).collect();
println!("验证结果:");
for id in identifiers {
if id.starts_with('@') {
match UserIdValidation::validate(id) {
Ok(_) => println!("✅ 有效的用户ID: {}", id),
Err(_) => println!("❌ 无效的用户ID: {}", id),
}
} else if id.starts_with('!') {
match RoomIdValidation::validate(id) {
Ok(_) => println!("✅ 有效的房间ID: {}", id),
Err(_) => println!("❌ 无效的房间ID: {}", id),
}
} else {
println!("⚠️ 未知标识符格式: {}", id);
}
}
}
功能说明
ruma-identifiers-validation库提供了以下功能:
- 验证Matrix协议中的用户ID格式(如
@user:domain.com
) - 验证Matrix协议中的房间ID格式(如
!room123:domain.com
) - 支持本地和服务器部分验证
- 提供详细的错误信息
许可
该库采用MIT许可证发布。
1 回复
Rust矩阵标识符验证库ruma-identifiers-validation使用指南
介绍
ruma-identifiers-validation是Ruma项目的一部分,专门用于验证Matrix协议中的各种标识符,如房间ID、用户ID、事件ID等。这个库提供了高效、类型安全的验证功能,是开发Matrix客户端或服务器的理想选择。
主要功能
- 验证Matrix协议中的各种标识符格式
- 提供类型安全的标识符表示
- 支持解析和构造标识符
- 符合Matrix协议规范
安装
在Cargo.toml中添加依赖:
[dependencies]
ruma-identifiers-validation = "0.8.0"
完整示例代码
// 引入所有需要的模块
use ruma_identifiers_validation::{
user_id::{validate as validate_user, validate_with_options, ValidationOptions},
room_id::validate as validate_room,
event_id::validate as validate_event,
RoomId, UserId
};
fn main() {
// 1. 验证用户ID
let user_id = "@alice:example.com";
match validate_user(user_id) {
Ok(_) => println!("有效的用户ID"),
Err(e) => println!("无效的用户ID: {}", e),
}
// 2. 验证房间ID
let room_id = "!roomid:example.com";
match validate_room(room_id) {
Ok(_) => println!("有效的房间ID"),
Err(e) => println!("无效的房间ID: {}", e),
}
// 3. 验证事件ID
let event_id = "$eventid:example.com";
match validate_event(event_id) {
Ok(_) => println!("有效的事件ID"),
Err(e) => println!("无效的事件ID: {}", e),
}
// 4. 使用强类型标识符
match UserId::parse("@bob:example.org") {
Ok(user_id) => {
println!("用户: {}", user_id);
println!("服务器部分: {}", user_id.server_name());
}
Err(e) => println!("错误: {}", e),
}
match RoomId::parse("!general:example.org") {
Ok(room_id) => {
println!("房间: {}", room_id);
println!("服务器部分: {}", room_id.server_name());
}
Err(e) => println!("错误: {}", e),
}
// 5. 构造新的标识符
let new_user_id = UserId::new("example.org").unwrap();
println!("新用户ID: {}", new_user_id);
let new_room_id = RoomId::new("example.org").unwrap();
println!("新房间ID: {}", new_room_id);
// 高级用法 - 自定义验证选项
let options = ValidationOptions {
require_explicit_port: false,
allow_ip_literals: true,
};
let ip_user_id = "@alice:127.0.0.1";
match validate_with_options(ip_user_id, &options) {
Ok(_) => println!("有效的IP地址用户ID"),
Err(e) => println!("无效的用户ID: {}", e),
}
// 处理历史标识符格式
let legacy_user_id = "@alice:example.com:8448"; // 包含端口的旧格式
let legacy_options = ValidationOptions {
require_explicit_port: true, // 允许端口
allow_ip_literals: true,
};
match validate_with_options(legacy_user_id, &legacy_options) {
Ok(_) => println!("有效的旧格式用户ID"),
Err(e) => println!("无效的用户ID: {}", e),
}
// 错误处理示例
let invalid_user_id = "alice:example.com"; // 缺少@前缀
match validate_user(invalid_user_id) {
Ok(_) => println!("有效的用户ID"),
Err(e) => println!("错误详情: {}", e),
}
}
性能考虑
ruma-identifiers-validation经过优化,适合高性能场景:
- 使用零拷贝解析
- 最小化内存分配
- 提前验证避免后续处理错误
错误处理
库提供了详细的错误信息,帮助开发者快速定位问题。
ruma-identifiers-validation是处理Matrix协议标识符的强大工具,通过类型安全的方式确保标识符的正确性,同时提供灵活的验证选项以适应不同场景需求。