use regex::Match;
use serde::{Deserialize, Serialize};
use crate::regex_wrapper::RegexWrapper;
use super::StandardEpisode;
#[derive(Serialize, Deserialize, Clone)]
pub struct Profile {
pub name: String,
pub search_prefix: Option<String>,
pub parse_regex: RegexWrapper,
pub relocate: Option<String>,
}
impl Profile {
pub fn parse_name<'s, 't>(&'s self, name: &'t str) -> Option<StandardEpisode> {
let mut out = StandardEpisode::default();
out.season = 1;
let captures = self.parse_regex.captures(name)?;
for name in self.parse_regex.capture_names().filter_map(|x| x) {
let value = match captures.name(name).as_ref().map(Match::as_str) {
Some(x) => x,
None => continue,
};
match name {
"title" => out.title = value.to_string(),
"season" => out.season = value.parse().ok()?,
"episode" => out.episode = value.parse().ok()?,
"checksum" => {
out.checksum = u32::from_le_bytes(hex::decode(value).ok()?.try_into().ok()?)
}
name => {
out.ext.insert(name.to_string(), value.to_string());
}
}
}
Some(out)
}
}