Skip to main content

schematic/config/settings/
regex.rs

1use crate::schema::{Schema, SchemaBuilder, Schematic};
2use regex::{Error, Regex};
3use serde::{Deserialize, Serialize};
4use std::hash::{Hash, Hasher};
5use std::ops::Deref;
6use std::str::FromStr;
7
8#[derive(Clone, Debug, Deserialize, Serialize)]
9#[serde(try_from = "String", into = "String")]
10pub struct RegexSetting(pub Regex);
11
12impl RegexSetting {
13    pub fn new(value: impl AsRef<str>) -> Result<Self, Error> {
14        Ok(Self(Regex::new(value.as_ref())?))
15    }
16}
17
18impl Default for RegexSetting {
19    fn default() -> Self {
20        Self(Regex::new(".").unwrap())
21    }
22}
23
24impl Deref for RegexSetting {
25    type Target = Regex;
26
27    fn deref(&self) -> &Self::Target {
28        &self.0
29    }
30}
31
32impl FromStr for RegexSetting {
33    type Err = Error;
34
35    fn from_str(value: &str) -> Result<Self, Self::Err> {
36        Self::new(value)
37    }
38}
39
40impl TryFrom<&str> for RegexSetting {
41    type Error = Error;
42
43    fn try_from(value: &str) -> Result<Self, Self::Error> {
44        Self::new(value)
45    }
46}
47
48impl TryFrom<String> for RegexSetting {
49    type Error = Error;
50
51    fn try_from(value: String) -> Result<Self, Self::Error> {
52        Self::new(value)
53    }
54}
55
56#[allow(clippy::from_over_into)]
57impl Into<String> for RegexSetting {
58    fn into(self) -> String {
59        self.to_string()
60    }
61}
62
63impl PartialEq<RegexSetting> for RegexSetting {
64    fn eq(&self, other: &RegexSetting) -> bool {
65        self.as_str() == other.as_str()
66    }
67}
68
69impl Eq for RegexSetting {}
70
71impl Hash for RegexSetting {
72    fn hash<H: Hasher>(&self, state: &mut H) {
73        state.write(self.0.as_str().as_bytes());
74    }
75}
76
77impl Schematic for RegexSetting {
78    fn build_schema(_: SchemaBuilder) -> Schema {
79        SchemaBuilder::generate::<Regex>()
80    }
81}