You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求可自动验证跨主机接收数据的Rust Crate

自动化Rust结构体数据验证的可行方案

你可以使用**validator** crate来解决手动实现验证逻辑的繁琐问题,它支持通过派生宏自动生成验证代码,完全适配你需要检查浮点数有效性的场景。

具体实现步骤

1. 添加依赖

在Cargo.toml中引入带derive特性的validator:

[dependencies]
validator = { version = "0.16", features = ["derive"] }

2. 基于派生宏实现验证逻辑

不再需要手动为每个结构体编写validate方法,只需通过#[derive(Validate)]和字段属性定义验证规则即可:

use validator::Validate;

// 为Message1派生验证逻辑,指定浮数字段的验证规则
#[derive(Validate)]
struct Message1 {
    #[validate(custom = "is_finite")]
    a: f64,
    // 整数类型本身不会出现INF/NAN,无需额外验证
    b: i32,
    #[validate(custom = "is_finite")]
    c: f32,
}

// 为Message2的数组字段指定批量验证规则
#[derive(Validate)]
struct Message2 {
    #[validate(custom = "is_finite_array")]
    a: [f64; 100],
}

// 通用浮点数有限性验证函数
fn is_finite<T: std::primitive::Float>(value: &T) -> Result<(), String> {
    value.is_finite().then_some(()).ok_or_else(|| "浮点数包含INF/NAN,数据无效".into())
}

// 数组内浮点数批量验证函数
fn is_finite_array(arr: &[f64; 100]) -> Result<(), String> {
    arr.iter()
        .all(|num| num.is_finite())
        .then_some(())
        .ok_or_else(|| "数组中存在无效浮点数(INF/NAN)".into())
}

fn main() {
    // 测试有效数据
    let valid_msg1 = Message1 { a: 3.14, b: 10, c: 2.718 };
    assert!(valid_msg1.validate().is_ok());

    // 测试含INF的无效数据
    let invalid_msg1 = Message1 { a: f64::INFINITY, b: 10, c: 2.718 };
    assert!(invalid_msg1.validate().is_err());

    // 测试数组有效数据
    let mut valid_msg2 = Message2 { a: [0.0; 100] };
    assert!(valid_msg2.validate().is_ok());

    // 测试数组含NAN的无效数据
    valid_msg2.a[20] = f64::NAN;
    assert!(valid_msg2.validate().is_err());
}

补充说明

  • validator不仅支持自定义验证规则,还内置了大量常用验证逻辑(如数值范围、字符串长度、格式匹配等),能覆盖更多业务场景。
  • 如果你的消息是通过serde反序列化生成的,还可以结合validator的相关扩展,在反序列化完成后自动触发验证,进一步简化流程。

内容的提问来源于stack exchange,提问作者Harry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 17:25:11