serde_valid/validation/string/
max_length.rs1use crate::{traits::Length, MaxLengthError};
2
3pub trait ValidateMaxLength {
46 fn validate_max_length(&self, max_length: usize) -> Result<(), MaxLengthError>;
47}
48
49impl<T> ValidateMaxLength for T
50where
51 T: Length + ?Sized,
52{
53 fn validate_max_length(&self, max_length: usize) -> Result<(), MaxLengthError> {
54 if max_length >= self.length() {
55 Ok(())
56 } else {
57 Err(MaxLengthError::new(max_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_max_length_ascii_is_true() {
71 assert!(ValidateMaxLength::validate_max_length("abcde", 5).is_ok());
72 assert!(ValidateMaxLength::validate_max_length("abcde", 6).is_ok());
73 }
74
75 #[test]
76 fn test_validate_string_max_length_unicode_is_true() {
77 assert!(ValidateMaxLength::validate_max_length("a̐éö̲", 3).is_ok());
78 }
79
80 #[test]
81 fn test_validate_string_max_length_japanese_is_true() {
82 assert!(ValidateMaxLength::validate_max_length("あ堯", 2).is_ok());
83 }
84
85 #[test]
86 fn test_validate_string_max_length_emoji_is_true() {
87 assert!(ValidateMaxLength::validate_max_length("😍👺🙋🏽👨🎤👨👩👧👦", 5).is_ok());
88 }
89
90 #[test]
91 fn test_validate_string_max_length_string_type() {
92 assert!(ValidateMaxLength::validate_max_length(&String::from("abcde"), 5).is_ok());
93 }
94
95 #[test]
96 fn test_validate_string_max_length_cow_str_type() {
97 assert!(ValidateMaxLength::validate_max_length(&Cow::from("abcde"), 5).is_ok());
98 }
99
100 #[test]
101 fn test_validate_string_max_length_os_str_type() {
102 assert!(ValidateMaxLength::validate_max_length(OsStr::new("fo�o"), 4).is_ok());
103 }
104
105 #[test]
106 fn test_validate_string_max_length_os_string_type() {
107 assert!(ValidateMaxLength::validate_max_length(&OsString::from("fo�o"), 4).is_ok());
108 }
109
110 #[test]
111 fn test_validate_string_max_length_path_type() {
112 assert!(ValidateMaxLength::validate_max_length(&Path::new("./foo/bar.txt"), 13).is_ok());
113 }
114
115 #[test]
116 fn test_validate_string_max_length_path_buf_type() {
117 assert!(
118 ValidateMaxLength::validate_max_length(&PathBuf::from("./foo/bar.txt"), 13).is_ok()
119 );
120 }
121}