diff --git a/src/config.rs b/src/config.rs index 6d9d35a..c076280 100644 --- a/src/config.rs +++ b/src/config.rs @@ -12,7 +12,7 @@ use tracing::{error, info, instrument}; #[derive(Deserialize, Serialize, Debug)] #[serde(untagged)] pub enum DomainMatcher { - Regex(#[serde(with = "regex")] Regex), + Regex(#[serde(with = "crate::regex")] Regex), Exact(String), } @@ -125,48 +125,3 @@ pub async fn load() -> eyre::Result { }, } } - -mod regex { - use fancy_regex::Regex; - use serde::{de::Visitor, Deserializer, Serialize, Serializer}; - - pub fn deserialize<'de, D>(d: D) -> Result - where - D: Deserializer<'de>, - { - struct RegexVisitor; - impl Visitor<'_> for RegexVisitor { - type Value = Regex; - - fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(f, "a regex string starting and ending with slashes ('/')") - } - - fn visit_str(self, v: &str) -> Result - where - E: serde::de::Error, - { - let v = v - .strip_prefix('/') - .and_then(|v| v.strip_suffix('/')) - .ok_or(serde::de::Error::invalid_value( - serde::de::Unexpected::Str(v), - &self, - ))?; - - let regex = Regex::new(v); - - regex.map_err(|err| serde::de::Error::custom(err)) - } - } - - d.deserialize_string(RegexVisitor) - } - - pub fn serialize(value: &Regex, serializer: S) -> Result - where - S: Serializer, - { - value.as_str().serialize(serializer) - } -} diff --git a/src/main.rs b/src/main.rs index bb2a648..1332baf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ #![feature(let_chains, io_error_more)] mod config; +mod regex; mod update_repo; use std::sync::Arc; diff --git a/src/regex.rs b/src/regex.rs new file mode 100644 index 0000000..5b31c8f --- /dev/null +++ b/src/regex.rs @@ -0,0 +1,42 @@ +use fancy_regex::Regex; +use serde::{de::Visitor, Deserializer, Serialize, Serializer}; + +pub fn deserialize<'de, D>(d: D) -> Result +where + D: Deserializer<'de>, +{ + struct RegexVisitor; + impl Visitor<'_> for RegexVisitor { + type Value = Regex; + + fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(f, "a regex string starting and ending with slashes ('/')") + } + + fn visit_str(self, v: &str) -> Result + where + E: serde::de::Error, + { + let v = v + .strip_prefix('/') + .and_then(|v| v.strip_suffix('/')) + .ok_or(serde::de::Error::invalid_value( + serde::de::Unexpected::Str(v), + &self, + ))?; + + let regex = Regex::new(v); + + regex.map_err(|err| serde::de::Error::custom(err)) + } + } + + d.deserialize_string(RegexVisitor) +} + +pub fn serialize(value: &Regex, serializer: S) -> Result +where + S: Serializer, +{ + value.as_str().serialize(serializer) +}