move regex module into its own file
This commit is contained in:
parent
1d724b6972
commit
b321024533
3 changed files with 44 additions and 46 deletions
|
@ -12,7 +12,7 @@ use tracing::{error, info, instrument};
|
||||||
#[derive(Deserialize, Serialize, Debug)]
|
#[derive(Deserialize, Serialize, Debug)]
|
||||||
#[serde(untagged)]
|
#[serde(untagged)]
|
||||||
pub enum DomainMatcher {
|
pub enum DomainMatcher {
|
||||||
Regex(#[serde(with = "regex")] Regex),
|
Regex(#[serde(with = "crate::regex")] Regex),
|
||||||
Exact(String),
|
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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#![feature(let_chains, io_error_more)]
|
#![feature(let_chains, io_error_more)]
|
||||||
|
|
||||||
mod config;
|
mod config;
|
||||||
|
mod regex;
|
||||||
mod update_repo;
|
mod update_repo;
|
||||||
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
42
src/regex.rs
Normal file
42
src/regex.rs
Normal 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)
|
||||||
|
}
|
Loading…
Reference in a new issue