validator/validation/
regex.rs1use std::borrow::Cow;
2use std::cell::OnceCell;
3use std::sync::{Arc, Mutex, OnceLock};
4
5use regex::Regex;
6
7pub trait AsRegex {
8 fn as_regex(&self) -> Cow<Regex>;
9}
10
11impl AsRegex for Regex {
12 fn as_regex(&self) -> Cow<Regex> {
13 Cow::Borrowed(self)
14 }
15}
16
17impl<T> AsRegex for &T
18 where T: AsRegex {
19 fn as_regex(&self) -> Cow<Regex> {
20 T::as_regex(self)
21 }
22}
23
24impl AsRegex for &OnceLock<Regex> {
25 fn as_regex(&self) -> Cow<Regex> {
26 Cow::Borrowed(self.get().unwrap())
27 }
28}
29
30impl AsRegex for &Mutex<OnceCell<Regex>> {
31 fn as_regex(&self) -> Cow<Regex> {
32 Cow::Owned(self.lock().unwrap().get().unwrap().clone())
33 }
34}
35
36impl AsRegex for &Mutex<OnceLock<Regex>> {
37 fn as_regex(&self) -> Cow<Regex> {
38 Cow::Owned(self.lock().unwrap().get().unwrap().clone())
39 }
40}
41
42impl AsRegex for &Arc<Mutex<OnceCell<Regex>>> {
43 fn as_regex(&self) -> Cow<Regex> {
44 Cow::Owned(self.lock().unwrap().get().unwrap().clone())
45 }
46}
47
48impl AsRegex for &Arc<Mutex<OnceLock<Regex>>> {
49 fn as_regex(&self) -> Cow<Regex> {
50 Cow::Owned(self.lock().unwrap().get().unwrap().clone())
51 }
52}
53
54pub trait ValidateRegex {
55 fn validate_regex(&self, regex: impl AsRegex) -> bool;
56}
57
58impl<T> ValidateRegex for &T
59 where T: ValidateRegex {
60 fn validate_regex(&self, regex: impl AsRegex) -> bool {
61 T::validate_regex(self, regex)
62 }
63}
64
65impl<T> ValidateRegex for Option<T>
66 where T: ValidateRegex {
67 fn validate_regex(&self, regex: impl AsRegex) -> bool {
68 if let Some(h) = self {
69 T::validate_regex(h, regex)
70 } else {
71 true
72 }
73 }
74}
75
76impl<'cow, T> ValidateRegex for Cow<'cow, T>
77 where T: ToOwned + ?Sized,
78 for<'a> &'a T: ValidateRegex
79{
80 fn validate_regex(&self, regex: impl AsRegex) -> bool {
81 self.as_ref().validate_regex(regex)
82 }
83}
84
85impl ValidateRegex for String {
86 fn validate_regex(&self, regex: impl AsRegex) -> bool {
87 regex.as_regex().is_match(self)
88 }
89}
90
91impl ValidateRegex for &str {
92 fn validate_regex(&self, regex: impl AsRegex) -> bool {
93 regex.as_regex().is_match(self)
94 }
95}