validator/validation/
regex.rs

1use 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}