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协议标识符的强大工具,通过类型安全的方式确保标识符的正确性,同时提供灵活的验证选项以适应不同场景需求。

回到顶部