move regex module into its own file

This commit is contained in:
slonkazoid 2025-02-06 13:27:49 +03:00
parent 1d724b6972
commit b321024533
Signed by: slonk
SSH key fingerprint: SHA256:tbZfJX4IOvZ0LGWOWu5Ijo8jfMPi78TU7x1VoEeCIjM
3 changed files with 44 additions and 46 deletions

View file

@ -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<Config> {
},
}
}
mod regex {
use fancy_regex::Regex;
use serde::{de::Visitor, Deserializer, Serialize, Serializer};
pub fn deserialize<'de, D>(d: D) -> Result<Regex, D::Error>
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<E>(self, v: &str) -> Result<Self::Value, E>
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<S>(value: &Regex, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
value.as_str().serialize(serializer)
}
}

View file

@ -1,6 +1,7 @@
#![feature(let_chains, io_error_more)]
mod config;
mod regex;
mod update_repo;
use std::sync::Arc;

42
src/regex.rs Normal file
View file

@ -0,0 +1,42 @@
use fancy_regex::Regex;
use serde::{de::Visitor, Deserializer, Serialize, Serializer};
pub fn deserialize<'de, D>(d: D) -> Result<Regex, D::Error>
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<E>(self, v: &str) -> Result<Self::Value, E>
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<S>(value: &Regex, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
value.as_str().serialize(serializer)
}