validator/validation/
regex.rs1use std::borrow::Cow;
2use std::cell::OnceCell;
3use std::rc::Rc;
4use std::sync::{Arc, LazyLock, Mutex, OnceLock};
5
6use regex::Regex;
7
8pub trait AsRegex {
9 fn as_regex(&self) -> Cow<Regex>;
10}
11
12impl AsRegex for Regex {
13 fn as_regex(&self) -> Cow<Regex> {
14 Cow::Borrowed(self)
15 }
16}
17
18impl<T> AsRegex for &T
19where
20 T: AsRegex,
21{
22 fn as_regex(&self) -> Cow<Regex> {
23 T::as_regex(self)
24 }
25}
26
27impl AsRegex for &OnceLock<Regex> {
28 fn as_regex(&self) -> Cow<Regex> {
29 Cow::Borrowed(self.get().unwrap())
30 }
31}
32
33impl AsRegex for &Mutex<OnceCell<Regex>> {
34 fn as_regex(&self) -> Cow<Regex> {
35 Cow::Owned(self.lock().unwrap().get().unwrap().clone())
36 }
37}
38
39impl AsRegex for &Mutex<OnceLock<Regex>> {
40 fn as_regex(&self) -> Cow<Regex> {
41 Cow::Owned(self.lock().unwrap().get().unwrap().clone())
42 }
43}
44
45impl AsRegex for &Arc<Mutex<OnceCell<Regex>>> {
46 fn as_regex(&self) -> Cow<Regex> {
47 Cow::Owned(self.lock().unwrap().get().unwrap().clone())
48 }
49}
50
51impl AsRegex for &Arc<Mutex<OnceLock<Regex>>> {
52 fn as_regex(&self) -> Cow<Regex> {
53 Cow::Owned(self.lock().unwrap().get().unwrap().clone())
54 }
55}
56
57impl AsRegex for LazyLock<Regex> {
58 fn as_regex(&self) -> Cow<Regex> {
59 Cow::Borrowed(self)
60 }
61}
62
63pub trait ValidateRegex {
64 fn validate_regex(&self, regex: impl AsRegex) -> bool;
65}
66
67impl<T> ValidateRegex for &T
68where
69 T: ValidateRegex,
70{
71 fn validate_regex(&self, regex: impl AsRegex) -> bool {
72 T::validate_regex(self, regex)
73 }
74}
75
76impl<T> ValidateRegex for Option<T>
77where
78 T: ValidateRegex,
79{
80 fn validate_regex(&self, regex: impl AsRegex) -> bool {
81 if let Some(h) = self {
82 T::validate_regex(h, regex)
83 } else {
84 true
85 }
86 }
87}
88
89impl<'cow, T> ValidateRegex for Cow<'cow, T>
90where
91 T: ToOwned + ?Sized,
92 for<'a> &'a T: ValidateRegex,
93{
94 fn validate_regex(&self, regex: impl AsRegex) -> bool {
95 self.as_ref().validate_regex(regex)
96 }
97}
98
99impl ValidateRegex for String {
100 fn validate_regex(&self, regex: impl AsRegex) -> bool {
101 regex.as_regex().is_match(self)
102 }
103}
104
105impl ValidateRegex for &str {
106 fn validate_regex(&self, regex: impl AsRegex) -> bool {
107 regex.as_regex().is_match(self)
108 }
109}
110
111impl ValidateRegex for str {
112 fn validate_regex(&self, regex: impl AsRegex) -> bool {
113 regex.as_regex().is_match(self)
114 }
115}
116
117impl<T: ValidateRegex> ValidateRegex for Box<T> {
118 fn validate_regex(&self, regex: impl AsRegex) -> bool {
119 self.as_ref().validate_regex(regex)
120 }
121}
122
123impl<T: ValidateRegex> ValidateRegex for Rc<T> {
124 fn validate_regex(&self, regex: impl AsRegex) -> bool {
125 self.as_ref().validate_regex(regex)
126 }
127}
128
129impl<T: ValidateRegex> ValidateRegex for Arc<T> {
130 fn validate_regex(&self, regex: impl AsRegex) -> bool {
131 self.as_ref().validate_regex(regex)
132 }
133}