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}