rust的nutyp验证和validator验证数据的方法

news/2024/9/28 20:54:30 标签: rust

使用nutype验证

Cargo.toml

rust">nutype = { version = "0.5.0", features = ["serde","regex"] }
regex = "1"
thiserror = "1"

modules.rs

rust">#[nutype(

sanitize(trim, lowercase),

validate(not_empty, len_char_min = 3, len_char_max = 30),

derive(AsRef, Clone, Debug, Serialize, Deserialize, PartialEq)

)]

// AsRef表示可以单独访问username,clone复制

pub struct Username(String);

  

// #[nutype(

// validate(not_empty, len_char_min = 8),

// derive(AsRef, Clone, Serialize, Deserialize, PartialEq)

// )]

#[nutype(validate(with = password_regex, error = ErrorMessage),derive(Debug, PartialEq),)]

pub struct Password(String);

  
// 正则匹配手机号
static PHONE_NUMBER_REGEX: LazyLock<Regex> = LazyLock::new(||

Regex::new("^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$"

).unwrap());
// 直接使用正则表达式
#[nutype(validate(regex = PHONE_NUMBER_REGEX))]
pub struct PhoneNumber(String);

// 自定义方法
#[nutype(validate(with = email_regex, error = ErrorMessage))]
pub struct EmailNumber(String);
// 正则匹配邮箱号
static EMAIL_NUMBER_REGEX: LazyLock<Regex> = LazyLock::new(||

Regex::new("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"

).unwrap());
pub fn email_regex(name: &str) -> Result<(), ErrorMessage> {
	match EMAIL_NUMBER_REGEX.captures(name){
		// 这里可以返回自定义的错误类型
		None => Err(ErrorMessage::InvalidEmailFormat),
		Some(_) => Ok(())
		
	}
}

使用validator验证

Cargo.toml

rust">validator = {version = "0.18.1",features = ["derive"]}
lazy_static = "1.5.0"

modules.rs

#[derive(Validate, Debug, Default, Clone, Serialize, Deserialize)]

pub struct RegisterUserDto {

#[validate(length(min = 1, message = "姓名为必填项"))]

pub name: String,
#[validate(length(min = 0, message = "用户名不是必填项"))]
pub username: String,

#[validate(

length(min = 1, message = "电子邮件是必需的"),

email(message = "电子邮件无效")

)]

pub email: String,

  

#[validate(

length(min = 1, message = "手机号是必需的"),

)]

pub phone: String,

  
  

#[validate(
length(min = 6, message = "密码必须至少为 6 个字符")
)]

pub password: String,

  

#[validate(

length(min = 1, message = "需要确认密码"),

must_match(other = "password", message="密码不匹配")

)]

#[serde(rename = "passwordConfirm")]
pub password_confirm: String,

}
//validator自定义方法是无法使用自定义错误类型的,必须使用crate的,具体看validator crate

http://www.niftyadmin.cn/n/5681829.html

相关文章

统一建模语言(UML)在软件研发过程中常用图接受:类图、用例图、时序图、状态图、活动图、流程图、顺序图

UML具有许多不同类型的图表&#xff0c;包括&#xff1a; 静态图&#xff1a;用例图、类图、对象图、组件图、部署图动态图&#xff1a;活动图、状态图、时序图&#xff08;又叫顺序图、序列图&#xff09;、协作图 软件工程&#xff08;软件工程中的各种图一般用于以下三个阶段…

WPF之UI进阶--完整了解wpf的控件和布局容器及应用

前面三篇有关WPF的基础介绍&#xff0c;分别介绍了wpf与winform的异同&#xff0c;wpf的事件生成和使用以及数据绑定。但我们还缺乏一副好的“皮囊”&#xff0c;所以从这篇开始我们来开始学习wpf的UI相关的内容&#xff0c;首当其冲的就是布局容器。 其实我们知道&#xff0c;…

深度学习(入门)03:监督学习

1、监督学习简介 监督学习&#xff08;Supervised Learning&#xff09;是一种重要的机器学习方法&#xff0c;它的目标是通过“已知输入特征”来预测对应的标签。在监督学习中&#xff0c;每一个“特征-标签”对被称为样本&#xff08;example&#xff09;&#xff0c;这些样…

uniapp踩坑 tabbar页面数据刷新了但视图没有更新

问题描述&#xff1a; 有个uni-data-checkbox组件&#xff0c;两个选项&#xff1a;选项1和选项2&#xff08;对应的value值分别为1和2&#xff09;&#xff0c;v-model绑定属性名为value 两个tabbar页面&#xff1a;tab1&#xff0c;tab2。 tab1页面有个逻辑是在onShow中刷新v…

Leetcode 3298. Count Substrings That Can Be Rearranged to Contain a String II

Leetcode 3298. Count Substrings That Can Be Rearranged to Contain a String II 1. 解题思路2. 代码实现 题目链接&#xff1a;3298. Count Substrings That Can Be Rearranged to Contain a String II 1. 解题思路 这一题和题目3297本质上就是一道题目&#xff0c;然后就…

【嵌入式软件-数据结构与算法】01-数据结构

摘录于老师的教学课程~~(*๓╰╯๓)~~内含链表、队列、栈、循环队列等详细介绍~~ 基础知识系列 有空再继续更~~~ 目录 【链表】 一、单链表 1、存储结构&#xff1a;带头结点的单链表 2、单链表结点类型的定义 3、创建单链表 1&#xff09;头插法 2&#xff09;尾插法 …

北斗三号多模对讲机TD70:公专网融合、数模一体、音视频调度,推动应急通信效能升级

随着国家对应急通信和精准定位技术的重视程度不断提高&#xff0c;相关技术和设备的研发与应用也得到了迅猛发展。特别是在边防巡逻、林业巡防、海上作业等领域&#xff0c;通信设备的可靠性和功能性直接关系到人员的生命安全和任务的成功完成。 近年来&#xff0c;我国政府高度…

C#基础:掌握控制流语句,构建灵活的程序逻辑

在C#中&#xff0c;控制流语句是用来控制程序执行流程的重要部分。它们允许你根据条件执行不同的代码块&#xff0c;或者重复执行某些代码块直到满足特定条件。下面是一些基本的C#控制流语句&#xff1a; 1. 条件语句 if 语句 if 语句用于在条件为真时执行一段代码。 int n…