寻求可自动验证跨主机接收数据的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
相关产品推荐
相关产品推荐

