serde_valid/validation/string/
min_length.rs1use crate::{traits::Length, MinLengthError};
2
3pub trait ValidateMinLength {
46 fn validate_min_length(&self, min_length: usize) -> Result<(), MinLengthError>;
47}
48
49impl<T> ValidateMinLength for T
50where
51 T: Length + ?Sized,
52{
53 fn validate_min_length(&self, min_length: usize) -> Result<(), MinLengthError> {
54 if min_length <= self.length() {
55 Ok(())
56 } else {
57 Err(MinLengthError::new(min_length))
58 }
59 }
60}
61
62#[cfg(test)]
63mod tests {
64 use super::*;
65 use std::borrow::Cow;
66 use std::ffi::{OsStr, OsString};
67 use std::path::{Path, PathBuf};
68
69 #[test]
70 fn test_validate_string_min_length_ascii_is_true() {
71 assert!(ValidateMinLength::validate_min_length(&"abcde", 5).is_ok());
72 assert!(ValidateMinLength::validate_min_length(&"abcde", 4).is_ok());
73 }
74
75 #[test]
76 fn test_validate_string_min_length_unicode_is_true() {
77 assert!(ValidateMinLength::validate_min_length(&"a̐éö̲", 3).is_ok());
78 }
79
80 #[test]
81 fn test_validate_string_min_length_japanese_is_true() {
82 assert!(ValidateMinLength::validate_min_length(&"あ堯", 2).is_ok());
83 }
84
85 #[test]
86 fn test_validate_string_min_length_emoji_is_true() {
87 assert!(ValidateMinLength::validate_min_length(&"😍👺🙋🏽👨🎤👨👩👧👦", 5).is_ok());
88 }
89
90 #[test]
91 fn test_validate_string_min_length_string_type() {
92 assert!(ValidateMinLength::validate_min_length(&String::from("abcde"), 5).is_ok());
93 }
94
95 #[test]
96 fn test_validate_string_min_length_cow_str_type() {
97 assert!(ValidateMinLength::validate_min_length(&Cow::from("abcde"), 5).is_ok());
98 }
99
100 #[test]
101 fn test_validate_string_min_length_os_str_type() {
102 assert!(ValidateMinLength::validate_min_length(&OsStr::new("fo�o"), 4).is_ok());
103 }
104
105 #[test]
106 fn test_validate_string_min_length_os_string_type() {
107 assert!(ValidateMinLength::validate_min_length(&OsString::from("fo�o"), 4).is_ok());
108 }
109
110 #[test]
111 fn test_validate_string_min_length_path_type() {
112 assert!(ValidateMinLength::validate_min_length(&Path::new("./foo/bar.txt"), 13).is_ok());
113 }
114
115 #[test]
116 fn test_validate_string_min_length_path_buf_type() {
117 assert!(
118 ValidateMinLength::validate_min_length(&PathBuf::from("./foo/bar.txt"), 13).is_ok()
119 );
120 }
121}